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

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

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

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

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

答案1

在基于 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)。

答案2

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

https://github.com/schlaile/concatfs

答案3

您基本上在问题的第一句话中就回答了:是的,可以做到。但是,您必须编写自定义文件系统驱动程序。如果它应该是一个文件系统对象,它必须由内核在某种程度上处理(包括保险丝)。驱动程序必须为标准文件系统系统调用 API(等等,包括查找)提供stat()后端open()。您不能完全在用户空间中完成此操作(至少不能使用整体内核 - 但即使使用微内核,您仍然需要提供文件系统驱动程序,尽管作为常规用户空间进程运行)。

相关内容