跳转至内容

调整 LUKS 上 LVM 的大小

来自 ArchWiki

本文或本节是与 LVM#Shrinking 合并的候选内容。

注:本指南仅针对一个非常具体的情况汇总了来自其他文章的信息(因此存在重复):如果这里的某些解释更清晰,则应将其合并到 LVM#Shrinking 中,然后剩余的关于 dm-crypt 的少量包装部分应合并到 Dm-crypt/Specialties,并附带指向 LVM#Shrinking 的链接以进行 LVM 调整大小。(在 Talk:Resizing LVM-on-LUKS 中讨论)

本文介绍了调整 LVM-on-LUKS-on-GPT 分区大小的流程。您也可以使用 GParted 图形界面工具来调整 LUKS 分区大小,对于初学者来说,这可能更简单快捷。

方法

我们要操作的文件系统将具有以下结构

# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                   8:0    0 111.8G  0 disk
├─sda1                8:1    0    99M  0 part  /boot
└─sda2                8:2    0 111.7G  0 part
  └─vgroup          254:0    0 111.7G  0 crypt
    ├─vgroup-lvroot 254:1    0    30G  0 lvm   /
    └─vgroup-lvhome 254:2    0  81.7G  0 lvm   /home

目标是在不丢失任何数据的情况下,清理未使用的空间并创建新分区 sda3。所有文件系统均假定为 ext4

整个过程应在 Arch Live USB 系统中运行,以避免任何文件系统损坏。

过程

警告 请勿通过直接复制粘贴来运行任何代码,您需要根据自己的具体配置调整所有这些命令。
强烈建议在每一步之后通过检查文件系统、LVM 和/或 LUKS 卷的完整性来核对工作。
强烈建议写出确切的转换计划,以便在每一步都确切知道需要的分区大小。

缩小 LVM-on-LUKS

启动与设置

启动进入您的 USB 闪存安装介质

解密 LUKS 卷

# cryptsetup luksOpen /dev/sda2 cryptdisk

调整文件系统和 LVM 逻辑卷大小

请参考这些指令

您可以运行 fsck 以确保没有损坏

# e2fsck -f /dev/vgroup/lvhome

调整 LVM 物理卷大小

要计算新的 LVM 物理卷大小,请使用简单的公式:NEW_VOLUME_BYTES = PE_SIZE * PE_COUNT + UNUSABLE_SIZE

pvdisplay /dev/mapper/cryptdisk
...
PV Size               950.05 GiB / not usable 4.00 MiB
...
PE Size               4.00 MiB
...
Allocated PE          116303
...

使用上述公式:(116303 * 4 MiB + 4 MiB) 字节 = 487814332416

调整卷大小。注意尺寸值的末尾附加了 "B" (Bytes)。该命令是安全的,因为如果新尺寸无法容纳所有现有 extent,它将提前退出

# pvresize --setphysicalvolumesize 487814332416B /dev/mapper/cryptdisk

调整 LUKS 卷大小

要计算新的 LUKS 卷大小,请使用简单的公式:NEW_LUKS_SECTOR_COUNT = PV_EXTENT_COUNT * PV_EXTENT_SIZE (以字节为单位) / LUKS_SECTOR_SIZE

# pvdisplay /dev/mapper/cryptdisk
...
PV Size               454.31 GiB / not usable 3.00 MiB
...
PE Size               4.00 MiB
Total PE              116303
...
# cryptsetup status cryptdisk
...
sector size:  512
...
(116303 extents + 1 unusable extent) * 4194304 B/extent / 512 B/sector = 952762368 sectors

调整 LUKS 卷大小

# cryptsetup -b $NEW_LUKS_SECTOR_COUNT resize cryptdisk

调整分区大小

要计算新的分区大小,请使用简单公式:NEW_PARTITION_SECTOR_END = PARTITION_SECTOR_START + (LUKS_SIZE_SECTORS + LUKS_OFFSET_SECTORS) - 1- 1 是因为 parted 使用的是包含终点的扇区参数。

# cryptsetup status cryptdisk
...
offset:  4096 sectors
size:    952762368 sectors

关闭 LUKS 卷以进行离线调整。您可能需要停用加密盘上的 LVM 卷,否则无法关闭。

# vgchange -a n vgroup
# cryptsetup close cryptdisk

