Skip to main content

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

root@backupserver:/backup/# tree -h
[ 49] .
├── [4.0K] Server1
│   ├── [ 20G] disk-1.img
│   └── [ 20G] disk-2.img
├── [ 456] Server2
│   ├── [ 20G] disk-1.img
│   └── [ 20G] disk-2.img
├── [ 48] Server3
├── [ 48] Server4
├── [ 456] Server5
│   ├── [100G] disk-1.img
│   └── [100G] disk-2.img
└── [ 184] Server6
└── [ 30G] disk-1.img

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

root@backupserver:/# fdisk -l
Disk /dev/sda: 223.57 GiB, 240057409536 bytes, 468862128 sectors
Disk model: N/A
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

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 73G 152G 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.

wikipedia.com

Como todo feature, tiene sus lados positivos y negativos. Se listan a continuación

VentajasDesventajas
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. 

CP(1)                                                           User Commands

NAME
cp - copy files and directories

SYNOPSIS
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

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.

ctrl.blog

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

root@backupserver:/# hd file1.pdf | head
00000000 25 50 44 46 2d 31 2e 33 0a 25 c4 e5 f2 e5 eb a7 |%PDF-1.3.%......|
00000010 f3 a0 d0 c4 c6 0a 33 20 30 20 6f 62 6a 0a 3c 3c |......3 0 obj.<<|
00000020 20 2f 46 69 6c 74 65 72 20 2f 46 6c 61 74 65 44 | /Filter /FlateD|
00000030 65 63 6f 64 65 20 2f 4c 65 6e 67 74 68 20 38 36 |ecode /Length 86|
00000040 20 3e 3e 0a 73 74 72 65 61 6d 0a 78 01 2b 54 08 | >>.stream.x.+T.|
00000050 54 28 54 d0 77 2e 36 54 48 2e 56 30 00 c3 e2 64 |T(T.w.6TH.V0...d|
00000060 a0 90 81 9e 91 09 84 0f 61 58 5a 98 e8 59 9a 29 |........aXZ..Y.)|
00000070 24 e7 2a 38 85 28 98 42 14 02 29 63 03 03 05 4b |$.*8.(.B..)c...K|
00000080 13 0b 85 90 5c 2e fd 90 10 23 05 43 85 90 34 05 |....\....#.C..4.|
00000090 0d 45 4d 85 90 2c 05 d7 10 a0 e1 81 00 26 58 15 |.EM..,.......&X.|

root@backupserver:/# hd disk-1.img | head
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
780000000

En caso que se quiera ver el tamaño real del archivo en cuestión, podemos utilizar “du”.

root@backupserver:/backup/# ls -larth file1.img 
-rwx------ 1 user1 user1 100G Jul 11 04:37 file1.img

root@backupserver:/backup/# du -Bh file1.img
18G
file1.img

Sources: wikipedia.com

El contenido de este artículo esta bajo licencia Creative Commons.