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

Tom*_*ale 12 dm-crypt luks cryptsetup volume device-mapper

LUKS/ dm-crypt/ cryptsetup FAQ页面说:

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

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

我一头雾水:

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

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

fro*_*utz 17

这是关于在线调整大小。

举个例子,如果你使用 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
Run Code Online (Sandbox Code Playgroud)

因此,LUKS 设备与 VG 测试设备的大小大致相同(LUKS 标头使用的 1G 减去 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
Run Code Online (Sandbox Code Playgroud)

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

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

但是,也许你已经装载的文件系统上的陆氏,它在使用,而且你不想卸除了调整大小,而这也正是cryptsetup resize来自于为在线调整操作。

# cryptsetup resize /dev/mapper/lukstest
# blockdev --getsize64 /dev/mapper/lukstest
2145386496
Run Code Online (Sandbox Code Playgroud)

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

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


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

对于成功的收缩,您必须向后工作......增长是首先增长分区,然后是LUKS,然后是文件系统......收缩是首先收缩文件系统,最后是分区。


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