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

Ryan
la source
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.

Hauke ​​Laging
la source
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

katta
la source
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é).

BriGuy
la source