Concatenación de archivos a un archivo virtual en Linux

10

En un sistema Linux, ¿hay alguna forma de concatenar una serie de archivos en un archivo expuesto para leer y escribir sin ocupar otros N bytes de espacio en disco? Esperaba algo como montar estos archivos a través de loopback / devmapper para lograr esto.

Tengo un problema donde hay archivos binarios divididos que pueden ser bastante grandes. No quiero duplicar mis requisitos de espacio con el disco IO masivo solo para leer / escribir temporalmente contenido de estos archivos al catunirlos todos en un archivo enorme.

Encontré este proyecto aquí , pero parece tener un caso de uso muy específico y también depende de Perl

Ryan
fuente
Supongo que FUSE fue inventado para resolver este tipo de problema. Probablemente tenga que escribir su propio módulo, pero eso no debería ser demasiado difícil.
Hauke ​​Laging

Respuestas:

14

Puede hacerlo combinando dispositivos de bucle y mapeador de dispositivos, gracias a "todo es un archivo". Pero con una limitación: el tamaño del archivo no se puede cambiar (ya que no puede aumentar los dispositivos de bloqueo al escribirles). Entonces, si desea agregar datos, debe crear un dispositivo de bloque más grande y sobrescribir los datos ficticios adjuntos.

# 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

Para extender el archivo, puede crear un gran archivo disperso y usarlo como dispositivo adicional.

Hauke ​​Laging
fuente
1

Esto podría hacerse usando una canalización con nombre en Linux.

Suponga que tiene archivos llamados file0, file1, file2, file3, file4, file5

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

En C programáticamente puedes hacer

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

Luego use luego use mynewfile como nos lo leería del archivo normal.

mynewfile es un archivo FIFO

katta
fuente
0

Para leer, puede lessusar varios archivos y luego usar las opciones :ny :ppara recorrerlos.

Para escribir, sin acceder directamente a los archivos, no podrá escribirles.

Usted puede vim varios archivos, y simplemente pasará por el orden en que se llamaron (es decir, vim fileA fileB fileC- archivo B abierto después del archivo A cerrado, archivo C abierto después del archivo B cerrado).

BriGuy
fuente