我有两个文件diskimage.part1
,diskimage.part2
位于外部慢速 (USB 2) 硬盘驱动器上,我需要执行相当于
cat diskimage.part{1,2} > diskimage
mount -o ro,loop diskimage /tmp/mountpoint
但这cat
需要几个小时才能完成,而且磁盘映像由于其大小而无法容纳任何地方。
是否有一个“猫的惰性版本”可以与此磁盘映像一起使用?就像是
losetup --readonly /dev/loopX --concatenate diskimage.part*
mount -o ro /dev/loopX /tmp/mountpoint
(但losetup --concatenate
不存在)
答案1
可能你想使用mdadm
$ losetup --readonly /dev/loop1 diskimage.part1
$ losetup --readonly /dev/loop2 diskimage.part2
$ mdadm --create /dev/md0 --level=linear --raid-devices=2 /dev/loop1 /dev/loop2
$ mount -o ro /dev/md0 /tmp/mountpoint
答案2
如果 diskimage 和 diskimage2 至少有足够的可用空间,您可以将后者附加到前一个文件中
cat diskimage.part2 >> diskimage.part1 && mv diskimage.part1 diskimage
它还比复制两者更快,因为您不需要移动那么多数据。但出于速度考虑,最好使用另一个快速设备进行级联。
如果您没有足够的可用空间,只需使用任何其他(可能是外部)设备来创建磁盘映像文件。
答案3
mdadm --create
想要在循环设备上写入,而且我没有足够的勇气去看看它是否能工作(可能不会),所以我发现(我认为是)一个更好的解决方案,使用 dmsetup,这是有道理的,LVM 似乎是一个更适合这份工作:
losetup --read-only /dev/loop1 diskimage.part1 # For this example, 5120 bytes
losetup --read-only /dev/loop2 diskimage.part2 # For this example, 2560 bytes
echo -e "0 10 linear /dev/loop1 0 \n10 5 linear /dev/loop2 0" | dmsetup create merge0
mount -o ro /dev/mapper/merge0 /tmp/mountpoint
澄清:
dmsetup
是管理LVM的命令。创建新的映射设备时,您使用dmsetup create <dev_name>
,并且它还需要一个描述映射的表。默认情况下,该表来自标准输入。
该表由以下形式的行组成start_sector number_sectors target_type [target_type_arguments]
。扇区由 512 字节组成。在此示例中,我们使用linear
映射,它获取要映射到的文件以及要映射的文件的偏移量(也在扇区中)作为参数。在这个例子中,我们假设我们不想跳过文件中的任何内容,因此它们被设置为零。
该命令意味着对于新设备 ,merge0
前 10 个扇区将映射到/dev/loop1
,接下来的 5 个扇区将映射到/dev/loop2
。
新设备将于 上市/dev/mapper/merge0
。partprobe
如果您的映像包含任何分区,请记住在其上运行以读取分区。
更多信息可以找到这里(特别是在 TABLE_FORMAT 部分),可以找到一些非常有用的示例这里。
感谢 chatGPT 为我指明了正确的方向,尽管它确实给了我一个完全损坏的命令。