En ciencias de la computación , un archivo disperso es un tipo de archivo de computadora que intenta usar 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 represente los bloques vacíos en el disco en lugar del espacio "vacío" real que constituye el bloque, utilizando menos espacio en disco. El tamaño del bloque completo se escribe en el disco como el tamaño real solo cuando el bloque contiene datos "reales" (no vacíos).
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] El HFS + de Apple no proporciona archivos dispersos, pero en OS X, la capa del sistema de archivos virtual permite almacenarlos en cualquier sistema de archivos compatible, incluido HFS + [ cita requerida ] . Apple File System (APFS), anunciado en junio de 2016 en WWDC, 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.
Ventajas
La ventaja de los archivos dispersos es que el almacenamiento solo se asigna cuando realmente se necesita: se ahorra espacio en el disco y se pueden crear archivos grandes incluso si no hay suficiente espacio libre en el sistema de archivos. 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 almacenamiento preasignado, pero solo 2 GB en un archivo disperso. Si el sistema de archivos admite la perforación de agujeros y el sistema operativo invitado emite comandos TRIM , la eliminación de archivos en el invitado reducirá el espacio necesario.
Desventajas
Las desventajas son que los archivos dispersos pueden fragmentarse ; los informes de espacio libre del sistema de archivos pueden ser engañosos; el llenado de sistemas de archivos que contienen archivos dispersos puede tener efectos inesperados (como errores de disco lleno o superada la cuota cuando simplemente se sobrescribe una parte existente de un archivo que resultó ser escasa); y copiar un archivo disperso con un programa que no los admite explícitamente puede copiar todo el tamaño sin comprimir del archivo, incluidas las secciones cero que no están asignadas en el disco, perdiendo los beneficios de la propiedad dispersa en el archivo. Los archivos dispersos tampoco son totalmente compatibles con todas las aplicaciones o software de copia de seguridad. Sin embargo, la implementación de VFS evita [ cita requerida ] las dos desventajas anteriores. La carga de archivos ejecutables en Windows de 32 bits (exe o dll) que son escasos lleva mucho más tiempo, ya que el archivo no se puede mapear en la memoria en el espacio de direcciones limitado de 4 GB y no se almacenan en caché ya que no hay una ruta de código para almacenar en caché los ejecutables dispersos de 32 bits (Windows en Las arquitecturas de 64 bits pueden mapear ejecutables dispersos). [ cita requerida ] En el archivo disperso NTFS (o más bien sus áreas distintas de cero) no se puede comprimir. NTFS implementa la escasez como un tipo especial de compresión, por lo que un archivo puede ser escaso o comprimido.
Archivos dispersos en Unix
Los archivos dispersos generalmente se manejan de manera transparente para el usuario. Pero las diferencias entre un archivo normal y un archivo disperso se hacen evidentes en algunas situaciones.
Creación
El comando de Unix
dd of = sparse-file bs = 5M seek = 1 count = 0
creará un archivo de cinco mebibytes de tamaño, pero sin datos almacenados en el disco (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
En Linux , un archivo existente se puede convertir en disperso mediante:
fallocate -d
Por desgracia, no hay una forma portátil de hacer agujeros; la llamada al sistema es fallocate (FALLOC_FL_PUNCH_HOLE) en Linux, fcntl (F_FREESP) en Solaris .
Detección
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 --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 disperso ls -l archivo disperso
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
Proceso de copiar
Normalmente, la versión GNU de cp
es buena para detectar si un archivo es escaso, por lo que
cp archivo disperso archivo nuevo
crea un archivo nuevo, que será escaso. Sin embargo, GNU cp tiene una --sparse
opción. [3] Esto es especialmente útil si un archivo que contiene bloques de cero largos se guarda de forma no dispersa (es decir, los bloques de cero se han escrito en el disco por completo). El espacio en disco se puede ahorrar haciendo:
cp --sparse = siempre file1 file1_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 [4] en lugar de cp. Desafortunadamente --sparse
no se puede combinar con --inplace
. [5] [6]
A través de entrada estándar
cp --sparse = always / proc / self / fd / 0 nuevo-archivo-disperso ún>
Ver también
Referencias
- ^ Giampaolo, Dominic (1999). Diseño práctico de un sistema de archivos con el sistema de archivos Be (PDF) . Editores Morgan Kaufmann . ISBN 9781558604971.
- ^ "Guía del sistema de archivos de Apple" . Sitio para desarrolladores de Apple . Apple . Consultado el 27 de abril de 2017 .
- ^ Jim Meyering (21 de diciembre de 1995). "GNU coreutils / cp: Aceptar nueva opción, --sparse = {nunca, auto, siempre}, para controlar la creación de archivos dispersos" . Consultado el 17 de junio de 2016 .
- ^ Tridgell, Andrew (29 de junio de 1996). "rsync: enlaces duros, mejor manejo disperso, FERROR y FINFO" . Consultado el 17 de junio de 2016 .
- ^ Tridgell, Andrew (30 de junio de 2016). "página de manual de rsync" . Consultado el 19 de enero de 2017 .
- ^ Davison, Wayne (30 de agosto de 2005). "rsync: Rechazar intentos de combinar --sparse con --inplace" . Consultado el 19 de enero de 2017 .
enlaces externos
- Archivos dispersos NTFS para programadores
- Crear archivos dispersos en Windows Server usando fsutil
- Creación de archivos dispersos en Solaris con mkfile (1M)
- Ver el tamaño del archivo disperso de una instantánea de base de datos
- SEEK_HOLE o FIEMAP: detección de agujeros en archivos dispersos
- virtsync es una solución comercial para rsync's --sparsey --inplaceissue.
- SparseChecker: utilidad que permite administrar los archivos dispersos en el sistema de archivos NTFS
- Phantom: un programa para convertir archivos en archivos dispersos para reducir el espacio en disco
- Wiki de ArchLinux: archivo disperso