Tamaño aparente de archivos dispersos

Tamaño aparente de archivos dispersos

Creé un archivo Sparse de 8 GB usando

dd if=/dev/zero of=/sparse-file bs=1 count=0 seek=8G

entonces lo hice

echo "test" >> /sparse-file

Veo que du -sh sparse-fileda 16K y du -sh --apparent-size sparse-filemuestra 8.1G.

Pensé que si escribo datos en el archivo, se sobrescribirán los ceros en el archivo disperso, pero en realidad crece. ¿Por qué es así? Si empiezo a llenar 8 GB de datos reales, ¿el tamaño aparente será de 16 GB?

¿Qué hace exactamente "contar" aquí?

Respuesta1

Los archivos "dispersos" son archivos con espacios vacíos que se supone que están llenos de ceros, pero para los cuales esa suposición es suficiente para continuar. Es decir, si lees el archivo, obtendrás ceros, pero como sabemos que son ceros, en realidad no tenemos que escribir 8 GB de ceros. Es suficiente decir: "aceptemos que hay un archivo grande aquí sin asignarle espacio".

A medida que sobrescribe el contenido en blanco del archivo, se asignan bloques en el disco para acomodar lo que está almacenando (ya que ya no puede asumir que son solo ceros). Pero si tuadjuntaral archivo, no estás sobrescribiendo nada. Simplemente estás agregando más al final. Entonces, al agregar, asignas bloques en el disco, pero esos bloques notomar el lugarde sus bloques "imaginarios" existentes; en cambio, los que creas se agregan al final, después de los imaginarios.

Incluso puedes agregarmásbloques imaginarios usando una dd -skipoperación similar a la que usaste para crear el archivo. No es necesario que los bloques "imaginarios" estén todos juntos. Y, de hecho, a medida que sobrescribes los bloques existentes dentro del archivo,sólo se asignarán los bloques que sobrescribas, sin importar dónde aparezcan en el archivo. Es decir, escribir un bloque en la posición 101 no asignará ni completará automáticamente los bloques del 1 al 99.

Respuesta2

En primer lugar, count=0solo copiaste cero bloques de /dev/zero. Asi que nada. seek=8Gse saltó 8 GB de bloques. Preferiría hacerlo con count=1, pero supongo que puedes omitirlo por completo.

Por lo demás, solo leehombre du. La apparent-sizeopción imprime el tamaño aparente en lugar del uso real del disco. Entonces, aunque el primer comando informó que su archivo requiere 16 KB en el disco, el tamaño aparente es 8,1 GB.

Un archivo con contenido de menos de 16 K aún puede requerir 16 K en el disco, según el sistema de archivos subyacente utilizado. Ver elDescripción de GNU Coreutils:

Por ejemplo, un archivo que contenga la palabra 'zoo' sin nueva línea tendría, por supuesto, un tamaño aparente de 3. Un archivo tan pequeño puede requerir de 0 a 16 KiB o más de espacio en disco, según el tipo y la configuración. del sistema de archivos en el que reside el archivo. Sin embargo, un archivo disperso creado con este comando:

dd bs=1 seek=2GiB if=/dev/null of=big

tiene un tamaño aparente de 2 GiB, pero en la mayoría de los sistemas modernos, en realidad casi no utiliza espacio en disco.

información relacionada