![使用 Ubuntu 为现有全盘加密设备分离 LUKS 标头(在 USB 上)](https://linux22.com/image/194420/%E4%BD%BF%E7%94%A8%20Ubuntu%20%E4%B8%BA%E7%8E%B0%E6%9C%89%E5%85%A8%E7%9B%98%E5%8A%A0%E5%AF%86%E8%AE%BE%E5%A4%87%E5%88%86%E7%A6%BB%20LUKS%20%E6%A0%87%E5%A4%B4%EF%BC%88%E5%9C%A8%20USB%20%E4%B8%8A%EF%BC%89.png)
我已经/boot
在 USB 记忆棒上有一个分区,在我的计算机上有一个 LUKS 分区,这对应于 Ubuntu 21 的全盘加密方案 我想将 LUKS 分区的标头放到 USB 上(在该/boot
分区上或在另一个新分区上)在我的 USB 上)
我已将标头(带有cryptsetup luksHeaderBackup
)放在boot_header.luks
我的启动分区(假设在设备上),然后使用我尝试以下选项的文件/dev/sda3
中:crypttab
header=
/boot/boot_header.luks
/dev/sda3/boot_header.luks
/dev/sda3:/boot_header.luks
还有/boot_header.luks:/dev/sda3
(当然)
与 uuid 相同,/dev/sda3
也与/dev/disk/by-uuid/[uuid]
所以我认为该设备sda3
没有按照文档安装密码表(如果我理解正确的话)
可选地,[包含标头的文件的]路径后面可以跟“:”和 /etc/fstab 设备规范(例如以“UUID=”或类似内容开头);在这种情况下,该路径是相对于设备文件系统根的。仅在 LUKS 设备激活期间自动安装设备。
所以我在执行之前寻找安装启动分区隐根local-bottom
和中带有自定义脚本的脚本init-bottom
。也按照建议这里我尝试将标头合并到 initramfs 中回答
但启动时的结果总是相同的:
“标题”选项的值错误
我发现这是相当可行的拱但是有没有办法在 Ubuntu 上做同样的事情(不修改像 cryptroot 这样的现有脚本)?
答案1
正如评论中指出的@AB解决方案是一个原始分区,其中包含标头而不是分区内的头文件(由于需要先挂载文件系统,这很麻烦)
将标头(LUKS2 约为 16MB)复制到分区(/dev/sdb
大于标头大小)有两个选项。
- 第一个是复制原始标头
dd
。
首先,您需要找到数据的偏移量(因为标头始终从 0 开始)。对于 LUKS 设备/dev/sda4
,请使用cryptsetup luksDump /dev/sda4
并查找 ligne抵消在该部分数据段。然后使用 查找文件系统块大小stat -fc %s /dev/sda4
。最后,dd if=/dev/sda4 of=/dev/sdb bs=<fs_block_size> count=<data_offset>
- 第二种是将所有头数据打包到一个备份文件中,该备份文件将复制到该分区
/dev/sdb
。
因为备份文件可能会导致一些问题安全问题即使它保存在加密磁盘上,最好只为该文件创建一个虚拟磁盘。
mkdir /tmp/header_backup
mount -t tmpfs -o size=512m tmpfs /tmp/header_backup
cryptsetup luksHeaderBackup /dev/sda4 --header-backup-file /tmp/header_backup/header.luks
dd if=/tmp/header_backup/header.luks of=/dev/sdb
umount /tmp/header_backup
然后将/etc/crypttab
选项添加header=/dev/sdb
到相应的行(例如sda4_crypt [UUID] none luks,discard,header=/dev/sdb
)
要擦除旧的 LUKS 标头:cryptsetup luksErase /dev/sda4
。这只会擦除键槽,但保留所有元数据。如果您想要(没有必要)完全擦除标头,您将需要在其上有另一个文件系统标头,以便将 UUID 保留到该分区上。但请注意,完全擦除 LUKS 标头可能不会导致安全擦除,具体取决于您的存储设备(SSD 或 HDD)。对于SSD已删除的块可能会保留在队列中,直到设备需要分配更多空间。
否则要擦除标头:获取文件系统块大小 ( <fs_block_size>
) stat -fc %s /dev/sda4
、LUKS 数据偏移量 ( <luks_data_offset>
) cryptsetup luksDump /dev/sdb
、分区的 UUID /dev/sda4
( <uuid_sda4>
),然后:
dd if=/dev/urandom of=/dev/sda4 bs=<fs_block_size> count=<luks_data_offset>
mkfs.ext4 fs.img
tune2fs -U <uuid_sda4> fs.img
dd if=fs.img of=/dev/sda4
该分区/dev/sdb
将具有与 LUKS 相同的 UUID,这可能是一个问题。您可以更改它,而不会扰乱 LUKS 流程cryptsetup luksUUID /dev/sdb --uuid $(uuidgen)
最后更新 initramfsupdate-initramfs -u -k all