在Linux上将文件串联为虚拟文件


10

在Linux系统上,是否有任何方法可以将一系列文件串联成一个公开文件以进行读写,而实际上并没有占用另外N个字节的磁盘空间?我希望通过环回/ devmapper挂载这些文件来完成此任务。

我有一个问题,其中有分割的二进制文件可能会变得很大。我不想使用大量磁盘IO将空间需求增加一倍,而只是cat通过将它们全部组合成一个巨大的文件来临时读取/写入这些文件中的内容。

我在这里找到了这个项目,但它似乎有一个非常特定的用例,并且还取决于perl


我想FUSE是为了解决这种问题而发明的。可能您必须编写自己的模块,但这应该不太困难。
Hauke Laging 2013年

Answers:


14

您可以通过组合循环设备和设备映射器来做到这一点,这要归功于“一切都是文件”。但有一个限制:文件大小无法更改(因为无法通过写入来增加块设备)。因此,如果要附加数据,则必须创建更大的块设备并覆盖附加的虚拟数据。

# 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

对于扩展文件,您可以创建一个大的稀疏文件并将其用作附加设备。


1

这可以在Linux中使用命名管道来完成。

假设您有名为 file0, file1, file2, file3, file4, file5

# create a name pipe
$ mkfifo mynewfile
# cat to named file
$ cat file{0..5} > mynewfile &

在C语言中,您可以执行

mkfifo(mynewfile , 0777);
system("cat file{0..5} > mynewfile");

然后使用然后使用mynewfile,就像我们从普通文件中读取的一样。

mynewfile是FIFO文件


0

为了阅读,您可以使用less多个文件,然后使用:n:p选项浏览它们。

为了进行写入,如果不直接访问文件,将无法写入文件。

您也可以同时有vim多个文件,它只会按照它们被调用的顺序执行(即vim fileA fileB fileC-在fileA关闭后打开fileB,在fileB关闭后打开fileC)。

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.