Łączenie plików w plik wirtualny w systemie Linux

10

Czy w systemie Linux istnieje sposób na połączenie serii plików w jeden odsłonięty plik do odczytu i zapisu, nie zajmując w rzeczywistości kolejnych N bajtów miejsca na dysku? Miałem nadzieję na coś takiego jak zamontowanie tych plików przez loopback / devmapper, aby to osiągnąć.

Mam problem z podzielonymi plikami binarnymi, które mogą być dość duże. Nie chcę podwoić wymagań dotyczących miejsca dzięki ogromnemu dyskowi IO tylko po to, aby tymczasowo odczytać / zapisać zawartość z tych plików, catłącząc je wszystkie w jeden ogromny plik.

Znalazłem ten projekt tutaj , ale wydaje się, że ma on bardzo specyficzny przypadek użycia i zależy również od perla

Ryan
źródło
Myślę, że FUSE został wymyślony, aby rozwiązać ten problem. Prawdopodobnie musisz napisać własny moduł, ale nie powinno to być zbyt trudne.
Hauke ​​Laging

Odpowiedzi:

14

Możesz to zrobić, łącząc urządzenia pętlowe z maperem urządzeń, dzięki „wszystko jest plikiem”. Ale z jednym ograniczeniem: Rozmiar pliku nie może zostać zmieniony (ponieważ nie można zwiększyć urządzeń blokowych, pisząc do nich). Więc jeśli chcesz dołączyć dane, musisz utworzyć większe urządzenie blokowe i zastąpić dołączone dane fikcyjne.

# for testing, Create 4 files
echo foo | dd of=block0 cbs=512 conv=block
echo bar | dd of=block1 cbs=512 conv=block
echo bat | dd of=block2 cbs=512 conv=block
echo baz | dd of=block3 cbs=512 conv=block
# Create a loop device for each of the 4 files
losetup /dev/loop0 block0
losetup /dev/loop1 block1
losetup /dev/loop2 block2
losetup /dev/loop3 block3
# Create a device map named "test" using those loop devices
(
    echo "0 1 linear /dev/loop0 0"
    echo "1 1 linear /dev/loop1 0"
    echo "2 1 linear /dev/loop2 0"
    echo "3 1 linear /dev/loop3 0"
) | dmsetup create test
$EDITOR /dev/mapper/test # use overwrite mode only

Aby rozszerzyć plik, możesz utworzyć duży plik rzadki i użyć go jako dodatkowego urządzenia.

Hauke ​​Laging
źródło
1

Można to zrobić za pomocą nazwanego potoku w systemie Linux.

Załóżmy, że masz nazwane pliki file0, file1, file2, file3, file4, file5

# create a name pipe
$ mkfifo mynewfile
# cat to named file
$ cat file{0..5} > mynewfile &

W C programowo możesz to zrobić

mkfifo(mynewfile , 0777);
system("cat file{0..5} > mynewfile");

Następnie użyj, a następnie użyj mojego nowego pliku, tak jak my czytalibyśmy z normalnego pliku.

mój nowy plik to plik FIFO

katta
źródło
0

Do czytania możesz użyć lesswielu plików, a następnie użyć opcji :ni, :paby je przejrzeć.

Do pisania bez bezpośredniego dostępu do plików nie będziesz mógł do nich pisać.

Możesz również vimwiele plików, a on po prostu przejdzie w kolejności, w jakiej zostały wywołane (tj. vim fileA fileB fileC- plik B otwarty po zamknięciu pliku A, plik C otwarty po zamknięciu pliku B).

BriGuy
źródło