我正在运行 Debian Jessie。我有 2 个硬盘,各个分区分布在两个硬盘上(不是 RAID)。它们都单独进行 LUKS 加密,LVM 位于它们之上。我的/boot
分区是唯一不包含在两个硬盘上的分区;相反,它位于未加密的 USB 记忆棒上。在/boot
分区上myKeyfile.key
应该解锁两个硬盘[但没有]。我的目标是当系统在没有 USB 记忆棒的情况下启动时,磁盘完全无法访问/无用。
以下是我为实现这一目标所做的工作。我用了这个答案StackOverflow 上作为指南。
/etc/default/cryptdisks
# Mountpoints to mount, before cryptsetup is invoked at initscripts. Takes
# mountpoints which are configured in /etc/fstab/ as arguments. Separate
# mountpoints by space.
# original: CRYPTDISKS_MOUNT=""
CRYPTDISKS_MOUNT=/boot
根据评论,我只需要确保我有正确的安装点名称,如 中所述fstab
。为了完整起见,以下是相关行:
/etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=<usb uuid> /boot ext4 defaults 0 2
/etc/crypttab
sda1_crypt UUID=<disk uuid> /boot/myKeyfile.key luks,keyscript=/bin/passphrase-from-usb
sda2_crypt UUID=<disk uuid> /boot/myKeyfile.key luks,keyscript=/bin/passphrase-from-usb
我可以指定 USB 驱动器的 UUID(而不是/boot/myKeyfile.key
),但随后我不确定如何指定myKeyfile.key
我感兴趣的文件。
/etc/initramfs-tools/hooks/passphrase-from-usb
#!/bin/sh
PREREQ=""
prereqs() {
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions
copy_exec /bin/passphrase-from-usb /bin
/bin/passphrase-from-usb
#!/bin/sh
set -e
if ! [ -e "$CRYPTTAB_KEY" ]; then
echo "Waiting for USB stick to be recognized..." >&2
sleep 5
fi
if [ -e "$CRYPTTAB_KEY" ]; then
echo "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME) from USB key" >&2
echo "Using $CRYPTTAB_KEY as the key source" >&2
dd if="$CRYPTTAB_KEY" bs=1 count=256 2>/dev/null
exit
else
echo "Can't find $CRYPTTAB_KEY; USB stick not present." >&2
fi
/lib/cryptsetup/askpass "Manually unlock the disk ($CRYPTTAB_NAME)\nEnter passphrase: "
这是我在启动时收到的欢迎信息:
Loading, please wait...
Volume group "vg-root" not found
Skipping volume group vg-root
Unable to find LVM volume vg-root/lv-root
Volume group "vg-other" not found
Skipping volume group vg-other
Unable to find LVM volume vg-other/lv-swap
Waiting for USB stick to be recognized...
[ 3.159979] sd 7:0:0:0: [sdd] No Caching mode page found
[ 3.160152] sd 7:0:0:0: [sdd] Assuming drive cache: write through
Can't find /boot/myKeyfile.key; USB stick not present.
Manually unlock the disk (sda1_crypt)
Enter passphrase:
输入密码后,第二个磁盘 会发生相同的交换sdb1_crypt
。
我做错了什么,但我不确定是什么。由于CRYPTDISKS_MOUNT
“指定在调用加密磁盘之前安装的安装点”,我认为添加/boot
它会/boot
在解锁过程开始之前可用。但是,运行时它似乎并未安装/bin/passphrase-from-usb
。
我确信它myKeyfile.key
已作为 LUKS 密钥添加到两个驱动器中,并且我已更新了initramfs
via update-initramfs -u
。
答案1
在启动过程中,initramfs 不会挂载 /boot。如果你想使用/boot中的文件,你可以手动挂载/boot。可以将以下命令添加到脚本 passphrase-from-usb 中。
mkdir -p /tmp-boot
mount <usb uuid> /tmp-boot -t ext4
dd if=/tmp-boot/myKeyfile.key bs=1 count=256 2>/dev/null
umount /tmp-boot
还有,这个http://wejn.org/how-to-make-passwordless-cryptsetup.html将会非常有帮助。