在 chroot 安装中构建 initramfs 时出现“cryptsetup:源不匹配”错误

在 chroot 安装中构建 initramfs 时出现“cryptsetup:源不匹配”错误

最近我发现 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"

相关内容