连接两个文件以循环挂载其中的文件系统

连接两个文件以循环挂载其中的文件系统

我有两个文件diskimage.part1diskimage.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/merge0partprobe如果您的映像包含任何分区,请记住在其上运行以读取分区。

更多信息可以找到这里(特别是在 TABLE_FORMAT 部分),可以找到一些非常有用的示例这里

感谢 chatGPT 为我指明了正确的方向,尽管它确实给了我一个完全损坏的命令。

相关内容