如何一起使用 dm-crypt 和 swsusp¶
作者:Andreas Steinmetz <ast@domdv.de>
一些前提条件:您了解 dm-crypt 的工作原理。如果不是,请访问以下网页: http://www.saout.de/misc/dm-crypt/ 您已经阅读了 交换挂起 并理解了它。您阅读了 使用初始 RAM 磁盘 (initrd) 并了解 initrd 的工作原理。您知道如何创建或修改 initrd。
现在,您的系统已正确设置,您的磁盘已加密,除了交换设备和引导分区(可能包含用于加密设置和/或救援目的的迷你系统)。您甚至可能已经有一个 initrd 执行了当前的加密设置。
此时,您也想加密您的交换分区。您仍然希望能够使用 swsusp 进行挂起。但是,这意味着您必须能够在恢复之前输入密码,或者从外部设备(如 pcmcia 闪存盘或 usb 闪存盘)读取密钥。因此,您需要一个 initrd,它设置 dm-crypt,然后请求 swsusp 从加密的交换设备恢复。
最重要的事情是您设置 dm-crypt 的方式,以便您挂起/恢复的交换设备在 initrd 以及您运行的系统中始终具有相同的主/次设备号。实现此目的的最简单方法是始终使用 dmsetup 首先设置此交换设备,使其始终如下所示
brw------- 1 root root 254, 0 Jul 28 13:37 /dev/mapper/swap0
现在,设置您的内核以使用 /dev/mapper/swap0 作为默认的恢复分区,因此您的内核 .config 包含
CONFIG_PM_STD_PARTITION="/dev/mapper/swap0"
准备您的引导加载程序以使用您将要创建或修改的 initrd。对于 lilo,最简单的设置如下所示
image=/boot/vmlinuz
initrd=/boot/initrd.gz
label=linux
append="root=/dev/ram0 init=/linuxrc rw"
最后,您需要创建或修改您的 initrd。假设您创建一个 initrd,它从 pcmcia 闪存盘卡读取所需的 dm-crypt 设置。该卡使用 ext2 fs 格式化,当插入卡时,它位于 /dev/hde1 上。该卡至少在名为 “swapkey” 的文件中包含加密的交换设置。您的 initrd 的 /etc/fstab 包含如下内容
/dev/hda1 /mnt ext3 ro 0 0
none /proc proc defaults,noatime,nodiratime 0 0
none /sys sysfs defaults,noatime,nodiratime 0 0
/dev/hda1 包含一个未加密的迷你系统,该系统再次通过从 pcmcia 闪存盘读取设置来设置所有加密设备。接下来是您的 initrd 的 /linuxrc,它允许您从加密的交换分区恢复,并且如果未发生恢复,则继续从 /dev/hda1 上的迷你系统启动
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
mount /proc
mount /sys
mapped=0
noresume=`grep -c noresume /proc/cmdline`
if [ "$*" != "" ]
then
noresume=1
fi
dmesg -n 1
/sbin/cardmgr -q
for i in 1 2 3 4 5 6 7 8 9 0
do
if [ -f /proc/ide/hde/media ]
then
usleep 500000
mount -t ext2 -o ro /dev/hde1 /mnt
if [ -f /mnt/swapkey ]
then
dmsetup create swap0 /mnt/swapkey > /dev/null 2>&1 && mapped=1
fi
umount /mnt
break
fi
usleep 500000
done
killproc /sbin/cardmgr
dmesg -n 6
if [ $mapped = 1 ]
then
if [ $noresume != 0 ]
then
mkswap /dev/mapper/swap0 > /dev/null 2>&1
fi
echo 254:0 > /sys/power/resume
dmsetup remove swap0
fi
umount /sys
mount /mnt
umount /proc
cd /mnt
pivot_root . mnt
mount /proc
umount -l /mnt
umount /proc
exec chroot . /sbin/init $* < dev/console > dev/console 2>&1
请不要介意上面的奇怪循环,busybox 的 msh 不知道 let 语句。现在,脚本中发生了什么?首先,我们必须决定是否要尝试恢复。如果使用 “noresume” 或任何用于 init 的参数(如 “single” 或 “emergency”)作为启动参数,我们将不会恢复。
然后,我们需要使用 pcmcia 闪存盘中的设置数据设置 dmcrypt。如果成功,我们不需要恢复,则需要重置交换设备。“echo 254:0 > /sys/power/resume” 行尝试从第一个设备映射器设备恢复。请注意,无论是否恢复,都必须在 /sys/power/resume 中设置设备,否则稍后的挂起将会失败。如果恢复开始,脚本执行将在此处终止。
否则,我们只需删除加密的交换设备,并将其留给 /dev/hda1 上的迷你系统来设置整个加密(您可以根据自己的喜好修改)。
接下来是众所周知的更改根文件系统并从那里继续启动的过程。我倾向于在继续启动之前卸载 initrd,但这由您决定是否修改。