为什么使用 dd 复制 luks 标头会导致我正在读取的驱动器上出现错误?

为什么使用 dd 复制 luks 标头会导致我正在读取的驱动器上出现错误?

问题摘要。我想将分离的 luks 标头用于 luks 加密的块设备,/dev/nvme0n1p1方法是将其制作为 USB 闪存驱动器分区,然后擦除块设备标头上的密钥。我有有限的细节关于如何做到这一点,但我的计划是(1)将闪存驱动器分区的大小设置/dev/sda3为标头的大小。然后(2)使用dd if=/dev/nvme0n1p1 of=/dev/sda3 bs=4096 count=4096标头信息覆盖新分区上的空间。 (3) 将头文件输入到选项中/etc/crypttab并生成新的initramfs。我希望这会奏效。但是在我运行dd-command (尚未编辑 crypttab)之后,我尝试重建 initramfs,但收到以下错误:

$ update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-5.10.0-18-amd64
cryptsetup: ERROR: nvme0n1p1_crypt: Source mismatch
update-initramfs: Generating /boot/initrd.img-5.10.0-9-amd64
cryptsetup: ERROR: nvme0n1p1_crypt: Source mismatc

我的问题是:(1)为什么我会收到这些错误?我不明白为什么复制数据会导致我正在读取的文件系统出现错误。 (2) 如果不带dd.

详细信息和任何研究。 我搜索了谷歌和堆栈交换,看似最相关的是。当我运行命令时,我收到以下信息。

$ dmsetup info -c --noheadings -o devnos_used -- "nvme0n1p1_crypt"
259:1

还有这个指导我在上面链接的内容(在我看来)似乎表明我应该这样做。

答案1

当您提出必须更新 initramfs 和 crypttab 时,我认为这个加密的块设备是您系统引导过程的一部分?在这种情况下,如果您要直接从分区复制标头,则应卸载驱动器,这对于您从 USB 实时启动环境执行所有这些操作是理想的,这样就不会安装驱动器,特别是如果您要从中复制标头的分区是您的主系统。

假设这就是您正在做的事情,并且您当前正在从 USB Live 启动环境尝试执行此操作(这可以解释错误),请确保您已绑定安装了您尝试更新的系统的启动分区initramfs 作为chroot进入系统的一部分来更新它。

Buuuuuut ....应该注意的是,如果您还没有对 crypttab 进行更改,则不需要更新 initramfs,因此我不确定是否要向您提供可能不适用的解决方案。所以要备份一点...

如果您没有在 USB Live Boot 环境中尝试此操作,不用担心,只需按照选项 2 进行操作即可指导您最后链接的位置不是使用dd直接复制原始标头,而是可以使用cryptsetup将备份标头生成为文件,然后dd按照说明将文件写入您的 USB 闪存驱动器分区。

而我采用了他们的说明来满足您的需求,并添加了一些注释,以防出现任何不清楚的情况(并标识了以“$”开头的每个换行符,以表明它是新命令的开始:

 $ sudo -i
\\ just to ensure running everything below as root without a need to add sudo

$ mkdir /tmp/header_backup
$ mount -t tmpfs -o size=512m tmpfs /tmp/header_backup
\\ this user just took extra precaution by writing the backup header file to ramdisk
\\ which is unnecessary so u could just skip straight to the next step and designate
\\ somewhere normal like /home/USER/Documents if you wanted

$ cryptsetup luksHeaderBackup /dev/nvme0n1p1 --header-backup-file /tmp/header_backup/header.luks
$ dd if=/tmp/header_backup/header.luks of=/dev/sda3
$ umount /tmp/header_backup

\\ Then update crypttab, using your preferred text editor, here i use nano
\\ Here you're just appending the header option so if nvme0n1p1 is listed
\\ and shows as nvme0n1p1_crypt, then simply add it after the last option

$ nano /etc/crypttab

nvme0n1p1_crypt {UUID of /dev/nvme0n1p1} none luks,discard,header=/dev/sda3

\\ for nano, ctrl+x then Y then Enter & Enter again to exit and confirm saving
\\ At this point you're going to have 2 devices sharing the same UUID so
\\ you can address this by changing the one for the USB drive since it got
\\ changed when you copied the header to it, and saves you from updating fstab

$ cryptsetup luksUUID /dev/sda3 --uuid $(uuidgen)
\\ THEN you can run...

$ update-initramfs -u -k all

可以肯定的是,/dev/nvme0n1p1它是原始 LUKS 驱动器,也是/dev/sda3您要存储标头的 USB 驱动器分区。


现在,回顾一下您的问题:

我的问题是:(1)为什么我会收到这些错误?我不明白为什么复制数据会导致我正在读取的文件系统出现错误。

我可以想到两种可能性,具体取决于您运行这些命令的具体位置,例如,您当前是否从位于 的系统启动nvme0n1p1?或者从 USB-Live Boot 系统中进行更改,该系统与存储的系统完全分开nvme0n1p1?在前者中,在将标头写入该分区之前可能/dev/sda3没有卸载,这会在 USB 分区仍处于安装状态时更改其元数据,并在运行时混淆系统update-initramfs而不对实际启动文件设置进行任何更改,或者在后者中,您在运行之前没有正确地 chroot 到 nvme0n1p1 中的系统,update-initramfs因此它正在读取安装在 Live-Boot 中的启动驱动器,而不是您正在更新的系统。无论哪种情况,请记住 指crypttab的是分区的映射名称,因此其中的任何内容crypttab都应与您中显示的内容匹配,fstab因为fstab通过 UUID 安装驱动器而不是通过显示或使用的设备映射名称来安装驱动器crypttab

但是,再次记住,

(2)如果不使用dd,将标头写入闪存驱动器的正确方法是什么?

尽管还有其他方法可以编写它,但您这样做的方式是正确的,这可能只是您没有使用该命令执行的操作的问题(例如在写入分区之前卸载分区,或者如果直接写入)来自另一台设备,两个设备都已umount编辑)

如果有帮助,请按照您链接的最后一个指南(我修改了上面的命令)进行操作,请记住您的/dev/nvme0n1p1是他们的,您的答案中的/dev/sda4您的/dev/sda3也是他们的。/dev/sdb不要与他们的问题中的方式混淆,它最初提到/dev/sda3作为标头的 USB 分区,但后来在添加他们自己的问题的答案时发生了更改。

相关内容