Concaténation de fichiers en un fichier virtuel sous Linux


10

Sur un système Linux, existe-t-il un moyen de concaténer une série de fichiers en un seul fichier exposé pour la lecture et l'écriture sans réellement occuper un autre N octets d'espace disque? J'espérais quelque chose comme monter ces fichiers via loopback / devmapper pour accomplir cela.

J'ai un problème où il y a des fichiers binaires divisés qui peuvent devenir assez volumineux. Je ne veux pas doubler mes besoins en espace avec des E / S de disque massives juste pour lire / écrire temporairement le contenu de ces fichiers en catles regroupant tous dans un énorme fichier.

J'ai trouvé ce projet ici , mais il semble avoir un cas d'utilisation très spécifique et dépend aussi de perl


Je suppose que FUSE a été inventé pour résoudre ce genre de problème. Vous devez probablement écrire votre propre module mais cela ne devrait pas être trop difficile.
Hauke ​​Laging

Réponses:


14

Vous pouvez le faire en combinant les périphériques de boucle et le mappeur de périphériques, grâce à "tout est un fichier". Mais avec une limitation: la taille du fichier ne peut pas être modifiée (car vous ne pouvez pas augmenter les périphériques de bloc en y écrivant). Donc, si vous souhaitez ajouter des données, vous devez créer un périphérique de bloc plus grand et écraser les données factices ajoutées.

# 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

Pour étendre le fichier, vous pouvez créer un gros fichier clairsemé et l'utiliser comme périphérique supplémentaire.


1

Cela pourrait être fait en utilisant un canal nommé sous Linux.

Supposons que vous ayez des fichiers nommés file0, file1, file2, file3, file4, file5

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

En C par programmation, vous pouvez faire

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

Ensuite, utilisez puis utilisez mynewfile comme nous, vous lirez à partir d'un fichier normal.

monfichier est un fichier FIFO


0

Pour la lecture, vous pouvez lesscréer plusieurs fichiers, puis utiliser les options :net :ppour les parcourir.

Pour l'écriture, sans accéder directement aux fichiers, vous ne pourrez pas y écrire.

Vous pouvez également vimplusieurs fichiers, et il passera simplement par l'ordre dans vim fileA fileB fileClequel ils ont été appelés (c'est-à-dire - fileB ouvert après fileA fermé, fileC ouvert après fileB fermé).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.