我最近安装了 Ubuntu 20.10 来测试 ZFS 文件系统和加密。我发现系统不仅使用原生的 ZFS 加密,还使用 LUKS 加密 ZFS 密钥(如果我错了,请纠正我)。
我想要实现的是在启动时使用密钥文件和密码解密 LUKS 容器。如果两者都不存在,则无法解密容器。另外,我想将密钥文件保存在外部设备上。虽然 LUKS 目前不提供这样的功能,但我发现将 LUKS 标头移动到外部设备是最接近我的问题的解决方案。然而,经过两天的努力,我仍然无法找出问题所在。
我按照以下步骤进行这回答。
全新安装 Ubuntu 20.10 后我采取的步骤:
- 将现有的 LUKS 标头复制到 USB 驱动器中
sudo cryptsetup luksHeaderBackup /dev/zd0 --header-backup-file=/dev/sdb
- 从 /dev/zd0 中删除现有的 LUKS 标头
sudo cryptsetup erase /dev/zd0
- 将以下条目添加到 /etc/crypttab
keystore-rpool /dev/zd0 none luks,header=/dev/sdb
- 应用更改
sudo update-initramfs -u -k all
完成所有这些操作后,在启动时输入 keystore-rpool 的正确密码总是无法解密卷。输入几次密码后,我被重定向到 initramfs,在那里我可以使用命令手动挂载卷
sudo cryptsetup open /dev/zd0 keystore-rpool –header=/dev/sdb
sudo mount /dev/mapper/keystore-rpool <somemountpoint>
我猜想 /etc/crypttab 中的条目可能有问题,但我不知道如何检查。我还对整个系统进行了 grep,以找出系统打开 LUKS 卷并映射到 /dev/mapper/keystore-rpool 的位置,以查看命令的具体内容,但什么也没找到。它发生在哪里?任何有关如何解决此问题的提示都会很有用。
答案1
我能够将 LUKS 标头移动到外部驱动器,但这是一种解决方法,而不是解决方案。
/usr/share/initramfs-tools/scripts/zfs
通过更改此行来修改文件
echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
对此
if [ $pool == "rpool" ]; then
echo "keystore-${pool} ${ks} none luks,header=/dev/disk/by-id/usb-Kingston_DataTraveler_3.0_08606E6D3FEFF351776C4F42-0:0" >> "${TABFILE}"
else
echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
fi
然后使用命令更新 initrd 映像
sudo update-initramfs -u