包含其他文件串联的虚拟文件


13

有没有一种创建类似于此文件系统对象的方法:

mknod files p
cat file1 file2 ... fileN > files

但是可以像普通文件一样查找它?

Answers:


18

在基于Linux的操作系统上,可以使用网络块设备或设备映射器设备来完成。您获得的文件是阻止设备。

nbd

ln -s /path/to/first-file file.0
...
ln -s /path/to/last-file file.19
nbd-server -C /dev/null -m 127.0.0.1:12345 file

sudo nbd-client localhost 12345 /dev/nbd0

(串联是/dev/nbd0)。

使用设备映射器(文件大小必须是512的倍数):

sudo losetup /dev/loop0 file1
sudo losetup /dev/loop1 file2
s0=$(sudo blockdev --getsize /dev/loop0)
s1=$(sudo blockdev --getsize /dev/loop1)
printf '%s\n' "0 $s0 linear /dev/loop0 0" "$s0 $s1 linear /dev/loop1 0" |
  sudo dmsetup create mybundle

(串联是/dev/mapper/mybundle)。


8

今天写了一个保险丝驱动程序,如果有人对保险丝解决方案感兴趣(设备映射器以及上面的nbd-solution将创建不是常规文件的块设备-如果您想直接将结果输出用于视频编辑,则该文件将损坏)不准备直接从块设备读取的软件或其他工具)

https://github.com/schlaile/concatfs


非常有教育性和易于使用的源代码!感谢您分享和分享!
Grzegorz Wierzowiecki,2016年

3

您基本上在问题的第一句话中回答了:是的,可以做到。但是,您必须编写自定义文件系统驱动程序。如果应该将其作为文件系统对象,则必须在某种程度上由内核处理(包括FUSE)。司机将不得不为标准的文件系统的系统调用API提供后端(stat()open()等等,包括寻求)。您不能完全在用户空间中做到这一点(至少不是使用单片内核-但即使是微内核,您仍需要提供文件系统驱动程序,尽管它是作为常规用户空间进程运行的)。


很明显,它可以做到。我很好奇的是,是否存在使用标准un * x软件包实现此目的的快速方法-最好是通过不需编写专用内核空间驱动程序的bash来实现。
Witiko

1
请参阅Stephane的答案-我完全忘记了设备映射器。
彼得
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.