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