En informática , un archivo disperso es un tipo de archivo de computadora que intenta utilizar el espacio del sistema de archivos de manera más eficiente cuando el archivo en sí está parcialmente vacío. Esto se logra 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 constituye el bloque, consumiendo así menos espacio de almacenamiento. El bloque completo se escribe en el medio como el tamaño real sólo 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 archivos de acceso aleatorio como bases de datos. Algunos sistemas operativos o utilidades van más allá al "dispersar" archivos al escribirlos o copiarlos: si un bloque contiene sólo 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 desconoce 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 brinda 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 necesaria ] 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 sólo se asigna cuando realmente se necesita: la capacidad de almacenamiento se conserva y ocasionalmente se pueden crear archivos grandes incluso si no hay suficiente espacio libre disponible en el medio de almacenamiento para el archivo original. 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 dos veces sobre el espacio "omitido".
Por ejemplo, una imagen de máquina virtual con un tamaño máximo de 100 GB que tiene 2 GB de archivos realmente escritos requeriría los 100 GB completos cuando esté respaldada por un almacenamiento preasignado, pero solo 2 GB en un archivo disperso. Si el sistema de archivos admite la perforación y el sistema operativo invitado emite comandos TRIM , eliminar 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 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 del archivo. Los archivos dispersos tampoco son totalmente compatibles con todos los programas o aplicaciones de respaldo. Sin embargo, la implementación de VFS evita [ cita necesaria ] las dos desventajas anteriores. La carga de ejecutables en Windows de 32 bits (exe o dll) que son escasos lleva mucho más tiempo ya que el archivo no se puede asignar en memoria en el espacio de direcciones limitado de 4 GB y no se almacena en caché ya que no existe una ruta de código para almacenar en caché ejecutables dispersos de 32 bits ( Windows en arquitecturas de 64 bits puede asignar ejecutables dispersos). [ cita necesaria ] En NTFS, los archivos dispersos (o más bien sus áreas distintas de cero) no se pueden comprimir. NTFS implementa la dispersión como un tipo especial de compresión, por lo que un archivo puede estar disperso o comprimido.
Los archivos dispersos normalmente se manejan 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 recuento = 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 usar el comando truncar, si está disponible:
truncar -s 5M < nombre de archivo>
En Linux , un archivo existente se puede convertir a disperso mediante:
fallocate -d <nombre de archivo>
No existe una llamada al sistema portátil para perforar 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
Alternativamente, el du
comando imprime el espacio ocupado, mientras ls
imprime el tamaño aparente. En algunas versiones no estándar de du
, la opción {{{1}}} imprime el espacio ocupado en bytes en lugar de bloques, para que pueda compararse 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 abreviada "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 los detalles de asignación de bloques del archivo.
filefrag -v archivo disperso
Normalmente, la versión GNU cp
es buena para detectar si un archivo es disperso, por lo que
cp archivo disperso 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 cero largos se guarda de forma no dispersa (es decir, los bloques cero se han escrito en el medio de almacenamiento en su totalidad). El espacio de almacenamiento se puede conservar haciendo:
cp --sparse=siempre archivo1 archivo1_sparsed
Algunas implementaciones de cp, como cp de FreeBSD--sparse
, no admiten la opción y siempre expandirán 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 recientes de rsync admiten --sparse
la combinación con --inplace
. [8]
A través de la entrada estándar , la copia dispersa de archivos se logra de la siguiente manera:
cp --sparse = siempre /dev/fd/0 nuevo-archivo-disperso < algún archivo