我有一个硬盘的映像备份文件,它由三个分区 ( sudo fdisk -l /mnt/hdd/19_02.img
) 组成:
Device Start End Sectors Size Type
/mnt/hdd/19_02.img1 2048 1050623 1048576 512M EFI System
/mnt/hdd/19_02.img2 1050624 34686975 33636352 16G Linux swap
/mnt/hdd/19_02.img3 34686976 976773134 942086159 449.2G Linux filesystem
第三个分区 is 类型crypto_LUKS
。如果它不会被加密,我可以用 挂载它sudo mount -o loop,offset=$(expr 512 \* 34686976) /mnt/hdd/19_02.img /mnt/img
,这会导致mount: /mnt/img: unknown filesystem type 'crypto_LUKS'.
我试过的
sudo cryptsetup luksOpen /mnt/hdd/19_02.img3 img
结果是Device /mnt/hdd/19_02.img3 doesn't exist or access denied.
sudo cryptsetup plainOpen --offset=$(expr 512 \* 34686976) /mnt/hdd/19_02.img img
询问我的密码,该密码也被接受,但返回了Requested offset is beyond real size of device /mnt/hdd/19_02.img.
好吧,也许cryptsetup
确实将偏移值乘以块大小。
sudo cryptsetup plainOpen --offset=34686976 /mnt/hdd/19_02.img img
询问我的密码,该密码也被接受并返回正常。但sudo mount /dev/mapper/img /mnt/img
抱怨mount: /mnt/img: wrong fs type, bad option, bad superblock on /dev/mapper/img
。分析sudo lsblk -f /dev/mapper/img
显示没有识别文件系统。
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
img
加密设备是由LUKS
模式创建的,因此使用plainOpen
. 但luksOpen
不提供--offset
选项。
做sudo cryptsetup luksOpen --offset=34686976 /mnt/hdd/19_02.img img
的结果cryptsetup: Option --offset is supported only for open of plain and loopaes devices and for luksFormat
。(没试过luksFormat
,但它设置了 LUKS 设备头并加密了主密钥。)
毕竟这个问题
如何处理cryptsetup luksOpen
图像文件上的偏移量?
fdisk
这里有点愚蠢:当显示分区的设备名称时,它只取给它的整个磁盘设备的名称,并附加分区号(p
如果整个磁盘设备名称的最后一个字符是前缀也是一个数字)。它在不检查该名称的设备是否实际存在的情况下执行此操作。换句话说,如果您的图像文件被命名
/mnt/hdd/19_02.img
并且您正在使用fdisk
它直接检查它,那么分区名称/mnt/hdd/19_02.img3
完全是虚构的并且无法使用。您可以简单地将图像文件附加到循环设备中,并让它自动为您检测分区,而不是尝试手动计算偏移量:
如果您的系统足够新以支持
-P
选项losetup
,那么您现在应该有分区设备,例如/dev/loop0p1
,/dev/loop0p2
并/dev/loop0p3
自动出现。对于不支持分区循环设备的旧发行版,您可以使用该
kpartx
命令(如果未单独打包,则可能随device-mapper-multipath
工具提供)用于相同目的。在这种情况下,您必须执行两个步骤,并且设备名称会略有不同:像这样使用时
kpartx
,分区设备会出现在/dev/mapper
,例如/dev/mapper/loop0p1
,等等。现在你应该可以做到
或者
取决于您是否使用
losetup -P
或kpartx
处理分区设备。完成对映像的访问后,卸载分区设备上所有已挂载的文件系统、
sudo cryptsetup luksClose
加密映像,然后撤消循环设备绑定:如果您使用过
kpartx
,请先运行sudo kpartx -d /dev/loop0
以释放分区设备。如果您使用losetup -P
,则不需要此步骤。然后,释放循环设备:
sudo losetup -d /dev/loop0
。