调整 LUKS 上 LVM 的大小
本文介绍了调整 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-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,其中包含 root 和 home 两个分区
# 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。就这么简单。