这个问题与另一个@Stefan 的提问,但这不是重复的。问题略有不同:作者只是想知道这是否已经实现,而我则寻求有关如何(以特定方式)实现此问题的帮助。此外,另一个问题没有得到对实施者有用的答案,除了最近的一个问题,它仅链接到我对此的尝试。
解释了“重复”问题之后……
我在 Ubuntu 14.04 上使用全盘加密(LUKS 之上的 LVM),我想将其纳入luksSuspend
挂起过程(并稍后使用luksResume
),以便我可以挂起到 RAM 而不会在内存中留下密钥材料并且根目录处于解锁状态。
我尝试过移植Arch Linux 的脚本,到目前为止还没有成功:老实说,我不知道自己在做什么……
有人能帮我移植这个吗(或者从头开始创建类似的东西)?或者,至少,有人能给我提供一些文档,说明如何将内容挂接到挂起程序中,以及如何在所有到 root 的 IO 被阻止后仍保持必要的二进制文件和脚本(如 cryptsetup)可用luksSuspend
?
关于如何保持恢复所需的二进制文件和脚本,这其他博客文章(也适用于 Arch)将它们复制到/boot
;不过,我希望在 Vianney 之前我在脚本中提到的那些行中使用更多的东西,因为这种方法在这方面似乎更优雅一些。
我还没有取得多大的成就,但我的发展可以在GitHub。
答案1
抱歉,说得太明显了,但你试过添加一个包含 cryptsetup luksSuspend/luksResume 命令的脚本吗/usr/lib/pm-utils/sleep.d
?如果试过,会发生什么?
在我看来,在休眠/恢复时调用停止/启动 cryptdisks 和 cryptdisks_early 服务也是合乎逻辑的。在脚本中调用 cryptdisks_stop 和 cryptdisks_start 能解决pm-utils/sleep.d
问题吗?我认为这与直接调用的结果相同cryptsetup luksSuspend
。
答案2
我能找到的最接近的解决方案是 Mikko Rauhala 在 2013 年编写的概念验证 suspend.sh 脚本。
#!/bin/sh
# A proof of concept script for forgetting LUKS passwords on suspend
# and reasking them on resume.
# The basic idea is to copy all of the files necessary for luksResume
# onto a RAM disk so that we can be sure they'll be available without
# touching the disk at all. Then switch to a text VT to run the resume
# (easier to make sure it'll come up than to do the same with X).
# The suspend itself has to be done from the ramdisk too to make sure it
# won't hang. This is also a reason why this couldn't be reliably done as a
# self-contained /etc/pm/sleep.d script, so to make the concept clear
# (and because I'm lazy) I did just a minimal standalone proof of concept
# instead. Integrating the functionality into the usual pm tools would be
# encouraged. (Though suspend_pmu would apparently need perl on the ramdisk...)
# (C) 2013 Mikko Rauhala 2013, modifiable and distributable under
# CC0, GPLv2 or later, MIT X11 license or 2-clause BSD. Regardless
# of what you pick, there is NO WARRANTY of any kind.
RAMDEV=/dev/ram0
ROOT=/run/cryptosuspend
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# Cleanup not strictly necessary every time but good for development.
# Doing it before rather than after a suspend for debugging purposes
for a in "$ROOT"/dev/pts "$ROOT"/proc "$ROOT"/sys "$ROOT" ; do
umount "$a" > /dev/null 2>&1
done
if mount | grep -q "$ROOT" ; then
echo "Cleanup unsuccessful, cryptosuspend root premounted." 1>&2
exit 2
fi
if grep -q mem /sys/power/state; then
METHOD=mem
elif grep -q standby /sys/power/state; then
METHOD=standby
else
echo "No mem or standby states available, aborting" 1>&2
exit 1
fi
if ! mount | grep -q "$RAMDEV" ; then
mkfs -t ext2 -q "$RAMDEV" 8192
mkdir -p "$ROOT"
mount "$RAMDEV" "$ROOT"
mkdir "$ROOT"/sbin "$ROOT"/bin "$ROOT"/dev "$ROOT"/tmp "$ROOT"/proc "$ROOT"/sys
cp "$(which cryptsetup)" "$ROOT"/sbin
for a in $(ldd "$(which cryptsetup)" | grep "/" | cut -d / -f 2- | cut -d " " -f 1) ; do
mkdir -p "$ROOT""$(dirname /$a)"
cp "/$a" "$ROOT"/"$a"
done
cp "$(which busybox)" "$ROOT"/bin/
ln -s busybox "$ROOT"/bin/sh
ln -s busybox "$ROOT"/bin/sync
cp -a /dev "$ROOT"
mount -t proc proc "$ROOT"/proc
mount -t sysfs sysfs "$ROOT"/sys
mount -t devpts devpts "$ROOT"/dev/pts
fi
CRYPTDEVS="$(dmsetup --target crypt status | cut -d : -f 1)"
echo '#!/bin/sh' > "$ROOT"/bin/cryptosuspend
echo "sync" >> "$ROOT"/bin/cryptosuspend
echo "for a in $CRYPTDEVS ; do" >> "$ROOT"/bin/cryptosuspend
echo " cryptsetup luksSuspend \$a" >> "$ROOT"/bin/cryptosuspend
echo "done" >> "$ROOT"/bin/cryptosuspend
echo "echo -n \"$METHOD\" > /sys/power/state" >> "$ROOT"/bin/cryptosuspend
echo "for a in $CRYPTDEVS ; do" >> "$ROOT"/bin/cryptosuspend
echo ' while ! cryptsetup luksResume'" \$a ; do" >> "$ROOT"/bin/cryptosuspend
echo " true" >> "$ROOT"/bin/cryptosuspend
echo " done" >> "$ROOT"/bin/cryptosuspend
echo "done" >> "$ROOT"/bin/cryptosuspend
chmod a+rx "$ROOT"/bin/cryptosuspend
sync
exec openvt -s chroot "$ROOT" /bin/cryptosuspend
已经完成了一些将其移植到 Ubuntu 14.04 的工作这里。这绝不是一个完美的解决方案,因为仍然存在一些开放式问题而且似乎自 2014 年 6 月 11 日以来就没有发布任何作品。然而,这似乎是未来发展的一个良好起点。