如何将 LUKS 容器从分区的中间移动到开头?

如何将 LUKS 容器从分区的中间移动到开头?

对于 tl;dr,请跳至底部。

我在驱动器的开头有一个 Mac OS X 的双启动设置,在驱动器的末尾有三个 GNU/Linux 分区。我手头没有相关的机器来进行fdisk转储,但这里是原始磁盘布局的粗略概述:

/dev/sda1: EFI System Partition
/dev/sda2: Macintosh HD (main OS X partition)
/dev/sda3: Recovery HD (part of OS X's recovery system)
/dev/sda4: /
/dev/sda5: /home inside a LUKS container
/dev/sda6: swapspace inside a LUKS container

我正在这个系统上重新安装 GNU/Linux,作为其中的一部分,我想进行/加密。然而,这需要一个单独的/boot.为了创建该分区,我调整了 Macintosh HD 的大小,并将 Recovery HD 移回到 Macintosh HD 的末尾。我也趁这个机会,把自己的事情做大/了。所以最终结果是一个看起来像这样的磁盘:

/dev/sda1: EFI System Partition
/dev/sda2: Macintosh HD (main OS X partition) (smaller than before)
/dev/sda3: Recovery HD (part of OS X's recovery system)
/dev/sda4: /boot
/dev/sda5: / (larger than before, and now inside a LUKS container)
/dev/sda6: /home inside a LUKS container
/dev/sda7: swapspace inside a LUKS container

太长了;博士:问题在于:由于我配置的顺序,我现在cryptsetup在 中间有一个 -created LUKS 容器/dev/sda5。由于它位于中间,因此没有任何东西可以找到它来解锁/安装/恢复它。我怎样才能将我的 cryptcontainer 移动到分区的开头?这可能涉及两个不同的步骤(实际上发现磁盘上的东西,然后使用该信息来移动它),但我不确定。谷歌搜索没有发现任何结果。

答案1

LUKS 有一个独特的标头,您可以通过以下方式找到可能的偏移量grep

# grep -a -b --only-matching 'LUKS' /dev/sda5
1832480940:LUKS
1959072314:LUKS
2019974297:LUKS

对于您找到的每个可能的偏移量,您可以创建一个循环设备并查看它是否是有效的 LUKS 设备:

# losetup --find --show --offset 1832480940 --read-only /dev/sda5
/dev/loop3
# cryptsetup luksOpen /dev/loop3 luksloop3
...mount -o ro, ls, backup, umount...
# cryptsetup luksClose luksloop3
# losetup -d /dev/loop3

找到正确的偏移量后,您可以使用 将其移动到分区的开头dd。这是危险的,如果偏移量错误或者取消操作,数据就会丢失。所以无论如何你都应该先进行备份。

# dd if=/dev/sda5 of=/dev/sda5 bs=1M iflag=skip_bytes skip=1832480940

看看是否有效:

# cryptsetup luksOpen /dev/sda5 luks

否则从备份中恢复。

相关内容