Віртуальний файл, що містить конкатенацію інших файлів


13

Чи існує спосіб створення об’єкта файлової системи, подібного до цього:

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

але такий, що його можна шукати, немовби це звичайний файл?

Відповіді:


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


Дуже навчальний і простий у використанні вихідний код! Дякуємо, що створили та поділилися!
Grzegorz Wierzowiecki

3

Ви в основному відповіли на це в першому реченні питання: так, це можна зробити. Однак вам доведеться написати спеціальний драйвер файлової системи. Якщо він повинен бути об'єктом файлової системи, його має обробляти ядро ​​на якомусь рівні (що включає FUSE ). Водій повинен забезпечити бекенд для стандартної файлової системи системних викликів API ( stat(), і open()т.д., включаючи пошук). Ви не можете зробити це повністю в просторі користувача (принаймні, не з монолітним ядром, - але навіть з мікрокереллю вам все-таки потрібно надати драйвер файлової системи, хоч це працює як звичайний процес в просторі користувачів).


Досить очевидно, що це можна зробити. Мені цікаво, чи є якийсь швидкий злом для досягнення цього за допомогою стандартних пакетів un * x - бажано через bash без необхідності написання виділеного драйвера для простору ядра.
Вітіко

1
дивіться відповідь Стефана - я повністю забув картограф пристрою.
петерф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.