¿Por qué hay tantas formas diferentes de medir el uso del disco?

114

Cuando sumo el tamaño de mis archivos, obtengo una cifra. Si corro du, obtengo otra figura. Si ejecuto dutodos los archivos de mi partición, no coincide con las dfafirmaciones que se utilizan. ¿Por qué hay tantas cifras diferentes para el tamaño total de mis archivos? ¿No pueden agregar computadoras?

Hablando de agregar: cuando agrego las columnas “Usado” y “Disponible” de df, no obtengo la cifra total. Y esa cifra total es más pequeña que el tamaño de mi partición. Y si sumo el tamaño de mi partición, ¡no obtengo el tamaño de mi disco! ¿Lo que da?

Gilles
fuente

Respuestas:

144

Sumar números es fácil. El problema es que hay muchos números diferentes para agregar.

¿Cuánto espacio en disco usa un archivo?

La idea básica es que un archivo que contiene n bytes usa n bytes de espacio en disco, más un bit para cierta información de control: los metadatos del archivo (permisos, marcas de tiempo, etc.) y un poco de sobrecarga para la información que el sistema necesita encuentre dónde está almacenado el archivo. Sin embargo, hay muchas complicaciones.

Complicaciones microscópicas

Piense en cada archivo como una serie de libros en una biblioteca. Los archivos más pequeños constituyen solo un volumen, pero los archivos más grandes consisten en muchos volúmenes, como una enciclopedia. Para poder localizar los archivos, hay un catálogo de tarjetas que hace referencia a cada volumen. Cada volumen tiene un poco de sobrecarga debido a las cubiertas. Si un archivo es muy pequeño, esta sobrecarga es relativamente grande. También el catálogo de tarjetas en sí ocupa algo de espacio.

Yendo un poco más técnico, en un sistema de archivos simple típico, el espacio se divide en bloques . Un tamaño de bloque típico es 4KiB. Cada archivo ocupa un número entero de bloques. A menos que el tamaño del archivo sea un múltiplo del tamaño del bloque, el último bloque solo se usa parcialmente. Entonces, un archivo de 1 byte y un archivo de 4096 bytes ocupan 1 bloque, mientras que un archivo de 4097 bytes ocupa dos bloques. Puede observar esto con el ducomando: si su sistema de archivos tiene un tamaño de bloque de 4KiB, duinformará 4KiB para un archivo de 1 byte.

Si un archivo es grande, entonces se necesitan bloques adicionales solo para almacenar la lista de bloques que componen el archivo (estos son bloques indirectos ; los sistemas de archivos más sofisticados pueden optimizar esto en forma de extensiones ). Esos no se muestran en el tamaño del archivo según lo informado por ls -lo GNU du --apparent-size; du, que informa el uso del disco en lugar del tamaño, los tiene en cuenta.

