在Linux系统上,有没有办法将一系列文件连接成一个暴露的文件进行读写,而实际上并不占用另外N个字节的磁盘空间? 我希望能通过loopback / devmapper来挂载这些文件来完成这个任务。
我有一个问题,那里有分裂的二进制文件,可能会相当大。 我不想用大容量的磁盘IO来增加我的空间需求,只是暂时从这些文件中读取/写入内容,把它们全部集成到一个巨大的文件中。
我在这里find这个项目,但它似乎有一个非常具体的用例,也取决于Perl
您可以通过组合循环设备和设备映射器来实现这一点,这要归功于“一切都是文件”。 但有一个限制:文件大小不能改变(因为你不能通过写入块来增加块设备)。 所以,如果你想追加数据,那么你必须创build一个更大的块设备,并覆盖附加的虚拟数据。
# for testing, Create 4 files echo foo | dd of=block0 cbs=512 conv=block echo bar | dd of=block1 cbs=512 conv=block echo bat | dd of=block2 cbs=512 conv=block echo baz | dd of=block3 cbs=512 conv=block # Create a loop device for each of the 4 files losetup /dev/loop0 block0 losetup /dev/loop1 block1 losetup /dev/loop2 block2 losetup /dev/loop3 block3 # Create a device map named "test" using those loop devices ( echo "0 1 linear /dev/loop0 0" echo "1 1 linear /dev/loop1 0" echo "2 1 linear /dev/loop2 0" echo "3 1 linear /dev/loop3 0" ) | dmsetup create test $EDITOR /dev/mapper/test # use overwrite mode only
为了扩展文件,您可以创build一个大的稀疏文件,并将其作为附加设备使用。
对于阅读,你可以less多个文件,然后使用:n和:p选项来通过它们。
对于写作,不直接访问文件,你将无法写入。
你也可以在多个文件中使用vim ,它只会按照它们被调用的顺序(即vim fileA fileB fileC – fileB在fileAclosures后打开,fileC在fileBclosures后打开)。