En informática , un archivo disperso es un tipo de archivo informático que intenta utilizar el espacio del sistema de archivos de forma más eficiente cuando el propio archivo está parcialmente vacío. Esto se consigue escribiendo información breve ( metadatos ) que representa los bloques vacíos en el medio de almacenamiento de datos en lugar del espacio "vacío" real que compone el bloque, consumiendo así menos espacio de almacenamiento. El bloque completo se escribe en el medio con el tamaño real solo cuando el bloque contiene datos "reales" (no vacíos).
Lo más común es que los archivos dispersos se creen cuando nunca se escriben bloques del archivo. Esto es típico de los archivos de acceso aleatorio, como las bases de datos. Algunos sistemas operativos o utilidades van más allá y "dispersan" los archivos al escribirlos o copiarlos: si un bloque contiene solo bytes nulos, no se escribe en el almacenamiento, sino que se marca como vacío.
Al leer archivos dispersos, el sistema de archivos convierte de forma transparente los metadatos que representan bloques vacíos en bloques "reales" llenos de bytes nulos en tiempo de ejecución. La aplicación no es consciente de esta conversión.
La mayoría de los sistemas de archivos modernos admiten archivos dispersos, incluidas la mayoría de las variantes de Unix y NTFS . [1] HFS+ de Apple no proporciona soporte para archivos dispersos, pero en OS X, la capa del sistema de archivos virtual admite almacenarlos en cualquier sistema de archivos compatible, incluido HFS+. [ cita requerida ] Apple File System (APFS) también los admite. [2] Los archivos dispersos se utilizan comúnmente para imágenes de disco , instantáneas de bases de datos , archivos de registro y en aplicaciones científicas.
La ventaja de los archivos dispersos es que el espacio de almacenamiento solo se asigna cuando realmente se necesita: se conserva la capacidad de almacenamiento y, ocasionalmente, se pueden crear archivos grandes incluso si no hay suficiente espacio libre disponible para el archivo original en el medio de almacenamiento. Esto también reduce el tiempo de la primera escritura, ya que el sistema no tiene que asignar bloques para el espacio "omitido". Si la asignación inicial requiere escribir todos los ceros en el espacio, también evita que el sistema tenga que escribir sobre el espacio "omitido" dos veces.
Por ejemplo, una imagen de máquina virtual con un tamaño máximo de 100 GB que tiene 2 GB de archivos escritos realmente requeriría los 100 GB completos cuando está respaldada por almacenamiento preasignado, pero solo 2 GB en un archivo disperso. Si el sistema de archivos admite la perforación de orificios y el sistema operativo invitado emite comandos TRIM , la eliminación de archivos en el invitado reducirá en consecuencia el espacio necesario.
Las desventajas son que los archivos dispersos pueden fragmentarse ; los informes de espacio libre del sistema de archivos pueden ser engañosos; llenar los sistemas de archivos que contienen archivos dispersos puede tener efectos inesperados (como errores de disco lleno o de cuota excedida cuando simplemente se sobrescribe una parte existente de un archivo que resultó ser disperso); y copiar un archivo disperso con un programa que no los admita explícitamente puede copiar el tamaño completo sin comprimir del archivo, incluidas las secciones cero que no están asignadas en el medio de almacenamiento, perdiendo los beneficios de la propiedad dispersa en el archivo. Los archivos dispersos tampoco son totalmente compatibles con todo el software o las aplicaciones de copia de seguridad. Sin embargo, la implementación de VFS evita [ cita requerida ] las dos desventajas anteriores. La carga de ejecutables en Windows de 32 bits (exe o dll) que son dispersos lleva mucho más tiempo ya que el archivo no se puede mapear en memoria en el espacio de dirección limitado de 4 GB y no se almacenan en caché ya que no hay una ruta de código para almacenar en caché ejecutables dispersos de 32 bits (Windows en arquitecturas de 64 bits puede mapear ejecutables dispersos). [ cita requerida ] En NTFS, los archivos dispersos (o más bien sus áreas distintas de cero) no se pueden comprimir. NTFS implementa la escasez como un tipo especial de compresión, por lo que un archivo puede ser disperso o estar comprimido.
Los archivos dispersos suelen manejarse de forma transparente para el usuario, pero las diferencias entre un archivo normal y un archivo disperso se hacen evidentes en algunas situaciones.
El comando Unix
dd de = archivo disperso bs = 5M búsqueda = 1 conteo = 0
creará un archivo de cinco mebibytes de tamaño, pero sin datos almacenados en el medio (solo metadatos ). ( GNU dd
tiene este comportamiento porque llama ftruncate
para establecer el tamaño del archivo; otras implementaciones pueden simplemente crear un archivo vacío).
De manera similar, se puede utilizar el comando truncar, si está disponible:
truncar -s 5M <nombre de archivo>
En Linux , un archivo existente se puede convertir en disperso mediante:
fallocate -d <nombre de archivo>
No existe ninguna llamada al sistema portable para hacer agujeros; Linux proporciona fallocate(FALLOC_FL_PUNCH_HOLE)
, y Solaris proporciona fcntl(F_FREESP)
.
La -s
opción del ls
comando muestra el espacio ocupado en bloques.
ls -ls archivo disperso
Como alternativa, el du
comando imprime el espacio ocupado, mientras que ls
imprime el tamaño aparente. En algunas versiones no estándar de du
, la opción --block-size=1
imprime el espacio ocupado en bytes en lugar de bloques, de modo que se pueda comparar con la ls
salida:
du --block-size = 1 archivo dispersols -l archivo disperso
Tenga en cuenta que el uso de du anterior tiene el formato de sintaxis de opción abreviado "du -B 1 sf", equivalente a la versión más corta "du -b sf", como se indica en el manual de du: [3] -b, --bytes
es equivalente a --apparent-size --block-size=1
.
Además, la herramienta filefrag
del e2fsprogs
paquete se puede utilizar para mostrar detalles de asignación de bloques del archivo.
filefrag -v archivo disperso
Normalmente, la versión GNU de cp
es buena para detectar si un archivo es disperso, por lo que
cp sparse-file nuevo-archivo
crea un nuevo archivo, que será escaso. Sin embargo, GNU cp tiene una --sparse
opción. [4] Esto es especialmente útil si un archivo que contiene bloques de ceros largos se guarda de forma no espaciada (es decir, los bloques de ceros se han escrito en el medio de almacenamiento en su totalidad). Se puede conservar espacio de almacenamiento haciendo lo siguiente:
cp --sparse=siempre archivo1 archivo1_sparsed
Algunas implementaciones de cp, como cp de FreeBSD , no admiten la --sparse
opción y siempre expandirán los archivos dispersos. Una alternativa parcialmente viable en esos sistemas es usar rsync con su propia --sparse
opción [5] en lugar de cp. Lamentablemente, --sparse
no se puede combinar con --inplace
. [6] [7] Las versiones más nuevas de rsync sí admiten --sparse
la combinación con --inplace
. [8]
A través de la entrada estándar , la copia de archivos dispersos se logra de la siguiente manera:
cp --sparse = siempre /dev/fd/0 nuevo-archivo-sparse < algún-archivo