Algunos sistemas de archivos intentan reutilizar el espacio libre que queda en el último bloque para empaquetar varias colas de archivos en el mismo bloque . Algunos sistemas de archivos (como ext4 desde Linux 3.8 usan bloques 0 para archivos pequeños (solo unos pocos bytes) que encajan completamente en el inodo.

Complicaciones macroscópicas

En general, como se vio anteriormente, el tamaño total informado por dues la suma de los tamaños de los bloques o extensiones utilizados por el archivo.

El tamaño informado por dupuede ser menor si el archivo está comprimido. Los sistemas Unix tradicionalmente admiten una forma cruda de compresión: si un bloque de archivos contiene solo bytes nulos, en lugar de almacenar un bloque de ceros, el sistema de archivos puede omitir ese bloque por completo. Un archivo con bloques omitidos como este se llama un archivo disperso . Los archivos dispersos no se crean automáticamente cuando un archivo contiene una gran serie de bytes nulos, la aplicación debe organizar que el archivo se vuelva disperso.

Algunos sistemas de archivos como btrfs y zfs admiten la compresión de uso general .

Complicaciones avanzadas

Dos características principales de sistemas de archivos muy modernos como zfs y btrfs hacen que la relación entre el tamaño del archivo y el uso del disco sea significativamente más distante: las instantáneas y la deduplicación.

Las instantáneas son un estado congelado del sistema de archivos en una fecha determinada. Los sistemas de archivos que admiten esta función pueden contener múltiples instantáneas tomadas en diferentes fechas. Estas instantáneas toman espacio, por supuesto. En un extremo, si elimina todos los archivos de la versión activa del sistema de archivos, el sistema de archivos no se vaciará si quedan instantáneas.

Cualquier archivo o bloque que no haya cambiado desde que se tomó una instantánea, o entre dos instantáneas, existe idénticamente en la instantánea y en la versión activa u otra instantánea. Esto se implementa mediante copia en escritura . En algunos casos extremos, es posible que la eliminación de un archivo en un sistema de archivos completo falle debido a la falta de espacio disponible, porque eliminar ese archivo requeriría hacer una copia de un bloque en el directorio, y no hay más espacio para ese bloque.

La deduplicación es una técnica de optimización de almacenamiento que consiste en evitar almacenar bloques idénticos. Con datos típicos, buscar duplicados no siempre vale la pena. Tanto zfs como btrfs admiten la deduplicación como una característica opcional.

¿Por qué el total es dudiferente de la suma de los tamaños de archivo?

Como hemos visto anteriormente, el tamaño informado por ducada archivo normalmente es la suma de los tamaños de los bloques o extensiones utilizados por el archivo. Tenga en cuenta que, de forma predeterminada, ls -lenumera los tamaños en bytes, pero duenumera los tamaños en KiB o en unidades de 512 bytes (sectores) en algunos sistemas más tradicionales ( du -kobliga al uso de kilobytes). La mayoría de las unidades modernas admiten ls -lhy du -husar números "legibles para humanos" usando K, M, G, etc. es suficiente (para KiB, MiB, GiB) según corresponda.

Cuando se ejecuta duen un directorio, resume el uso del disco de todos los archivos en el árbol de directorios, incluidos los propios directorios . Un directorio contiene datos (los nombres de los archivos y un puntero a donde están los metadatos del archivo), por lo que necesita un poco de espacio de almacenamiento. Un directorio pequeño ocupará un bloque, un directorio más grande requerirá más bloques. La cantidad de almacenamiento utilizado por un directorio a veces depende no solo de los archivos que contiene, sino también del orden en que se insertaron y en el que se eliminan algunos archivos (con algunos sistemas de archivos, esto puede dejar agujeros, un compromiso entre el espacio en disco y el rendimiento ), pero la diferencia será pequeña (un bloque adicional aquí y allá). Cuando corresls -ld /some/directory, se enumera el tamaño del directorio. (Tenga en cuenta que la línea "NNN total" en la parte superior de la salida de ls -les un número no relacionado, es la suma de los tamaños en bloques de los elementos enumerados, expresados ​​en KiB o sectores).

Tenga en cuenta que duincluye archivos de puntos que lsno se muestran a menos que use la opción -Ao -a.

A veces duinforma menos que la suma esperada. Esto sucede si hay enlaces duros dentro del árbol de directorios: ducuenta cada archivo solo una vez.

En algunos sistemas de archivos como ZFSen Linux, duno informa el espacio de disco completo ocupado por los atributos extendidos de un archivo.

Tenga en cuenta que si hay puntos de montaje en un directorio, dutambién contará todos los archivos en estos puntos de montaje, a menos que se le dé la -xopción. Entonces, si por ejemplo desea el tamaño total de los archivos en su sistema de archivos raíz, ejecute du -x /, no du /.

Si un sistema de archivos está montado en un directorio no vacío , el sistema de archivos montado oculta los archivos en ese directorio. Todavía ocupan su espacio, pero duno los encontrarán.

Archivos borrados

Cuando se elimina un archivo , esto solo elimina la entrada del directorio, no necesariamente el archivo en sí. Dos condiciones son necesarias para eliminar realmente un archivo y así recuperar su espacio en disco:

  • El recuento de enlaces del archivo debe caer a 0: si un archivo tiene varios enlaces duros, eliminar uno no afecta a los demás.
  • Mientras el archivo esté abierto por algún proceso, los datos permanecerán. Solo cuando todos los procesos han cerrado el archivo se elimina el archivo. La salida fuser -mo lsofen un punto de montaje incluye los procesos que tienen un archivo abierto en ese sistema de archivos, incluso si el archivo se elimina.
  • incluso si ningún proceso tiene abierto el archivo eliminado, el espacio del archivo no se puede reclamar si ese archivo es el back-end de un loopdispositivo. losetup -a(as root) puede decirle qué loopdispositivos están configurados actualmente y en qué archivo. El dispositivo de bucle debe destruirse (con losetup -d) antes de poder recuperar el espacio en disco.

Si elimina un archivo en algunos administradores de archivos o entornos de GUI, se puede colocar en un área de basura donde no se puede recuperar. Mientras el archivo se pueda recuperar, su espacio se seguirá consumiendo.

¿De qué son dfexactamente estos números ?

Un sistema de archivos típico contiene:

  • Bloques que contienen datos de archivos (incluidos directorios) y algunos metadatos (incluidos bloques indirectos y atributos extendidos en algunos sistemas de archivos).
  • Bloques gratis.
  • Bloques que están reservados para el usuario root.
  • superbloques y otra información de control.
  • Inodos
  • Un diario

Solo el primer tipo es reportado por du. Cuando se trata de dflo que se incluye en las columnas "usado", "disponible" y total depende del sistema de archivos (por supuesto, los bloques usados ​​(incluidos los indirectos) siempre están en la columna "usada", y los bloques no utilizados siempre están en el " disponible ").

Los sistemas de archivos en ext2 / ext3 / ext4 reservan el 5% del espacio para el usuario root. Esto es útil en el sistema de archivos raíz, para mantener el sistema funcionando si se llena (en particular para el registro, y para permitir que el administrador del sistema almacene un poco de datos mientras soluciona el problema). Incluso para particiones de datos como /home, mantener ese espacio reservado es útil porque un sistema de archivos casi lleno es propenso a la fragmentación. Linux intenta evitar la fragmentación (lo que ralentiza el acceso a los archivos, especialmente en dispositivos mecánicos rotativos, como discos duros) asignando previamente muchos bloques consecutivos cuando se está escribiendo un archivo, pero si no hay muchos bloques consecutivos, eso no puede funcionar .

Los sistemas de archivos tradicionales, que incluyen ext4 pero no btrfs, reservan un número fijo de inodos cuando se crea el sistema de archivos. Esto simplifica significativamente el diseño del sistema de archivos, pero tiene el inconveniente de que el número de inodos debe dimensionarse correctamente: con demasiados inodos, se desperdicia espacio; con muy pocos inodes, el sistema de archivos puede quedarse sin inodos antes de quedarse sin espacio. El comando df -iinforma cuántos inodos están en uso y cuántos están disponibles (los sistemas de archivos donde el concepto no es aplicable pueden informar 0).

La ejecución tune2fs -len el volumen que contiene un sistema de archivos ext2 / ext3 / ext4 informa algunas estadísticas que incluyen el número total y el número de inodos y bloques libres.

Otra característica que puede confundir la materia son los subvolúmenes (admitidos en btrfs y en zfs bajo los conjuntos de datos de nombre ). Múltiples subvolúmenes comparten el mismo espacio, pero tienen raíces de árbol de directorio separadas.

Si un sistema de archivos está montado sobre la red (NFS, Samba, etc.) y el servidor exporta una parte de ese sistema de archivos (por ejemplo, el servidor tiene un /homesistema de archivos y exporta/home/bob ), entonces dfun cliente refleja los datos de todo el sistema de archivos, no solo para la parte que se exporta y monta en el cliente.

¿Qué está usando el espacio en mi disco?

Como hemos visto anteriormente, el tamaño total informado por dfno siempre tiene en cuenta todos los datos de control del sistema de archivos. Utilice herramientas específicas del sistema de archivos para obtener el tamaño exacto del sistema de archivos si es necesario. Por ejemplo, con ext2 / ext3 / ext4, ejecute tune2fs -ly multiplique el tamaño del bloque por el recuento de bloques.

Cuando crea un sistema de archivos, normalmente llena el espacio disponible en la partición o volumen adjunto. A veces puede terminar con un sistema de archivos más pequeño cuando ha estado moviendo sistemas de archivos o cambiando el tamaño de los volúmenes.

En Linux, lsblkpresenta una buena descripción de los volúmenes de almacenamiento disponibles. Para obtener información adicional o si no la tiene lsblk, use herramientas especializadas de administración de volúmenes o particiones para verificar qué particiones tiene. En Linux, hay lvs, vgs, pvspara LVM , fdiskpara PC tradicional de estilo ( “MBR”) particiones (así como GPT en sistemas recientes), gdiskpara GPT particiones, disklabelpara etiquetas de disco BSD, Parted , etc. Bajo Linux, cat /proc/partitionsda un breve resumen. Las instalaciones típicas tienen al menos dos particiones o volúmenes utilizados por el sistema operativo: un sistema de archivos (a veces más) y un volumen de intercambio .

Algunas computadoras tienen una partición que contiene el BIOS u otro software de diagnóstico. Las computadoras con UEFI tienen una partición dedicada del cargador de arranque.

Finalmente, tenga en cuenta que la mayoría de los programas de computadora usan unidades basadas en potencias de 1024 = 2 10 (porque los programadores aman el binario y las potencias de 2). Entonces 1 kB = 1024 B, 1 MB = 1048576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B, ... Oficialmente, estas unidades se conocen como kibibyte KiB, mebibyte MiB, etc., pero la mayoría del software solo informa k o kB, M o MB, etc. Por otro lado, los fabricantes de discos duros utilizan sistemáticamente métrica (unidades basadas en 1000). De modo que la unidad de 1 TB tiene solo 931 GiB o 0.904 TiB.

Gilles
fuente
1
@Kiwy tune2fsrequiere tener acceso de lectura al dispositivo de bloque que contiene el sistema de archivos, que en general requiere ser root ya que le permite leer el contenido de cualquier archivo.
Gilles
21
Sé que se desaconseja 'gracias' en SE, pero Gilles te mereces un enorme 'Gracias' por esta excelente publicación.
dotancohen
1
Recuerdo haber visto un catálogo de tarjetas cuando tenía 6 años. Me pregunto cuántos no sabrán qué son.
Izkata
1
@ illuminÉ Eso es Solaris demasiado avanzado para mí, no sé a qué nivel se ajusta.
Gilles
1
du hace la cuenta de bloques indirectos. Esa es la principal diferencia con el tamaño del archivo según lo informado por ls -l.
Stéphane Chazelas
4

Un breve resumen de las complicaciones para calcular los tamaños de archivo y los espacios en disco:

  • El espacio que ocupa el archivo en el disco es un multiplicador de la cantidad de bloques que toma contra el tamaño de cada bloque + la cantidad de inodos que toma. Un archivo de 1 byte tendrá al menos 1 bloque, 1 inodo y una entrada de directorio.

    Pero podría tomar solo 1 entrada de directorio adicional si el archivo es un enlace duro a otro archivo. Sería solo otra referencia al mismo conjunto de bloques.

  • El tamaño del contenido del archivo. Esto es lo que se lsmuestra.
  • El espacio libre en el disco no es el tamaño del archivo más grande en el que puede caber ni la suma de todos los tamaños de contenido del archivo que caben en el disco. Está en algún punto intermedio. Depende de la cantidad de archivos (que ocupan inodes) el tamaño del bloque y qué tan cerca los contenidos de cada archivo llenan los bloques por completo.

Esto solo rasca la superficie de los sistemas de archivos y se simplifica demasiado. También recuerde que los diferentes sistemas de archivos funcionan de manera diferente.

states muy útil para detectar parte de esta información. Aquí hay algunos ejemplos de cómo usar stat y para qué sirve: http://landoflinux.com/linux_stat_command_examples.html

Pedro
fuente
1
Un archivo de 1 byte normalmente tomaría un bloque, no 8. Crear un enlace duro no crea un inodo en absoluto: un archivo es un inodo, sin importar cuántos enlaces haya en el archivo. Crear un enlace duro solo requiere espacio para la entrada del directorio.
Gilles
Gracias por las correcciones, es cierto que mi memoria re: estudiar ext2 en profundidad ahora está un poco borrosa. Estaba siguiendo el resultado de stat re: el recuento de bloques: parecía excesivo, pero eso es lo que hay. Corregiré la respuesta.
Pedro
1
Esto se debe a que 1 bloque ext2 = 8 bloques estadísticos, si el sistema de archivos ext2 usa bloques de 4kB: stat cuenta en bloques de 512 bytes por razones históricas. Ver unix.stackexchange.com/questions/14409/…
Gilles
3

Ilustraré aquí diferentes casos que hacen que dusea ​​diferente de df.

dfcuenta los bloques asignados del sistema de archivos, duuse la información de tamaño de cada archivo. Una diferencia puede tener muchas causas:

1) Archivos desvinculados (eliminados) que todavía están abiertos por aplicación. Falta la información del archivo, el bloque todavía está asignado. lsof +aL1 <filesystem>le ayudará a identificar los procesos. La mayoría de las veces tiene que eliminar los procesos para liberar el espacio (depende del proceso, a veces una recarga de configuración es suficiente).

