![如何使用容器中的 gpt/mbr 分区表在 LUKS 容器中创建多个分区?](https://linux22.com/image/142297/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%AE%B9%E5%99%A8%E4%B8%AD%E7%9A%84%20gpt%2Fmbr%20%E5%88%86%E5%8C%BA%E8%A1%A8%E5%9C%A8%20LUKS%20%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%A4%9A%E4%B8%AA%E5%88%86%E5%8C%BA%EF%BC%9F.png)
单个 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 暴露给内核。