使用 systemd 通过只输入一次密码来解锁跨越两个 LUKS 设备的根文件系统的正确方法是什么?

pip*_*ipe 5 systemd btrfs luks root-filesystem

我遇到了很多问题,让加密的多磁盘根文件系统在 Debian Jessie 上的 systemd 下可靠启动,而只需输入一次密码。以前,我在 Debian 中通过使用decrypt_derived/etc/crypttab 中的keyscript 为除第一个设备之外的每个设备处理此问题,并且效果很好。

但是,当引入 systemd 时,这并不能很好地发挥作用。systemd-cryptsetup-generator不处理密钥脚本,并且在尝试查找有关如何解决此问题的更多信息时,我仅在其中一位 systemd 开发人员的电子邮件中发现了对某些自定义密码代理的模糊引用,该电子邮件仅给出了“易于编写”的无用建议其他代理。要遵循的基本算法如下所示”,然后是要采取的 13 个步骤的列表。显然不适合最终用户。

我是 Debian,通过使用几个内核选项告诉 systemd/etc/crypttab在引导期间忽略或完全忽略它,我已经让它在某种程度上工作。Debianupdate-initramfs会将密钥脚本复制到 initramfs 并在 systemd 接管之前解锁设备,但我发现它稍后会导致问题,因为 systemd 现在没有用于解密设备的任何单元文件,因此依赖它们的挂载有时似乎挂起或延迟。一个中断的地方是尝试挂载 btrfs 子卷时;它们是从与 root 相同的物理设备挂载的,但 systemd 不知道这些设备已经解锁,并在启动时停止。

TL; DR - 我的实际问题:

处理跨越多个设备(无论是 btrfs 系统、LVM 镜像等)的加密根文件系统的 systemd 方法是什么,您只需要输入一次密码?我几乎不认为这是一个非常不寻常的案例,因此希望有一种方法可以做到这一点。

想到了一些可能的解决方案:

  • 包含密钥文件的微小加密分区,在 root 之前解锁。根设备将引用此密钥文件。我该如何告诉 systemd?
  • 在 initramfs 中运行的某种缓存密码代理,它记住密码并在启动时将其交给所有需要它的设备。
  • 有人已经编写了一个模拟解密派生的 systemd 代理。我将如何将其集成到我的启动过程中?

我确实只运行 Debian,但是在尝试了几天来为我的问题找到解决方案之后,我觉得这可能是一个更广泛的系统问题。

Dia*_*gon 1

现在这个问题有一个解决方案(至少在 Ubuntu 18.04+ 中,所以我假设是 Debian 和 CentOS-7)。描述在这里。引用:

Systemd ...将解锁所有附加的 LUKS 分区,如果

  1. 您要解锁的所有分区都使用相同的密码
  2. 第一次输入正确的根分区密码。如果输入错误,则需要为每个其他 LUKS 分区重新输入