¿Alguna vez ha observado una diferencia en el uso del disco de algún archivo al usar los comandos du y ls? Por ejemplo:
$ du -sh /u02/ticoprd/redo/* 515M redo1a.rdo 524M redo3b.rdo 518M redo4a.rdo
$ ls -ltrh /u02/ticoprd/redo/* -rw-r----- 1 oticoprd dba 1.1G Aug 4 01:09 redo1a.rdo -rw-r----- 1 oticoprd dba 1.1G Aug 4 02:32 redo3b.rdo -rw-r----- 1 oticoprd dba 1.1G Aug 4 03:51 redo4a.rdo
Podemos ver que el comando "ls" muestra que el tamaño del archivo es de 1,1 GB, mientras que el tamaño del archivo del comando "du" es de solo 515 MB. Estos archivos son archivos dispersos. "ls" muestra el tamaño aparente del archivo y "du" muestra el tamaño real del archivo que reside en el disco.
Un archivo disperso es un tipo de archivo de computadora que intenta usar el espacio del sistema de archivos de manera más eficiente cuando los bloques asignados al archivo están en su mayoría vacíos. Esto se logra escribiendo información breve (metadatos) que representan los bloques vacíos en el disco en lugar del espacio "vacío" real que constituye el bloque, utilizando menos espacio en el disco (es decir, los archivos dispersos contienen bloques de ceros cuya existencia se registra, pero no tienen espacio asignado en el disco). El tamaño de bloque completo se escribe en el disco como el tamaño real solo cuando el bloque contiene datos "reales" (no vacíos).
Al leer archivos dispersos, el sistema de archivos convierte de forma transparente los metadatos que representan bloques vacíos en bloques "reales" llenos de cero bytes en tiempo de ejecución. La aplicación no es consciente de esta conversión. Los archivos dispersos se usan comúnmente para imágenes de disco, instantáneas de bases de datos, archivos de registro, etc.
La ventaja de los archivos dispersos es que el almacenamiento solo se asigna cuando realmente se necesita:se ahorra espacio en disco y se pueden crear archivos grandes incluso si no hay suficiente espacio libre en el sistema de archivos.
Las desventajas son que los archivos dispersos pueden fragmentarse. Los informes de espacio libre del sistema de archivos pueden ser engañosos y copiar un archivo disperso con un programa que no los admita explícitamente puede copiar todo el tamaño del archivo sin comprimir, incluidas las secciones dispersas, en su mayoría cero, que no están en el disco, lo que hace que se pierdan los beneficios. de la propiedad dispersa en el archivo.
Podemos ver este comportamiento con el archivo /var/log/lastlog.
# ls -lh /var/log/lastlog -rw-r--r--. 1 root root 144K Sep 8 22:45 /var/log/lastlog
# du -sh /var/log/lastlog 40K /var/log/lastlog
Creación de un archivo disperso
Podemos crear un archivo disperso usando el comando dd:
# dd if=/dev/zero of=sparse_file bs=1 count=0 seek=512M 0+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000381714 s, 0.0 kB/s
# ls -hl sparse_file -rw-r--r--. 1 root root 512M Sep 9 00:13 sparse_file
# du -sh sparse_file 0 sparse_file
Para ver el uso del disco del archivo con el comando "ls", podemos usar la opción "-s":
# ls -lhs sparse_file 0 -rw-r--r--. 1 root root 512M Sep 9 00:13 sparse_file
Para ver el tamaño aparente del archivo usando "du" podemos usar la opción de tamaño aparente:
# du -h --apparent-size sparse_file 512M sparse_file
Copiar archivo disperso con el comando "cp"
El 'cp' admite archivos dispersos y es bueno para detectarlo, por lo que basta con ejecutar "cp". Pero cp tiene una opción –sparse=WHEN.
# cp --sparse=always sparse_file sparse_file.2