
¿Cuáles son las funciones para manipular archivos dispersos en Linux? (digamos en C, las notas sobre otros sistemas son muy bienvenidas), por ejemplo:
- Haga un agujero en el interior de la lima quitando parte de su interior.
- Investigar la estructura, por ejemplo, generar una secuencia de pares que indiquen el comienzo y el final de bloques continuos de datos separados.
- dividir el archivo en dos en algún momento, reasignando un rango de bloques (es decir, sin mover los datos reales)
- investigar inodos y otros aspectos relevantes? (¿Quizás sea posible asignar algunos bloques a varios archivos mediante copia en escritura?)
Contexto:
La pregunta original que me vino a la mente y de la que llegué fue después man rsync
de --sparse
una opción:
¿Por qué rsync
la --sparse
opción entra en conflicto con --inplace
?
¿Es una limitación de las llamadas a la API del sistema de archivos?
Desde el punto de vista de la estructura de datos, si el archivo fuente disperso se ve como una secuencia de bloques de datos no continuos, lo que esperaría de la sincronización "r" desasignar en el destino aquellos rangos que no existen en el origen, asignar los que faltan, descansar actualice en consecuencia (incluso con el algoritmo hash rodante rsync estándar, tratando todas las secuencias restantes como una sola o ejecutándolas por separado en cada una).
Referencia:
man rsync
-S, --sparse Try to handle sparse files efficiently so they take up less space on the destination. Conflicts with --inplace because it's
No es posible sobrescribir datos de forma dispersa.
Respuesta1
Los archivos dispersos están diseñados para ser transparentes para el espacio del usuario: los agujeros se crean buscando áreas no utilizadas en el pasado y se leen como bloques de ceros. No se pueden detectar mediante API de espacio de usuario estándar, al menos no todavía, comoseñalóporStéphane Chazelas, al menos Solaris y Linux son compatibles con SEEK_DATA
ySEEK_HOLE
lseek(2)
banderas que permiten a los programas del espacio de usuario encontrar agujeros, y estas banderas podrían serañadido a POSIXen algún momento.
Esto explica la incompatibilidad entre rsync
' --sparse
y --inplace
opciones: al escribir en un archivo existenteportátilmente, no se pueden crear agujeros en los datos existentes. --sparse
funciona reescribiendo todo el archivo, omitiendo secuencias (largas) de ceros, lo que da como resultado archivos dispersos en los sistemas operativos y sistemas de archivos que los admiten.
En Linux, puede recuperar detalles de la escasez de archivos usando elfiemap
ioctl, y e2fsprogs
'filefrag(8)
; verInformación detallada de archivos dispersos en Linux. En el lado de la escritura, puedes usarfallocate(2)
(y lo prácticofallocate(1)
utilidad) para perforar agujeros en un archivo existente, haciéndolo escaso si los agujeros cubren bloques enteros. La compatibilidad depende del sistema de archivos: actualmente solo XFS, btrfs, ext4 y tmpfs admiten estas operaciones. Kernels recientes (desde 4.1) ymuyLas versiones recientes de util-linux
admiten la inserción de agujeros en archivos y el desplazamiento del contenido después del agujero ( fallocate -i
, introducido en util-linux
2.30 que debería lanzarse pronto).
Sus dos últimas preguntas son sobre cirugía del sistema de archivos y no estoy seguro de que haya ninguna llamada genérica al sistema o ioctl disponible para realizar dichas operaciones. reflink
-Los sistemas de archivos compatibles permiten que los archivos compartan su contenido; esto se puede lograr usandolos FICLONE
y FICLONERANGE
ioctls.