如果 LUKS 不存储分区大小,“cryptsetup resize”会做什么?

如果 LUKS 不存储分区大小,“cryptsetup resize”会做什么?

LUKS/ dm-crypt/cryptsetup 常见问题页面说:

2.15 我可以调整 dm-crypt 或 LUKS 分区的大小吗?

是的,您可以,因为 dm-crypt 和 LUKS 都不存储分区大小。

我一头雾水:

  1. 如果没有存储尺寸信息,什么是“调整大小”?

  2. 如何在打开/关闭加密卷时记住“调整大小”?

答案1

是关于在线的调整大小。

例如,如果您使用 LVM,创建一个 1G 大小的 LV,并在其上放置 LUKS,则如下所示:

# lvcreate -L1G -n test VG
# cryptsetup luksFormat /dev/mapper/VG-test
# cryptsetup luksOpen /dev/mapper/VG-test lukstest
# blockdev --getsize64 /dev/mapper/VG-test
1073741824
# blockdev --getsize64 /dev/mapper/lukstest
1071644672

因此,LUKS 设备的大小与 VG 测试设备的大小大致相同(1G 减去 LUKS 标头使用的 2MiB)。

现在,当你增大 LV 时会发生什么?

# lvresize -L+1G /dev/mapper/VG-test
  Size of logical volume VG/test changed from 1.00 GiB (16 extents) to 2.00 GiB (32 extents).
  Logical volume test successfully resized.
# blockdev --getsize64 /dev/mapper/VG-test
2147483648
# blockdev --getsize64 /dev/mapper/lukstest
1071644672

LV 现在是 2G 大,但 LUKS 设备仍然停留在 1G,因为这是它最初打开的大小。

一旦你luksCloseluksOpen,它也将是 2G - 因为 LUKS 不存储大小,它默认为你打开它时的设备大小。因此,关闭和打开(或简单地重新启动)会将 crypt 映射更新为新的设备大小。但是,由于您只能在卸载/停止容器内的所有内容后才能关闭容器,因此这基本上是一个离线调整大小

但也许您在 LUKS 上安装了一个文件系统,它正在使用中,并且您不想为了调整大小而卸载它,这就是cryptsetup resize作为一个文件系统出现的地方在线的调整大小操作。

# cryptsetup resize /dev/mapper/lukstest
# blockdev --getsize64 /dev/mapper/lukstest
2145386496

cryptsetup resize将活动的 crypt 映射更新为新的设备大小,无需卸载,然后您可以跟进它resize2fs或以其他方式在线扩展已安装的文件系统本身。

如果您不介意重新启动或重新安装,则永远不需要,cryptsetup resize因为它会自动离线。但如果你想做的话在线的,这是唯一的办法。


缩小 ( cryptsetup resize --size x) 时,调整大小是暂时的。 LUKS 不存储设备大小,因此下次 luksOpen 时,它将再次使用设备大小。因此,只有当支撑装置也相应收缩时,收缩才会起作用。

为了成功收缩,你必须向后工作......增长是首先增长分区,然后是 LUKS,然后是文件系统......收缩是首先收缩文件系统,最后是分区。


如果调整大小不起作用,很可能是由于未调整支持设备的大小,例如,在使用驱动器时,内核可能会拒绝对分区表进行更改。与 blockdev 检查所有设备层是否具有您期望的大小。

相关内容