2) Archivos debajo de los puntos de montaje ocultos dupero no a df. debugfscan te ayuda a leer el sistema de archivos.

$ sudo debugfs 
debugfs 1.42.12 (29-Aug-2014)
debugfs:  open /dev/xxx    (the desired file system  device)
debugfs:  cd /boot
debugfs:  ls -l 
 1966081   40755 (2)      0      0    4096 26-May-2016 16:28 .
      2   40555 (2)      0      0    4096 11-May-2016 10:43 ..
 1974291  100644 (1)      0      0       0 26-May-2016 16:28 bob   <---<<< /boot/bob is hidden by /boot fs

3) Archivos dispersos que parecen más grandes que la realidad. los bloques no asignados no se cuentan por, dfpero el tamaño aparente del archivo se cuenta por du.

Tenga en cuenta que los enlaces duros no engañan du

Emmanuel
fuente
3

dfgeneralmente se usa para ver qué son los sistemas de archivos, qué tan lleno está cada uno y dónde están montados. Muy útil cuando se está quedando sin espacio en un sistema de archivos, y tal vez desee cambiar las cosas entre los sistemas de archivos, o comprar un disco más grande, etc.

dumuestra detalles de cuánto almacenamiento acumulativo está consumiendo cada uno de los directorios (algo así como windirstaten Windows). Excelente para encontrar dónde está acumulando espacio cuando intenta hacer la limpieza de archivos.

Además de las pequeñas diferencias numéricas explicadas por otros, creo que las utilidades duy dfsirven para propósitos muy diferentes.

Jim Robertson
fuente