Concatenazione di file in un file virtuale su Linux


10

Su un sistema Linux, c'è un modo per concatenare una serie di file in un file esposto per la lettura e la scrittura senza occupare effettivamente un altro N byte di spazio su disco? Speravo in qualcosa come montare questi file tramite loopback / devmapper per ottenere questo risultato.

Ho un problema in cui ci sono file binari divisi che possono diventare abbastanza grandi. Non voglio raddoppiare i miei requisiti di spazio con un enorme I / O su disco solo per leggere / scrivere temporaneamente contenuti da questi file catinserendoli tutti insieme in un unico enorme file.

Ho trovato questo progetto qui , ma sembra avere un caso d'uso molto specifico e dipende anche dal perl


Immagino che FUSE sia stato inventato per risolvere questo tipo di problema. Probabilmente devi scrivere il tuo modulo ma questo non dovrebbe essere troppo difficile.
Hauke ​​Laging,

Risposte:


14

Puoi farlo combinando dispositivi loop e device mapper, grazie a "tutto è un file". Ma con una limitazione: la dimensione del file non può essere modificata (poiché non è possibile aumentare i dispositivi a blocchi scrivendoli). Quindi, se si desidera aggiungere dati, è necessario creare un dispositivo a blocchi più grande e sovrascrivere i dati fittizi aggiunti.

# 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

Per estendere il file è possibile creare un file sparse di grandi dimensioni e utilizzarlo come dispositivo aggiuntivo.


1

Questo potrebbe essere fatto usando il pipe chiamato in Linux.

Supponiamo di avere file denominati file0, file1, file2, file3, file4, file5

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

In C programmaticamente puoi farlo

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

Quindi usa quindi usa mynewfile come noi leggeresti dal normale file.

mynewfile è un file FIFO


0

Per la lettura, è possibile lesspiù file e quindi utilizzare le opzioni :ne :pper esaminarli.

Per la scrittura, senza accedere direttamente ai file non sarà possibile scriverli.

Puoi anche vimpiù file e andrà semplicemente nell'ordine in cui sono stati chiamati (es. vim fileA fileB fileC- fileB aperto dopo fileA chiuso, fileC aperto dopo fileB chiuso).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.