Archivos dispersos (sparse files)

“Permite usar más eficiente de almacenamiento y por consiguiente ahorro de costos”.

¿Qué son?

Son un tipos de archivos que prácticamente están vacíos (casi no usan espacio real de almacenamiento), y simulan un capacidad de almacenamiento alto. Se componen de mentadata y bloques de bytes con valor 0 cero.

Por ejemplo se puede crear y almacenar un disco vacío de 500GB para una máquina virtual, y el tamaño real de uso es 0 cero bytes.

En el disco, el contenido de los archivos es almacenado en bloques de tamaño fijo (usualmente 4KB). Cuando todos los bytes contenidos en ese bloque son 0, el sistema de archivo que implementa el soporte para “sparse files” no almacena el bloque en disco, en vez de eso mantiene la información en la meta data del archivo.

Las ventajas de usar archivos sparse.

Los bloques vacíos no usan espacio en disco. Solo los identificadores son almacenados en la metadato el cual usa muy poco espacio.
La lectura de bloques vacíos es inmediata, ya que el datos no es leído de disco.El sistema de archivos sabe que todos los bytes en ese bloque es 0, por lo que solo asigna el valor 0 en todos los bytes, haciendo que la información esté disponible de manera inmediata. No hay necesidad de acceder al lento sistema almacenamiento.
La escritura de bloques vacíos es inmediato, ya que el datos solo actualiza la meta data para agregar el ID del bloque a la lista de bloques con valor 0.

Soporte

La mayoría de los sistemas operativos modernos soportan estos archivos como Linux, Windows, BSD, MacOS etc.

Usos

El uso más común actualmente, es para almacenamiento virtual (Thin provisioning) como los discos de máquinas virtuales. Se entrega a la aplicación un almacenamiento generalmente grande sin que realmente se use esa cantidad real de datos en el sistema de almacenamiento, haciendo uso muy óptimo de ese recurso.

Creación de archivos sparse.

Usado el comando truncate. Crearemos un archivo de tamaño máximo de 500GB.

truncate -s 500G 500G-file.img

Usando dd, ejemplo:

dd if=/dev/zero of=1GB-file.img bs=1 count=0 seek=1G

0+0 records in
0+0 records out
0 bytes (0 B) copied, 1.3847e-05 s, 0.0 kB/s

Los archivos sparse tienen diferentes tamaños:

  1. Tamaño aparente: el cuál es el máximo tamaño que un archivo sparse puede crecer.
  2. Tamaño actual: La cantidad real de espacio usado.

Para saber el tamaño aparente usar.

du -sh --apparent-size 500G-file.img
500G 500G-file.img

Para saber el tamaño real usar:

du -sh 500G-file.img
0 500G-file.img

Ejemplo de uso:

Crear un sparse como sistema de archivo.

En este ejemplo crearemos un archivo sparse con un tamaño máximo de 1TB y se montara en el directorio /mnt/1024GB

truncate -s 1T TB-file.img

Verificamos el tamaño:

du -h --apparent-size TB-file.img
1.0T TB-file.img

du -h TB-file.img
0 TB-file.img

[email protected]~/test#

Creamos el sistema de archivos xfs por ejemplo:

mkfs.xfs TB-file.img

Montamos en /mnt/1024GB

mkdir /mnt/1024GB
mount -o loop /root/test/TB-file.img /mnt/1024GB

Verificamos

[email protected]~/test#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/lvmssse11sp3-root 79G 4.4G 71G 6% /
udev 48G 428K 48G 1% /dev
tmpfs 48G 0 48G 0% /dev/shm
/dev/sda1 387M 42M 326M 12% /boot
/dev/loop0 1.0T 33M 1.0T 1% /mnt/1024GB
[email protected]~/test#

Escribimos datos, y verificamos el uso real del archivo sparse:

tar cf /mnt/1024GB/etc.tar /etc

El tamaño del archivo tar es:

du -sh /mnt/1024GB/etc.tar
70M /mnt/1024GB/etc.tar

El tamano aparente y real del sparse file es:

[email protected]~/test#du -h --apparent-size /root/test/TB-file.img
1.0T /root/test/TB-file.img
[email protected]~/test#du -sh /root/test/TB-file.img
582M /root/test/TB-file.img
[email protected]~/test#<br>

Para el sistema de archivo tenemos un disco de 1TB de espacio usable, sin embargo solo está usando 582 MB reales de almacenamiento.