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

13

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

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

но такой, чтобы его можно было искать, как если бы это был обычный файл?

Witiko
источник

Ответы:

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 создадут блочные устройства, а не обычные файлы - что сломается, если вы захотите использовать полученный вывод непосредственно с редактированием видео) программное обеспечение или другие инструменты, которые не готовы к чтению непосредственно с блочного устройства)

https://github.com/schlaile/concatfs

Питер
источник
Очень познавательный и простой в использовании исходный код! Спасибо за создание и обмен!
Гжегож Вежовецкий
3

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

peterph
источник
Совершенно очевидно, что это можно сделать. Что меня интересует, так это то, существует ли какой-нибудь способ быстрого взлома для достижения этой цели с использованием стандартных пакетов un * x - предпочтительно через bash без необходимости написания специального драйвера пространства ядра.
Witiko
1
см. ответ Стефана - я полностью забыл устройство отображения.
Петер