如何使用容器中的 gpt/mbr 分区表在 LUKS 容器中创建多个分区?

如何使用容器中的 gpt/mbr 分区表在 LUKS 容器中创建多个分区?

单个 LUKS 或 cryptsetup 容器中是否可以有多个分区?如果是这样,怎么办?

答案1

虽然我在网上没有找到任何描述这种设置的内容,但事实证明它工作正常。一些优点是您只需输入密码一次,并且可以调整分区大小的工具无需了解加密层即可工作。但是还有其他解决方案只需输入一次密码,并且 gnome 分区编辑器现在也可以移动/调整加密分区的大小,因此并不推荐这样做。另外,似乎没有人这样做,所以网上没有太多帮助。

如果你无论如何都想这样做:

  • 以您喜欢的任何方式创建 LUKS 加密卷并安装它。如果卷被命名,cryptvolume它将出现在/dev/mapper/cryptvolume.
  • 使用 GParted 打开卷:gparted /dev/mapper/cryptvolume 选择设备 > 创建分区表(或者,使用命令行工具创建分区表) 现在您可以按照您喜欢的方式在 GParted 中创建分区。
  • 如果您想在启动时自动挂载卷,请在/etc/crypttab和中创建行。/etc/fstab网上可能有关于如何做到这一点的描述,所以我不会在这里介绍。

原则上这应该足以拥有一个工作的多分区 LUKS 容器,并且在 Ubuntu 18.04 上这是可行的。除非重新启动时这会导致错误,因为 systemd 无法挂载加密分区。缺少的是在加密卷解密后没有任何信息告诉内核重新扫描分区表。执行此操作的命令是partprobe.在 systemd 系统上,要告诉系统在正确的时间运行 partprobe,请将以下文件放在/etc/systemd/system/partprobe.service.

将 替换cryptdisk1.mount为适合您的系统的安装点以及/dev/mapper/cryptdisk解密的 LUKS 设备的路径。

[Unit]
Description=partprobe after cryptsetup
# By default services depend on partitions being mounted. Leaving this out leads to cyclic dependencies.
DefaultDependencies=no
# We don't need to Requires=cryptsetup.target, as cryptsetup.target is always present
After=cryptsetup.target
# The mount target is named after the mount path.
# Run `systemctl list-dependencies local-fs.target` to list mount targets.
Before=cryptdisk1.mount

[Service]
Type=oneshot
# You don't have to specify the path to the decrypted device, but doing so will speed up the boot a bit
ExecStart=/sbin/partprobe /dev/mapper/cryptdisk

[Install]
# Required by local-fs.target or by all the partitions in the LUKS container to be more specific 
RequiredBy=cryptdisk1.mount

创建文件后运行sudo systemctl enable partprobe.service以启用该文件。

这已经在带有 GPT 分区的 Ubuntu 18.04 上进行了测试。在不同的系统上路径可能不同。对于非 systemd 系统,您需要在安装分区之前找到一种不同的方式来运行 partprobe。

答案2

无法让它与 4.19 内核和 LUKS 一起工作2格式。用户态可以读取/写入 /dev/mapper/${name} 上的 GPT,但是partprobe| partx| blockdev|hdparm所有这些都无法将内部 LUKS GPT 暴露给内核。

相关内容