Antes de arrancar la explicación sobre Sparse File, me gustaría contar el contexto de cómo se llego a esta característica de diferentes archivos.
Luego de crear un script para la realización de backup en máquinas virtuales desde el servidor hypervisor (Debian based), se notaba que la sumatoria de los discos respaldados era mucho mayor que el disponible en el disco. Utilizando la utilería básica bash “tree”, podemos apreciar lo siguiente
Si se suma la cantidad de espacio utilizado para las copias de seguridad, nos da un total de 310GB. Si chequeamos la capacidad del disco donde se almacenan las mismas, vemos que hay 223,57GB efectivos
Analizando más en profundidad, se utiliza el comando “df” para ver el espacio utilizado en el disco. Se puede apreciar que la columna “used” acusa 73GB utilizados y un total de 152GB disponibles para su uso.
root@backupserver:/# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda 224G 73G152G 33% /backup
Realizando la investigación para la explicación de este artículo, me encuentro con la definición de “sparse files” en Wikipedia.
Intenta utilizar eficientemente el espacio del sistema de archivos cuando los bloques asignados a los archivos están en su mayor parte vacíos.
Se escriben metadatos representando bloques vacíos en vez del verdadero espacio “vacío” que constituye el bloque, utilizando así menos espacio. El tamaño del bloque completo se escribe como tamaño real solo cuando el bloque contiene “datos reales” (no vacíos). Al leer los archivos dispersos, el sistema de archivos de forma transparente convierte los metadatos que representan los bloques vacíos en bloques llenos de bytes ceros en tiempo de ejecución, por lo que la aplicación no es consciente de esta conversión.
Se utilizan normalmente para imágenes de disco, copia de bases de datos y log files.
Como todo feature, tiene sus lados positivos y negativos. Se listan a continuación
Ventajas
Desventajas
El almacenamiento se asigna cuando realmente se necesita: el espacio de disco se guarda, y se pueden crear archivos de gran tamaño incluso si no hay suficiente espacio libre en el sistema de archivos.
Los archivos pueden ser fragmentados ya que el espacio en el sistema de archivos se asigna a medida que los huecos están llenos, y no están necesariamente contiguos.
La información sobre el espacio libre en el sistema de archivos puede ser engañosa si se tiene en cuenta el tamaño aparente de los archivos dispersos.
Quedarse sin espacio libre en los sistemas de archivos que contienen los archivos dispersos puede causar efectos no deseados.
La herramienta utilizada para hacer el backup es “rsync”. La misma ya tiene incluída (en las versiones más recientes de GNU/Linux) la detección automática de este tipo de archivos y los copia sin problema (utilizando el mismo espacio que posee el original). Herramientas como “tar”, “cp” y demás relacionadas también están adaptadas para este uso.
DESCRIPTION Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.
[ommited output for understanding purposes]
By default, sparse SOURCE files are detected by a crude heuristic and the corresponding DEST file is made sparse as well. That is the behavior selected by --sparse=auto. Specify --sparse=always to create a sparse DEST file whenever the SOURCE file contains a long enough sequence of zero bytes. Use --sparse=never to inhibit creation of sparse files.
La mayoría de sistemas operativos reconocen esta característica. A continuación un cuadro donde se puede apreciar dónde/cuándo sí o no.
Cómo chequear si un archivo posee esta característica?
Con la herramienta “stat” se puede hacer la verificación de manera correcta. El siguiente bash script es de ayuda para chequearlo rápidamente
#!/bin/bash
if [ "$((`stat -c '%b*%B-%s' -- "$1"`))" -lt 0 ] then echo "$file" is sparse else echo "$file" is not sparse fi
Con la herramienta “hd” podemos ver el contenido en hexadecimal de un archivo. Se puede ver que el disk-1.img (que se encuentra vacío) muestra todos “00” mientras que un archivo pdf muestra contenido en todos sus bloques.
root@backupserver:/# ls -larth file1.pdf -rwx------ 1 1000 1000 12K Feb 1 10:44 file1.pdf
root@backupserver:/# ls -larth disk-1.img -rwx------ 1 1000 1000 30G Jun 1 05:03 disk-1.img