Plik wirtualny zawierający konkatenację innych plików

13

Czy istnieje sposób na utworzenie obiektu systemu plików podobnego do tego:

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

ale takie, że można go wyszukać, jakby to był zwykły plik?

Witiko
źródło

Odpowiedzi:

18

W systemach operacyjnych opartych na systemie Linux można to zrobić za pomocą bloków sieciowych lub urządzeń mapujących urządzenia. Otrzymany plik jest urządzeniem blokowym.

Z 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

(konkatenacja jest /dev/nbd0).

Z maperem urządzenia (rozmiary plików muszą być wielokrotnością 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

(konkatenacja jest /dev/mapper/mybundle).

Stéphane Chazelas
źródło
8

napisał dzisiaj sterownik bezpiecznika, jeśli ktoś jest zainteresowany rozwiązaniem bezpiecznika (maper urządzeń oraz powyższe rozwiązanie nbd utworzą urządzenia blokowe, a nie zwykłe pliki - które zepsują się, jeśli chcesz użyć wynikowego wyjścia bezpośrednio do edycji wideo oprogramowanie lub inne narzędzia, które nie są przygotowane do bezpośredniego odczytu z urządzenia blokowego)

https://github.com/schlaile/concatfs

Piotr
źródło
Bardzo edukacyjny i prosty w użyciu kod źródłowy! Dziękujemy za zrobienie tego i udostępnienie!
Grzegorz Wierzowiecki
3

Zasadniczo odpowiedziałeś na to w pierwszym zdaniu pytania: tak, można to zrobić. Będziesz jednak musiał napisać niestandardowy sterownik systemu plików. Jeśli ma to być obiekt systemu plików, musi być obsługiwany przez jądro na pewnym poziomie (w tym FUSE ). Kierowca będzie musiał dostarczyć backend dla standardowego systemu plików wywołań API ( stat(), open()itd., W tym poszukiwanie). Nie możesz tego zrobić całkowicie w przestrzeni użytkownika (przynajmniej nie z monolitycznym jądrem - ale nawet z mikrojądrem nadal będziesz musiał dostarczyć sterownik systemu plików, chociaż działa jako zwykły proces przestrzeni użytkownika).

Peter
źródło
To dość oczywiste, że da się to zrobić. Ciekawe, czy istnieje jakiś sposób na szybkie włamanie do tego celu przy użyciu standardowych pakietów un * x - najlepiej poprzez bash bez potrzeby pisania dedykowanego sterownika przestrzeni jądra.
Witiko,
1
zobacz odpowiedź Stephane'a - całkowicie zapomniałem mapera urządzeń.
peterph