使用 parted 来调整分区大小

# parted /dev/sda
 (parted) unit
 Unit?  [compact]? s
 (parted) p
 ...
  2      8003584s  2000408575s  1992404992s

使用上述公式得出:8003584 + (952762368 + 4096) - 1 = 960770047

(parted) resizepart 2 960770047
 Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
 Yes/No? y
 (parted) q

此时您可以重新打开 LUKS 卷并重新挂载分区。如果您在上述步骤中手动停用了 LVM 分区,则需要手动重新激活它们。

# cryptsetup luksOpen /dev/sda2 cryptdisk
# vgchange -a y vgroup

扩大 LVM on LUKS

扩大 LVM-on-LUKS 逻辑分区(例如在迁移到更大的硬盘后)的操作方式相反——从最外层分区到最内层分区

primary partition(LUKS device{volume group[(logical partition1)(logical partition2-->)]})

准备工作

在新硬盘上创建所需大小的新分区(例如使用 GNU Parted),并将包含 LUKS 容器的旧分区 sdX1 克隆到新分区 sdY1

# dd if=/dev/sdX1 of=/dev/sdY1 bs=4M

扩展加密设备的物理段

现在,在新硬盘上打开加密设备 CryptDisk

# cryptsetup open /dev/sdY1 CryptDisk

查看当前的物理卷。在本例中,我们有一个包含卷组 CryptVolumeGroup 的加密设备 CryptDisk,其中包含 roothome 两个分区

# pvdisplay -m
 --- Physical volume ---
 PV Name               /dev/mapper/CryptDisk
 VG Name               CryptVolumeGroup
 PV Size               <118.75 GiB / not usable 3.00 MiB
 Allocatable           yes (but full)
 PE Size               4.00 MiB
 Total PE              30399
 Free PE               0
 Allocated PE          30399
 PV UUID               hu0iA9-i8fv-2SC1-C6ys-LQCz-sptQ-RSOUE5

 --- Physical Segments ---
 Physical extent 0 to 6399:
   Logical volume      /dev/CryptVolumeGroup/root
   Logical extents     0 to 6399
 Physical extent 6400 to 30398:
   Logical volume      /dev/CryptVolumeGroup/home
   Logical extents     0 to 23998

通过将总物理 extent (PE) 数乘以 PE 大小,我们可以得到物理卷 (PV) 的总大小,本例中为 118.75 GiB。虽然 pvdisplay 没有显示空闲 extent,但我们可以扩大 PV 以使用分区所有可用剩余空间

# pvresize /dev/mapper/CryptDisk

现在我们得到了

# pvdisplay -m
...
 --- Physical Segments ---
 Physical extent 0 to 6399:
   Logical volume      /dev/CryptVolumeGroup/root
   Logical extents     0 to 6399
 Physical extent 6400 to 30398:
   Logical volume      /dev/CryptVolumeGroup/home
   Logical extents     0 to 23998
 Physical extent 30399 to 60922:
   FREE

注意 PV 末尾的空闲 extent。通过将空闲物理 extent 数乘以 PE 大小来计算尺寸差——在本例中 (60922-30399)*4 MiB = 119.2 GiB。

调整逻辑卷大小

现在我们将调整第二个逻辑卷 (LV) 的大小(在本例中包含 /home 分区),调整量为空闲物理 extent 的大小减去一定的安全空间

# lvresize -L +119G /dev/CryptVolumeGroup/home

注意第二个逻辑卷的新尺寸。通过将总逻辑 extent 数乘以 PE 大小来计算其总尺寸——在本例中 53438 * 4 MiB = 208.7 GiB

# pvdisplay -m
...
 --- Physical Segments ---
 Physical extent 0 to 6399:
   Logical volume      /dev/CryptVolumeGroup/root
   Logical extents     0 to 6399
 Physical extent 6400 to 59838:
   Logical volume      /dev/CryptVolumeGroup/home
   Logical extents     0 to 53438
 Physical extent 59839 to 60922:
   FREE

调整加密卷大小

现在我们将调整加密卷本身的大小。考虑到逻辑卷的总尺寸减去一定的安全空间

# resize2fs -p /dev/CryptVolumeGroup/Home 208G

如果要求,请执行 e2fsck。就这么简单。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.