最大程度地缩小 LVM PV 和 LUKS 容器/分区

最大程度地缩小 LVM PV 和 LUKS 容器/分区

我想swap从当前的 LUKS 容器中删除我的 LVM LV,并使其不加密。

我想避免像gparted控制过程中的每一步这样的事情。

  1. lvremove在 LV上完成操作swappvmove获得连续的 PV 范围后,如何计算出要传递到的最小大小pvresize

  2. 鉴于现在缩小的 PV,我如何计算出 LUKS 容器应包含多少个扇区或 MiB,以便我可以缩小 LUKS 分区以匹配?

  3. 我是否正确地认为 LUKS 容器没有长度,并且通过简单地缩小分区来缩小?

  4. 有没有办法在 LVM 级别检查 PV 的最终范围仍然可以访问,即它们确实位于缩小的分区的可寻址扇区内?

答案1

1.)

从手册页:

pvresize 如果物理卷在其新结束位置之后分配了扩展区,则将拒绝收缩物理卷。

所以你可以通过反复试验来做到这一点。其实pvresize会告诉你一部分:

/dev/dm-7: cannot resize to 17564 extents as 18620 are allocated.

要确定确切的大小,您需要知道 PE 大小(例如 4MiB)和第一个 PE 偏移量(例如 1MiB)。当然还有最后分配的盘区的编号。

pvs -o pv_name,pe_start,vg_extent_size,seg_pe_ranges

因此,总大小可能是 1MiB(第一个 PE)+ 18620 * 4MiB(PE 大小)。

2.)

您需要知道 LUKS 标头大小/数据偏移量。通常这是 4096 个扇区,即 2MiB。请检查cryptsetup luksDump, Payload offset

因此,您的新分区大小是 LUKS 有效负载偏移量加上您将 PV 本身调整到的大小。

3.)

是的,也不是。 LUKS 不会在其元数据中保留大小,因此如果您要关闭 LUKS 容器,甚至重新启动,那么它只会使用块设备本身的大小。

但对于在线调整大小,您需要使用cryptsetup resize, 将其设置为您在 中使用的任何大小pvresize

4.)

有时,我会通过将有问题的设备以只读模式传递给 qemu/KVM 实例,运行一些 Linux 救援系统来实现这一点。很难检查主机(例如,使用只读循环设备),因为 LVM 不喜欢看到重复的 PV UUID 或 VG/LV 名称。如果 PV 小于预期,LVM 将拒绝激活。

答案2

考虑pvshrink它完成了大部分计算霜舒兹的回答,并且有一个--test不做任何改变的模式。

相关内容