Un archivo virtual que contiene la concatenación de otros archivos.

13

¿Hay alguna manera de crear un objeto de sistema de archivos similar a esto:

mknod files p
cat file1 file2 ... fileN > files

pero tal que se pueda buscar, como si fuera un archivo normal?

Witiko
fuente

Respuestas:

18

En los sistemas operativos basados ​​en Linux, eso se puede hacer con dispositivos de bloqueo de red o dispositivos de mapeo de dispositivos. El archivo que obtienes es un dispositivo de bloque.

Con nbd:

ln -s /path/to/first-file file.0
...
ln -s /path/to/last-file file.19
nbd-server -C /dev/null -m 127.0.0.1:12345 file

sudo nbd-client localhost 12345 /dev/nbd0

(La concatenación es /dev/nbd0).

Con el mapeador de dispositivos (los tamaños de archivo deben ser múltiples de 512):

sudo losetup /dev/loop0 file1
sudo losetup /dev/loop1 file2
s0=$(sudo blockdev --getsize /dev/loop0)
s1=$(sudo blockdev --getsize /dev/loop1)
printf '%s\n' "0 $s0 linear /dev/loop0 0" "$s0 $s1 linear /dev/loop1 0" |
  sudo dmsetup create mybundle

(La concatenación es /dev/mapper/mybundle).

Stéphane Chazelas
fuente
8

escribió un controlador de fusible hoy, si alguien está interesado en la solución de fusible (el mapeador de dispositivos, así como la solución nbd anterior, crearán dispositivos de bloque, no archivos regulares, lo que se romperá si desea usar la salida resultante directamente con la edición de video software u otras herramientas que no están preparadas para leer directamente desde un dispositivo de bloque)

https://github.com/schlaile/concatfs

Peter
fuente
¡Código fuente muy educativo y fácil de usar! Gracias por hacerlo y compartir!
Grzegorz Wierzowiecki
3

Básicamente lo respondiste en la primera oración de la pregunta: sí, se puede hacer. Sin embargo, debería escribir un controlador de sistema de archivos personalizado. Si se supone que es un objeto del sistema de archivos, debe ser manejado por el núcleo en algún nivel (que incluye FUSE ). El controlador tendría que proporcionar back-end para la API de syscalls del sistema de archivos estándar ( stat(), open()etc., incluida la búsqueda). No puede hacerlo completamente en el espacio del usuario (al menos no con un núcleo monolítico, pero incluso con un microkernel aún necesitaría proporcionar un controlador del sistema de archivos, aunque se ejecute como un proceso de espacio de usuario normal).

Peterph
fuente
Es bastante obvio que se puede hacer. Lo que me interesa es saber si hay alguna forma rápida de lograr esto utilizando los paquetes estándar un * x, preferiblemente a través de bash sin la necesidad de escribir un controlador de espacio kernel dedicado.
Witiko
1
vea la respuesta de Stephane: olvidé por completo el mapeador de dispositivos.
Peter