我正在设置一个加密的根文件系统,我之前已经这样做过,但这次我使用带有对称密码的 PGP 加密密钥文件来熟悉该过程。
有两个地方似乎会发生加密根的配置,在 和 下的内核 init 选项中cryptopts
,/etc/crypttab
这似乎用于mkinitramfs
将某些内容烘焙到 initramfs 中。
两个地方都更新有点麻烦;毕竟,如果一个地方就足够了,那么把它放在两个地方又有什么意义呢?我确实看到了将东西放入 中的价值/etc/crypttab
,因为如果存在 LUKS 卷,则可以使用不同的挂钩和脚本以不同的方式生成 initramfs。
使用之前针对此问题修正的示例,这是我的 crypttab:
picrypt /dev/mmcblk0p2 /boot/diskkey.gpg luks,keyscript=/lib/cryptsetup/scripts/decrypt_gnupg
据推测,这告诉 initramfs/dev/mmcblk0p2
应该解密以使用 name picrypt
,指定我们要使用luks
该文件并将其传递/boot/diskkey.gpg
给/lib/cryptsetup/scripts/decrypt_gnupg
脚本以生成卷的密码。
接下来,这是我的内核 init 行中的加密选项:
cryptopts=target=picrypt,source=/dev/mmcblk0p2,lvm=pi
再次,我们重新指定/dev/mmcblk0p2
create picrypt
,在这种情况下,我们还告诉它内部有一个名为 call 的 LVM 卷,pi
在尝试挂载内核参数指定的根文件系统之前,它应该等待该卷root=/dev/mapper/pi-root
。
奇怪的是,这个设置不起作用,因为它似乎忽略了 crypttab 的密钥文件和密钥脚本参数,并且不提示输入 GPG 对称密钥密码,而是直接输入密钥。我将修改我的脚本以包含keyscript
和,keyfile
但是cryptopts
为什么我必须这样做吗?
有没有一种方法可以将所有这些(或至少大部分)包含在内核初始化行中/etc/crypttab
,并且不重复内核初始化行中的所有内容?必须将所有内容更改两次,这有点荒谬。这些不同的源是否只是提供不同的功能,crypttab 以钩子的形式,cryptopts 以 cryptsetup 的实际参数的形式?
答案1
哇。我花了将近两天的时间才弄清楚这一切在 Debian/stretch 中是如何工作的(尽管我之前已经完成了这一切)。我偶然发现了你的问题,并保持开放状态来回答这个问题,以防我找到答案。
是的,有一个crypttab(5)
选项initramfs
正是您所要求的:
初始化文件系统
initramfs 挂钩处理根设备、任何恢复设备以及设置了“initramfs”选项的任何设备。这些设备在启动的 initramfs 阶段进行处理。例如,允许使用 dropbear 进行远程解锁。
(不管你信不信,我通过阅读一篇文章偶然发现了这个选项TODO文件在 cryptsetup 源中。)
所以你的crypttab
行应该是这样的:
picrypt /dev/mmcblk0p2 /boot/diskkey.gpg luks,keyscript=/lib/cryptsetup/scripts/decrypt_gnupg,initramfs
还有一件事:只有“当有需要在 initramfs 阶段解锁的设备(例如 root 或恢复设备)”时,cryptsetup 模块才会添加到 initramfs 映像中(请参阅:cryptroot-conf
钩;最近重命名只是conf-hook
)。但目前只有当根设备不在 LVM 中时,此方法才有效(可靠)。为了将 cryptsetup 模块强制到 initramfs 映像,我必须CRYPTSETUP=y
在/etc/cryptsetup-initramfs/conf-hook
.
无论如何,您必须update-initramfs -k all -u
在更改任何提到的文件后运行。