我正在使用 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
这种方法行不通,原因有二:
- 与链接的答案所建议的相反(即按照 crypttab 条目的顺序向用户查询分区),每次启动时的顺序是随机的。即使我可以在打开根后自动打开交换分区,如果交换首先出现,那么我仍然被迫输入根的密码,因为密钥文件位于根上。
- 在我看来,输入 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
联机帮助页还明确提到了密码缓存,因此打开它们的顺序对您来说并不重要。
以防万一:如果您不使用休眠/恢复,您也可以使用随机密钥加密交换分区。