调整 LVM-on-LUKS 大小

出自 ArchWiki

本文或章节可能需要与 LVM#缩小 合并。

注意: 本操作指南仅聚合了来自其他文章的信息(因此是重复的),用于一个过于具体的情况:如果某些解释在此处更清晰,则应将其合并到 LVM#缩小 中,然后将关于 dm-crypt 的剩余少量包装部分合并到 Dm-crypt/Specialties 中,并链接到 LVM#缩小 以进行 LVM 大小调整。(在 Talk:Resizing LVM-on-LUKS 中讨论)

本文档遵循调整 LVM-on-LUKS-on-GPT 分区的过程。您也可以使用 GParted GUI 工具调整 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

启动和设置

启动到您的 live 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) in Bytes = 487814332416

调整卷大小。请注意大小值末尾附加的 "B" (Bytes)。此命令是安全的,因为如果新大小不适合所有现有盘区,它将提前退出

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

调整 LUKS 卷大小

要计算新的 LUKS 卷大小,请使用以下简单公式:NEW_LUKS_SECTOR_COUNT = PV_EXTENT_COUNT * PV_EXTENT_SIZE IN BYTES / 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 卷以离线调整大小。您可能需要停用 cryptdisk 上的 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

查看您当前的物理卷。在本例中,我们有一个加密设备 CryptDisk,其中包含一个卷组 CryptVolumeGroup,该卷组包含两个分区 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

通过将物理盘区 (PE) 总数乘以 PE 的大小,我们得到物理卷 (PV) 的总大小,在本例中为 118.75 GiB。虽然 pvdisplay 不显示空闲盘区,但我们可以扩大 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 末尾的空闲盘区。通过将空闲物理盘区乘以 PE 大小来计算大小差异 - 在本例中为 (60922-30399)*4 MiB = 119.2 GiB。

调整逻辑卷大小

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

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

请注意第二个逻辑卷的新大小。通过将逻辑盘区总数乘以 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。就这样。