有没有办法将磁盘 img 文件分成几个部分并将其安装为单个循环设备?
答案1
我认为你不能就地做到这一点,但如果你有足够的空间,这应该可行:
# Create the files that will hold your data
dd if=/dev/zero of=part-00 bs=1M count=4k
dd if=/dev/zero of=part-01 bs=1M count=4k
# Create the loop devices
losetup /dev/loop0 part-00
losetup /dev/loop1 part-01
# Create a RAID array
mdadm --create /dev/md0 --level=linear --raid-devices=2 /dev/loop0 /dev/loop1
# Copy the original filesystem
dd if=original-file-00 of=/dev/md0 bs=512
# Look at the records written value
dd if=original-file-01 of=/dev/md0 bs=512 seek=<sum of records written values so far>
# Mount the new filesystem
mount /dev/md0 /mnt
您不能简单地从原始文件创建 RAID 阵列,因为 RAID 磁盘具有特定的标头,其中存储了磁盘数量、RAID 级别等信息。如果您这样做,部分原始文件将被覆盖。
您可以使用mdadm --build
创建一个没有元数据的数组,但您确实应该首先进行备份。或者如果只读挂载就足够了:
losetup -r /dev/loop0 original-00
losetup -r /dev/loop1 original-11
mdadm --build /dev/md0 --level=linear --raid-devices=2 /dev/loop0 /dev/loop1
mount /dev/md0 /mnt
你为什么要这样做?如果您的文件系统无法处理 >4GB 的文件,您应该切换到正常的文件系统。
答案2
要安装分割磁盘映像(或分区映像),您应该使用affuse
当前在此处维护的 afftools:https://github.com/sshock/AFFLIBv3
因此,如果您有一个文件,请将其分成几个子文件test_img.000, test_img.001, test_img.002, test_img.003, test_img.004, test_img.005, test_img.006, test_img.007, test_img.008, test_img.009
那么你可以通过虚拟方式加入他们affuse
# affuse test_img.000 /mnt/combine
# ls -lh /mnt/combine
total 0
-r--r--r-- 1 root root 2.0G 1969-12-31 16:00 test_img.000.raw
(这会将所有文件组合在一起,从文件 000 开始,然后是 001、002,...)
然后挂载镜像
mount -o ro,loop,offset=329043456 /mnt/combine/test_img.000.raw /mnt/test
用法有描述这里和一些例子这里。编译和安装后也可以使用联机帮助页,或者这里。
PS:对我来说,affuse
只有分割文件的大小是 512 字节的倍数时才有效。
答案3
您可以编写自己的块存储设备扩展(考虑类似熔丝的扩展)并根据地址执行查找。
在这里您可以找到如何使用保险丝的示例 https://github.com/libfuse/python-fuse/blob/master/example/hello.py
答案4
在 BSD 下你可以使用 union 选项来挂载。在Linux下你可以尝试一下unionFS。