Tamaño aparente de archivos dispersos

3

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 escribía datos en el archivo, sobrescribiría 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í?

Manny
fuente

Respuestas:

3

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. Es decir, si lee el archivo, obtendrá ceros, pero como sabemos que son ceros, en realidad no tenemos que escribir ceros por valor de 8 GB. Es suficiente decir, "solo aceptemos que hay un archivo grande aquí sin asignarle espacio".

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

Incluso puede agregar más bloques imaginarios utilizando una dd -skipoperación similar a la que utilizó para crear el archivo. Los bloques "imaginarios" no necesitan estar todos juntos. Y de hecho, a medida que sobrescribe los bloques existentes dentro del archivo, solo se asignarán los bloques que sobrescriba , sin importar dónde aparezcan en el archivo. Es decir, escribir un bloque en la posición 101 no asignará automáticamente y rellenará a cero los bloques del 1 al 99.

tylerl
fuente
0

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

Por lo demás, solo lee man 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 16K en el disco, el tamaño aparente es de 8.1GB.

Un archivo con menos de 16K de contenido aún puede requerir 16K en el disco, dependiendo del sistema de archivos subyacente utilizado. Vea la descripción de GNU Coreutils :

Por ejemplo, un archivo que contiene la palabra 'zoo' sin nueva línea, por supuesto, tendría un tamaño aparente de 3. Un archivo tan pequeño puede requerir entre 0 y 16 KiB o más de espacio en disco, dependiendo del 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 usa espacio en disco.

slhck
fuente