我在 Ubuntu 13.04 上使用全盘加密(LUKS 之上的 LVM)。
我想将其纳入luksSuspend
暂停程序(并稍后使用luksResume
),以便我可以暂停到 RAM,而无需在内存中留下密钥材料并解锁根。
过去 7 个小时我一直在尝试移植Arch Linux 的脚本,到目前为止还没有成功:老实说,我不知道自己在做什么……
有人能帮我移植这个吗(或者从头开始创建类似的东西)?或者,至少,有人能给我提供一些文档,说明如何将内容挂接到挂起程序中,以及如何在所有到 root 的 IO 被阻止后仍保持必要的二进制文件和脚本(如 cryptsetup)可用luksSuspend
?
关于如何保持恢复所需的二进制文件和脚本,这其他博客文章(也适用于 Arch)将它们复制到/boot
;不过,我希望在 Vianney 之前我在脚本中提到的那些行中使用更多的东西,因为这种方法在这方面似乎更优雅一些。
答案1
我遇到了同样的问题,所以我再次尝试移植相同的脚本,你可以看到这里。它不会触及任何非易失性存储luksSuspend
,因此即使使用加密的 /boot 进行真正的全盘加密,它也能正常工作。但是,您需要小心——它有时可能无法按预期工作!
移植后的脚本执行以下操作:
- 在某处创建 ramfs 挂载
- 提取其中的 initramfs 内容(包括 initramfs 挂起脚本)
- 将相关目录(例如,,,
/sys
)绑定到ramfs挂载/proc
/dev
/run
- 停止任何可能干扰的服务(systemd-udevd、systemd-journald)
- 使用 nobarrier 重新挂载根文件系统(ext4 或 btrfs),以便 Linux 在尝试进入 S3 时不会挂起,然后同步
- Chroot 进入 initramfs 挂载,再次同步、运行
luksSuspend
,然后让计算机进入睡眠状态 - 唤醒后
luksResume
,重新挂载文件系统,重新启动服务,在 initramfs 挂载中卸载绑定挂载 - 最后,卸载 initramfs 挂载,以便释放用于 initramfs 文件的 RAM
我还没有对我的脚本进行广泛的测试,但它似乎对我来说很可靠。如果您使用其他文件系统(即不是 ext4 或 btrfs),那么您可能会遇到屏障问题,因此您也需要修改脚本。
不管怎样,最好先测试并验证脚本是否有效。如果您在尝试将 Linux 放入 S3(即echo mem > /sys/power/state
)时遇到挂起,那么您应该能够恢复:
- 暂停之前,打开 tty 或其他终端(可访问,最好是 tty)
- 将 cryptsetup 和相关库加载到 RAM 中:
sudo cryptsetup luksResume anything_here
- 使用脚本暂停
- 如果它在 chroot 之后挂起(例如
starting version xxx
在新的 vt 上显示 after),请切换到之前打开的 tty 并运行sudo cryptsetup luksResume your_luks_device_name_here
- 如果这也挂了,请打开另一个 vt 并 chroot 到
/run/initramfs
:sudo chroot /run/initramfs /bin/ash
- 尝试运行
luksResume
:cryptsetup luksResume your_luks_device_name_here && exit
- 然后您的计算机应该会暂停。然后您可以将其唤醒,如果脚本仍在运行,则将其终止,卸载绑定挂载和
/run/initramfs
,然后使用屏障(如果适用)重新挂载您的根文件系统。
答案2
我没有使用过这种设置,但许多人都声称这样做成功了。以下是其中几个。
dm-crypt 与 LUKS - 加密交换分区
如何使用 Ubuntu 6.10 Edgy Eft 完全加密硬盘(包括挂起到磁盘分区)
ubuntu-全盘加密-lvm-luks
但是它们都没有使用 luksSuspend(这可能是它们能起作用的原因)。
答案3
我花了一些时间让它在 Ubuntu 15.10 上完全发挥作用。如果您尝试在 ext2、ext3 或 ext4 上使其工作,则需要更新 /etc/fstab 以使用“nobarrier”选项挂载卷。否则,我建议使用 BTRFS。
准备好文件系统后,请使用此处的脚本:https://github.com/Microcentillion/ubuntu-lukssuspend