将多个img文件挂载为单循环设备


19

有没有办法将磁盘img文件分解成多个部分并将其作为单个循环设备安装?


1
怎么破了?它是什么格式?如果这是一种特殊格式,可能会有一些融合的魔力,但是我怀疑答案是将它们融合在一起!
卡莱布

我受设备格式的限制,不能使用少于4个演出的文件。我具有对该设备的root访问权限。LVM有什么我可以解决的

Answers:


16

我认为您不能就地完成此操作,但是如果您有足够的空间,这应该可以工作:

# 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的文件,则应切换为正常文件。


也许也可以使用设备映射器执行此操作,但是上述操作更容易。
Wodin 2011年

很抱歉花了这么长时间接受了,很好的回答。在正常情况下,我不会这样做,更多的是冒险模式问题。
MageProspero 2011年

2
您可能想使用truncate而不是,dd因为它要快得多(它不执行对FS的实际写入,而只是分配inode并将文件标记为仅包含洞)。
Maciej Piechotka 2011年

真好 我不知道
stribika 2011年

根据经验,如果您使用大容量的基于云的备份或同步解决方案(例如CrashPlan或付费的Google云端硬盘),则使用小拆分文件而不是单个大文件是一个非常非常好的主意。如果文件下载失败,则只需重新下载1 GB,而不是整个100 GB。
RAKK

3

要挂载拆分磁盘映像(或分区映像),应使用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字节的倍数时,该命令才起作用。


4
我只是试过这种方法。它有一个主要警告:它仅允许您将映像挂载为只读。
RAKK

只要您只有数百个文件块,而没有数千个文件块,则效果很好。最好使用mdadm创建线性RAID分区:unix.stackexchange.com/a/98779/22709
Jay Taylor,


0

到目前为止,我对解决方案最了解的是创建VMware VM。您启动Linux Live CD(例如Rescatux或Knoppix),在主机上创建SMB共享文件夹,将SMB共享安装在VM上,然后dd将映像镜像到虚拟HD中。VMware默认情况下将其磁盘映像保存为拆分文件,因此这是直接读取拆分为多个文件的磁盘映像的最接近的方法。

以后,如果要从主机访问文件,则可以尝试向映像添加第二个虚拟HD,然后将文件复制到该映像中。然后,您在VM上设置了SMB共享文件夹,并从主机连接到该文件夹​​。这样,例如,如果您使用的是iPod Classic(仅会增加fat32)或智能手机的SD卡(通常必须安装自定义ROM,则您可以违反FAT32的4 GB文件限制)要在外部存储设备上使用Ext3或NTFS,为此,您需要使用知名制造商(如Samsung或Motorola)的电话,因此,如果您使用的是中国智能手机,则很麻烦。

公认这不是一个有效的解决方案,但是由于无法使用ipod classic或带存储ROM的三星智能手机上的fat32以外的其他文件,我受到了限制,因此我在整个互联网中搜寻了几乎所有内容过去并且仍然无法找到有效的解决方案。我什至必须自己写。

PS:忘记提及了,如果您使用Windows,这可能是唯一的方法。


自从我解决这个问题已经有一段时间了。我仍然拥有它。我也有和你完全一样的理由。我想知道您是否可以提出一个拥有自己的自定义文件系统的进程,说实话,我很想尝试一下。我知道我可以在节点上做到这一点。我成功地将口译员扎根了。我不知道这是否可以解决您的问题。在我的三星电子星系上,这很好。告诉我,您是否想为这个问题共同努力。
MageProspero 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.