![在 chroot 安装中构建 initramfs 时出现“cryptsetup:源不匹配”错误](https://linux22.com/image/919809/%E5%9C%A8%20chroot%20%E5%AE%89%E8%A3%85%E4%B8%AD%E6%9E%84%E5%BB%BA%20initramfs%20%E6%97%B6%E5%87%BA%E7%8E%B0%E2%80%9Ccryptsetup%EF%BC%9A%E6%BA%90%E4%B8%8D%E5%8C%B9%E9%85%8D%E2%80%9D%E9%94%99%E8%AF%AF.png)
最近我发现 cryptsetup 和 systemd 本身支持 veracrypt 卷的安装。
由于我寻求双启动完全加密安装,其中所有分区都可以被所有系统访问,并且据我所知无法从 Windows 读取 LUKS,因此我决定进入兔子洞,将 Ubuntu 手动安装到 veracrypt 卷。
到目前为止,我几乎完成了所有工作。我将 CD 附带的 squashfs 映像解压到根分区,进行了一些配置调整,然后得到:
- 带有 Lubuntu 的根文件系统
/dev/sdb5
(加密的 veracrypt 卷), - (未加密的 FAT32 分区)中的一个
/boot/efi
分区,/dev/sdb2
/home
位于/dev/sdb6
(另一个加密的 veracrypt 卷)内的共享文件夹
由于根分区和主分区都有相同的密码,因此我这样设置了 crypttab(据称密钥脚本 decrypt_keyctl 会短暂地缓存密码并将其传递给后续调用):
# <target name> <source device> <key file> <options>
ubunturoot /dev/sda5 /dev/null tcrypt,tcrypt-veracrypt,keyscript=decrypt_keyctl
sharedfiles /dev/sda6 /dev/null tcrypt,tcrypt-veracrypt,keyscript=decrypt_keyctl
为了挂载文件系统,我的fstab
配置如下:
#[Device] [Mount Point] [File System Type] [Options] [Dump] [Pass]
/dev/mapper/ubunturoot / ext4 defaults 0 1
/dev/mapper/sharedfiles /media/sharedfiles ntfs-3g defaults 0 2
/dev/sda2 /boot/efi fat32 defaults 0 2
/media/sharedfiles/Users /home none defaults,bind 0 2
(是的,我知道共享文件分区没有直接安装到/home
,这是预期的效果)
我已经使用 live CD chroot 到 fs,并确保将、、和mount -B
全部从 live CD 移到 chroot。/dev
/dev/pts
/sys
/proc
/run
我已经使用成功安装了 grub,grub-install
没有任何错误。但是,当尝试使用构建 initramfs 驻留/boot/efi
在
mkinitramfs -o /boot/efi/initramfs
我得到以下输出:
cryptsetup: ERROR: ubunturoot: Source mismatch
cryptsetup: WARNING: target 'ubunturoot_1' not found in /etc/crypttab
cryptsetup: WARNING: target 'ubunturoot_2' not found in /etc/crypttab
W: Possible missing firmware /lib/firmware/amdgpu/navi10_gpu_info.bin for module amdgpu
还有大约 10 行关于 AMD 固件的内容,我对此并不特别担心
E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.
我已经在互联网上查找了“源不匹配”行,但没有找到太多可以帮助我的东西。
我找到了最后一行提到的脚本,发现它需要另一个 initramfs 钩子,然后找到了有问题的行和周围的注释/usr/share/initramfs-tools/hooks/cryptroot
# crypttab_print_entry()
# Print an unmangled crypttab(5) entry to FD nr. 3, using CRYPTTAB_*
# and _CRYPTTAB_* values.
# _CRYPTTAB_SOURCE is replaced with /dev/mapper/$sourcename for mapped
# sources, otherwise by UUID=<uuid> if possible (eg, for LUKS). If
# the entry uses the 'decrypt_derived' keyscript, the other
# crypttab(5) entries it depends on are (recursively) printed before
# hand.
# Various checks are performed on the key and crypttab options, but no
# parsing is done so it's the responsibility of the caller to call
# crypttab_parse_options().
# Return 0 on success, 1 on error.
crypttab_print_entry() {
local DEV MAJ MIN sourcename uuid keyfile
if resolve_device "$CRYPTTAB_SOURCE"; then
if [ "$(dmsetup info -c --noheadings -o devnos_used -- "$CRYPTTAB_NAME" 2>/dev/null)" != "$MAJ:$MIN" ]; then
cryptsetup_message "ERROR: $CRYPTTAB_NAME: Source mismatch"
我尝试理解周围的脚本,但失败了。我几乎不明白有关安装加密 rootfs 的 initramfs 脚本为何会失败,但我无论如何也找不到原因。
我可以采取其他故障排除措施来阐明这一点吗?如果建议任何命令,我将运行它们并进行更新。
答案1
该脚本对配置文件(fstab 和 crypttab)进行交叉检查。此交叉检查是为了确保条目匹配,更具体地说,设备主设备号和次设备号匹配。
您可以运行以下命令来查看原始错误消息,其中 $CRYPTTAB_NAME 在本例中为“ubunturoot”。这是脚本当时正在运行的实际命令,但它会抑制错误。
dmsetup info -c --noheadings -o devnos_used -- "$CRYPTTAB_NAME"