如何同時使用 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 檔案系統,插入卡時位於 /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,但您可以自行修改。