Виртуальный файл, содержащий объединение других файлов.

Виртуальный файл, содержащий объединение других файлов.

Есть ли способ создать объект файловой системы, подобный этому:

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).

С помощью Device Mapper (размеры файлов должны быть кратны 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

Сегодня написал драйвер Fuse, если кому-то интересно решение Fuse (устройство сопоставления, а также решение NBD, указанное выше, будут создавать блочные устройства, а не обычные файлы, что приведет к сбоям, если вы захотите использовать полученный вывод напрямую с помощью программного обеспечения для редактирования видео или других инструментов, которые не готовы напрямую считывать данные с блочного устройства).

https://github.com/schlaile/concatfs

решение3

Вы в основном ответили на него в первом предложении вопроса: да, это можно сделать. Однако вам придется написать собственный драйвер файловой системы. Если предполагается, что это объект файловой системы, он должен обрабатываться ядром на каком-то уровне (включаяПРЕДОХРАНИТЕЛЬ). Драйвер должен будет предоставить бэкэнд для стандартного API системных вызовов файловой системы ( stat()и open()т. д., включая поиск). Вы не можете сделать это полностью в пользовательском пространстве (по крайней мере, не с монолитным ядром - но даже с микроядром вам все равно придется предоставить драйвер файловой системы, хотя и работающий как обычный процесс пользовательского пространства).

Связанный контент