如何使用一个密码打开所有 LUKS 卷?

如何使用一个密码打开所有 LUKS 卷?

我正在使用 EndeavorOS(基本上是 Arch),但使用 systemd-boot 和 dracut 作为 initrd。我有一个简单的设置,其中包含未加密的启动分区以及 LUKS 加密的根分区和交换分区。具体来说,设置在下面的输出中进行了描述:

$ cat /etc/fstab
# <file system>             <mount point>  <type>  <options>  <dump>  <pass>
UUID=8A2F-4076                            /efi           vfat    defaults,noatime 0 2
/dev/mapper/luks-81733cbe-81f5-4506-8369-1c9b62e7d6be /              ext4    defaults,noatime 0 1
/dev/mapper/luks-9715a3f9-f701-47b8-9b55-5143ca88dcd8 swap           swap    defaults   0 0
tmpfs                                     /tmp           tmpfs   defaults,noatime,mode=1777 0 0

$ lsblk -f
NAME                                          FSTYPE      FSVER LABEL       UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1                                                                                                                         
├─nvme0n1p1                                   vfat        FAT32             8A2F-4076                             915.6M     8% /efi
├─nvme0n1p2                                   crypto_LUKS 1                 81733cbe-81f5-4506-8369-1c9b62e7d6be                
│ └─luks-81733cbe-81f5-4506-8369-1c9b62e7d6be ext4        1.0   endeavouros d8d14c59-8704-4fb8-ad02-7d20a26bc1e1  843.6G     2% /
└─nvme0n1p3                                   crypto_LUKS 1                 9715a3f9-f701-47b8-9b55-5143ca88dcd8                
  └─luks-9715a3f9-f701-47b8-9b55-5143ca88dcd8 swap        1     swap        b003ea64-a38d-464c-8609-7278e21f8a0f                [SWAP]

问题是每次启动计算机时,我都需要输入两次密码;一次用于根分区,一次用于交换分区(请注意,如果有帮助的话,我对两个分区使用相同的密码)。这已经变得很麻烦。所以我的问题是:有没有办法在成功输入根分区密码后自动解密交换分区?

有一个与此非常相似的问题一个明智的答案,但没有成功。答案的第一部分是以 Debian 为中心的,具有其他发行版中不存在的脚本选项。第二部分使用 crypttab 指定用于解密其他分区的密钥文件的位置。

到目前为止,我在 initrd 中的 crypttab 看起来像这样,它指定/crypto_keyfile.bin根分区中存在的 来打开任一分区:

$ lsinitrd --file /etc/crypttab
luks-81733cbe-81f5-4506-8369-1c9b62e7d6be /dev/disk/by-uuid/81733cbe-81f5-4506-8369-1c9b62e7d6be /crypto_keyfile.bin luks
luks-9715a3f9-f701-47b8-9b55-5143ca88dcd8 /dev/disk/by-uuid/9715a3f9-f701-47b8-9b55-5143ca88dcd8 /crypto_keyfile.bin luks

这种方法行不通,原因有二:

  1. 与链接的答案所建议的相反(即按照 crypttab 条目的顺序向用户查询分区),每次启动时的顺序是随机的。即使我可以在打开根后自动打开交换分区,如果交换首先出现,那么我仍然被迫输入根的密码,因为密钥文件位于根上。
  2. 在我看来,输入 root 密码后,文件系统并没有立即挂载。实际上是/crypto_keyfile.bin在 initrd 文件系统中搜索的,这解释了日志中出现两次的以下错误:systemd-cryptsetup[460]: Failed to activate, key file '/crypto_keyfile.bin' missing.

因此,如果我走在正确的轨道上,我如何确保systemd-cryptsetup每次首先查询根分区,然后查询交换分区,以及如何确保在打开根分区后,文件系统被挂载并/crypto_keyfile.bin成功找到以打开交换分区?

否则,如果我在这里完全偏离轨道,有没有办法实现我想要的?

谢谢。

答案1

不是 Arch 专家,以 Debian 为中心的脚本在 Debian 上对我来说效果很好,但是根据这个维基百科页面应该,或者至少预计会起作用。

启动期间输入的密码由 systemd-cryptsetup(8) 缓存在内核密钥环中,因此如果可以使用相同的密码解锁多个设备(这包括 crypttab 中启动后解锁的设备),那么您只需要输入每个设备密码一次。

您的设置中似乎有问题的是,您将 crypttab 配置为使用根分区的密钥文件,而密钥文件存储在加密的根分区中。由于您不介意输入密码并为两者使用相同的密码,因此none在 crypttab 中设置为密钥文件可能会解决您的问题。

systemd-cryptsetup 联机帮助页还明确提到了密码缓存,因此打开它们的顺序对您来说并不重要。

以防万一:如果您不使用休眠/恢复,您也可以使用随机密钥加密交换分区。

相关内容