以下是我遇到的一些问题:
>设置密码并将其放在USB驱动器上.
>及时加载USB模块.
>等待USB驱动器被Linux识别,然后再尝试读取它.
>识别正确的USB驱动器(不是其他正在插入的驱动器).
写一个“keyscript”来从USB驱动器上拉一个密码.
>确保在所有USB故障情况下退回键盘.
我将接受一个重大改进的答案,并提供提供贡献的upvote答案.
解决方法
>创建随机密码:
dd if=/dev/urandom bs=1 count=256 > passphrase
>插入USB驱动器. dmesg输出将显示设备名称;假设/ dev / sdd.找出它的大小:
blockdev --getsize64 /dev/sdd
>我决定在原始设备的末端安装密码,认为可能会偶然使用USB驱动器.
dd if=passphrase of=/dev/sdd bs=1 seek=<size-256>
>将密码添加到LUKS卷:
cryptsetup luksAddKey /dev/sda5 passphrase
rm passphrase
>找到一个独特的名称为U盘,所以我们可以确定它当时:
ls -l /dev/disk/by-id | grep -w sdd
你应该看到一个符号链接.我将其称为/ dev / disk / by-id /< ID> ;.
>编辑/ etc / crypttab.你应该看到一行如下:
sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 none luks
修改为:
sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 /dev/disk/by-id/<ID> luks,keyscript=/bin/passphrase-from-usb
>上面提及的键盘需要从USB设备读取密码.但是,它需要做的更多.要了解如何使用它,请检查/usr/share / initramfs-tools / scripts / local-top / cryptroot,这是在引导时运行以解锁根设备的脚本.注意当一个keyscript设置,它只是运行,输出管道到luksOpen没有其他检查.没有办法发出错误(USB驱动器不存在)或回退到键盘输入.如果密码失败,则键盘会循环运行,直到一段时间;然而,我们没有被告知我们正在进行哪些迭代.此外,我们无法控制keyscript的运行时间,所以我们无法确定Linux已经识别了USB驱动器.
我用一些黑客解决了这个问题:
>在USB驱动器上进行轮询,等待3秒钟才能显示.这对我来说很有用,但我很想知道一个更好的方法.
>创建一个虚拟文件/ passphrase-from-usb -i尝试在第一次运行,以表明我们已经运行了至少一次.
>如果至少运行了一次,或者找不到USB驱动器,请运行cryptroot使用的askpass程序进行键盘输入.
最后的脚本:
#!/bin/sh set -e if ! [ -e /passphrase-from-usb-tried ]; then touch /passphrase-from-usb-tried if ! [ -e "$CRYPTTAB_KEY" ]; then echo "Waiting for USB stick to be recognized..." >&2 sleep 3 fi if [ -e "$CRYPTTAB_KEY" ]; then echo "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME) from USB key" >&2 dd if="$CRYPTTAB_KEY" bs=1 skip=129498880 count=256 2>/dev/null exit else echo "Can't find $CRYPTTAB_KEY; USB stick not present?" >&2 fi fi /lib/cryptsetup/askpass "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME)\nEnter passphrase: "
最后,我们需要确保该脚本在initramfs中可用.创建/ 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
>我的initramfs中没有USB驱动程序. (在Debian的更新版本中,它们默认是默认的).我不得不通过添加到/ etc / initramfs-tools / modules来添加它们:
uhci_hcd ehci_hcd usb_storage
>完成所有操作后,更新initramfs:
update-initramfs -u