GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué la salida de `du` a menudo es tan diferente de `du -b`?

Compara (por ejemplo) du -bm a du -m .

El -b establece --apparent-size --block-size=1 ,pero luego el m anula el tamaño del bloque para que sea 1M .

Similar para -bh contra -h :el -bh significa --apparent-size --block-size=1 --human-readable , y de nuevo el h anula ese tamaño de bloque.


Tamaño aparente es el número de bytes que sus aplicaciones creen que hay en el archivo. Es la cantidad de datos que se transferirían a través de la red (sin contar los encabezados de protocolo) si decidiera enviar el archivo a través de FTP o HTTP. También es el resultado de cat theFile | wc -c y la cantidad de espacio de direcciones que ocuparía el archivo si carga todo usando mmap .

Uso de disco es la cantidad de espacio que no se puede usar para otra cosa porque su archivo está ocupando ese espacio.

En la mayoría de los casos, el tamaño aparente es más pequeño que el uso del disco porque el uso del disco cuenta el tamaño completo del último bloque (parcial) del archivo, y el tamaño aparente solo cuenta los datos que están en ese último bloque. Sin embargo, el tamaño aparente es mayor cuando tiene un archivo disperso (los archivos dispersos se crean cuando busca en algún lugar más allá del final del archivo y luego escribe algo allí; el sistema operativo no se molesta en crear muchos bloques llenos de ceros). - solo crea un bloque para la parte del archivo que decidiste escribir).


Ejemplo de granularidad de bloque mínimo

Juguemos un poco para ver qué está pasando.

mount me dice que estoy en una partición ext4 montada en / .

Encuentro su tamaño de bloque con:

stat -fc %s .

que da:

4096

Ahora vamos a crear algunos archivos con tamaños 1 4095 4096 4097 :

#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
  dd if=/dev/zero of=f bs=1 count="${size}" status=none
  echo "size     ${size}"
  echo "real     $(du --block-size=1 f)"
  echo "apparent $(du --block-size=1 --apparent-size f)"
  echo
done

y los resultados son:

size     1
real     4096   f
apparent 1      f

size     4095
real     4096   f
apparent 4095   f

size     4096
real     4096   f
apparent 4096   f

size     4097
real     8192   f
apparent 4097   f

Entonces vemos que cualquier cosa por debajo o igual a 4096 ocupa 4096 bytes de hecho.

Entonces, tan pronto como crucemos 4097 , sube a 8192 que es 2 * 4096 .

Está claro entonces que el disco siempre almacena datos en un límite de bloque de 4096 bytes.

¿Qué ocurre con los archivos dispersos?

No he investigado cuál es la representación exacta, pero está claro que --apparent lo tiene en cuenta.

Esto puede llevar a que los tamaños aparentes sean mayores que el uso real del disco.

Por ejemplo:

dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f

da:

8192    f
1073741825      f

Relacionado:Cómo probar si se admite un archivo disperso

¿Qué debo hacer si quiero almacenar un montón de archivos pequeños?

Algunas posibilidades son:

  • usar una base de datos en lugar de un sistema de archivos:base de datos frente a almacenamiento en el sistema de archivos
  • usar un sistema de archivos que admita la subasignación de bloques

Bibliografía:

  • https://serverfault.com/questions/565966/cuáles-tamaños-de-bloque-para-millones-de-archivos-pequeños
  • https://askubuntu.com/questions/641900/how-file-system-block-size-works

Probado en Ubuntu 16.04.


Linux
  1. Obtenga los últimos 4 caracteres de salida desde la salida estándar

  2. ¿Por qué pr_debug del kernel de Linux no da ningún resultado?

  3. ¿Por qué el tamaño de la partición de intercambio debe ser el doble del tamaño de la RAM?

  4. ¿Por qué el tamaño de un directorio siempre es de 4096 bytes en Unix?

  5. ¿Cuál es la columna de buffers en la salida de free?

¿Por qué no instalar paquetes de software desde Internet?

Grep:¿por qué los corchetes en el patrón Grep eliminan el proceso Grep de los resultados de Ps?

¿Cómo hacer que `date` genere la hora de una zona horaria diferente?

Linux:¿la columna de búferes en la salida de Free?

¿Por qué Grep -o -w no me da la salida esperada en Mac Os X?

Guardar la salida de un comando desde la terminal de Debian a un archivo