
Cuando sumo los tamaños de mis archivos, obtengo una cifra. Si corro du
, obtengo otra figura. Si ejecuto du
todos los archivos de mi partición, no coincide con las df
afirmaciones que se utilizan. ¿Por qué hay tantas cifras diferentes para el tamaño total de mis archivos? ¿Las computadoras no pueden sumar?
Hablando de sumar: cuando sumo las columnas "Usado" y "Disponible" df
, no obtengo la cifra total. Y esa cifra total es menor que el tamaño de mi partición. ¡Y si sumo los tamaños de mis particiones, no obtengo el tamaño de mi disco! ¿Lo que da?
Respuesta1
Sumar números es fácil. El problema es que hay muchos números diferentes para sumar.
¿Cuánto espacio en disco utiliza un archivo?
La idea básica es que un archivo que contenganorteusos de bytesnortebytes de espacio en disco, más un poco de 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 para encontrar 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 forman un solo volumen, pero los archivos más grandes constan de muchos volúmenes, como una enciclopedia. Para poder localizar los archivos, existe un catálogo de fichas que hace referencia a cada volumen. Cada volumen tiene un poco de sobrecarga debido a las portadas. Si un archivo es muy pequeño, esta sobrecarga es relativamente grande. Además, el propio catálogo de fichas ocupa algo de espacio.
Yendo un poco más técnico, en un sistema de archivos simple típico, el espacio se divide enbloques. 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 sólo se utiliza 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 ls
o du
: si su sistema de archivos tiene un tamaño de bloque de 4 KB, entonces ls -s
y du
informará 4 KB 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 sonbloques indirectos; sistemas de archivos más sofisticados pueden optimizar esto en forma deextensiones). Esos no se muestran en el tamaño del archivo según lo informado por ls -l
GNU du --apparent-size
. du
y ls -s
, que informan el uso del disco en lugar del tamaño, sí los tienen en cuenta.
Algunos sistemas de archivos intentan reutilizar el espacio libre que queda en el último bloque paraempaquetar varias colas de archivos en el mismo bloque. Algunos sistemas de archivos (comoext4 desde Linux 3.8use bloques 0 para archivos pequeños (solo unos pocos bytes) que quepan completamente en el inodo.
Complicaciones macroscópicas
Generalmente, como se vio arriba, el tamaño total informado por du
es la suma de los tamaños de los bloques o extensiones utilizadas por el archivo.
El tamaño informado por du
puede ser menor si el archivo está comprimido. Los sistemas Unix tradicionalmente admiten una forma tosca de compresión: si un bloque de archivos contiene sólo bytes nulos, entonces, 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 llamaarchivo escaso. Los archivos dispersos no se crean automáticamente cuando un archivo contiene una gran serie de bytes nulos; la aplicación debe hacer arreglos para que el archivo se vuelva disperso.
Algunos sistemas de archivos comobtrfsyzfsoporte de propósito generalcompresión.
Complicaciones avanzadas
Dos características principales de los 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.
Instantáneasson un estado congelado del sistema de archivos en una fecha determinada. Los sistemas de archivos que admiten esta función pueden contener varias instantáneas tomadas en diferentes fechas. Estas instantáneas ocupan 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 quedará vacío 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 de manera idéntica en la instantánea y en la versión activa u otra instantánea. Esto se implementa a través deCopiar en escrito. En algunos casos extremos, es posible que la eliminación de un archivo en un sistema de archivos completo falle debido a que no hay suficiente espacio disponible, porque eliminar ese archivo requeriría hacer una copia de un bloque en el directorio, y no hay más espacio ni siquiera para ese bloque.
Deduplicaciónes una técnica de optimización del almacenamiento que consiste en evitar almacenar bloques idénticos. Con datos típicos, no siempre vale la pena buscar duplicados. AmboszfybtrfsAdmite la deduplicación como característica opcional.
¿Por qué el total es du
diferente de la suma de los tamaños de los archivos?
Como hemos visto anteriormente, el tamaño informado por du
para cada archivo normalmente es la suma de los tamaños de los bloques o extensiones utilizadas por el archivo. Tenga en cuenta que, de forma predeterminada, ls -l
enumera los tamaños en bytes, pero du
enumera los tamaños en KiB o en unidades (sectores) de 512 bytes en algunos sistemas más tradicionales ( du -k
fuerza el uso de kilobytes). La mayoría de los Unices modernos admiten ls -lh
y du -h
usan números “legibles por humanos” usando K, M, G, etc., es suficiente (para KiB, MiB, GiB) según corresponda.
Cuando se ejecuta du
en un directorio, resume el uso del disco de todos los archivos en el árbol de directorios,incluyendo los directoriosellos mismos. Un directorio contiene datos (los nombres de los archivos y un puntero a dónde 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 sólo de los archivos que contiene, sino también del orden en que se insertaron y en el que se eliminaron algunos archivos (en 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 extra aquí y allá). Cuando ejecuta ls -ld /some/directory
, aparece el tamaño del directorio. (Tenga en cuenta que la línea "NNN total" en la parte superior de la salida ls -l
es un número no relacionado, es la suma de los tamaños en bloques de los elementos enumerados, expresada en KiB o sectores).
Tenga en cuenta que du
incluyearchivos de puntosque ls
no se muestra a menos que use la opción -A
o -a
.
A veces du
reporta menos de la suma esperada. Esto sucede si hayenlaces durosdentro del árbol de directorios: du
cuenta cada archivo solo una vez. Utilice du -l
el interruptor para contar archivosnorteveces si tienennorteenlaces duros.
En algunos sistemas de archivos, como ZFS
Linux, du
no informa el espacio total en disco ocupado por los atributos extendidos de un archivo.
Tenga en cuenta que si hay puntos de montaje en un directorio, du
también contará todos los archivos en estos puntos de montaje, a menos que se le dé la -x
opció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 que no está vacío, los archivos en ese directorio están ocultos por el sistema de archivos montado. Todavía ocupan su espacio, pero du
no los encuentran.
Archivos eliminados
Cuando un archivo eseliminado, esto sólo elimina la entrada del directorio, no necesariamente el archivo en sí. Se necesitan dos condiciones para eliminar realmente un archivo y así recuperar su espacio en disco:
- El recuento de enlaces del archivo debe reducirse a 0: si un archivo tiene varios enlaces físicos, eliminar uno no afecta a los demás.
- Mientras el archivo esté abierto mediante algún proceso, los datos permanecen. Sólo cuando todos los procesos hayan cerrado el archivo se eliminará el archivo. La salida
fuser -m
olsof
en 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, es posible que el espacio del archivo no se recupere si ese archivo es el backend de un
loop
dispositivo.losetup -a
(asroot
) puede indicarle quéloop
dispositivos están configurados actualmente y en qué archivo. El dispositivo de bucle debe destruirse (conlosetup -d
) antes de poder recuperar el espacio en disco.
Si elimina un archivo en algunos administradores de archivos o entornos GUI, es posible que se coloque en un área de papelera donde se puede recuperar. Mientras el archivo se pueda recuperar, su espacio seguirá consumiéndose.
¿De qué son exactamente estos números df
?
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
- Adiario
Sólo el primer tipo es reportado por du
. En lo que respecta a df
, lo 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 "usado", y los bloques no utilizados siempre están en la columna " disponible”).
Sistemas de archivos en ext2/ext3/ext4reservar5% 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 iniciar sesión y para permitir que el administrador del sistema almacene algunos 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 (que ralentiza el acceso a los archivos, especialmente en dispositivos mecánicos giratorios como los discos duros) asignando previamente muchos bloques consecutivos cuando se escribe un archivo, pero si no hay muchos bloques consecutivos, eso no puede funcionar. .
Los sistemas de archivos tradicionales, hasta ext4 inclusive pero no btrfs, reservan un número fijo deinodoscuando se crea el sistema de archivos. Esto simplifica significativamente el diseño del sistema de archivos, pero tiene la desventaja de que el número de inodos debe dimensionarse adecuadamente: con demasiados inodos, se desperdicia espacio; con muy pocos inodos, el sistema de archivos puede quedarse sin inodos antes de quedarse sin espacio. El comando df -i
informa 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 -l
en 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 essubvolúmenes(apoyado enbtrfs, y en zfs bajo el nombreconjuntos de datos). Varios subvolúmenes comparten el mismo espacio, pero tienen raíces de árbol de directorios independientes.
Si un sistema de archivos está montado en la red (NFS, Samba, etc.) y el servidor exporta una parte de ese sistema de archivos (p. ej.el servidor tiene un /home
sistema de archivos y exporta/home/bob
), luego df
en un cliente se reflejan los datos de todo el sistema de archivos, no solo de 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 df
no 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 -l
y 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 circundante. 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, lsblk
presenta una buena descripción general de los volúmenes de almacenamiento disponibles. Para obtener información adicional o si no la tiene lsblk
, utilice herramientas de partición o administración de volúmenes especializadas para comprobar qué particiones tiene. En Linux, existe lvs
, vgs
, pvs
paraLVM,fdisk
para particiones tradicionales estilo PC (“MBR”) (así como GPT en sistemas recientes),gdisk
paraGPTparticiones,disklabel
para etiquetas de disco BSD,separado, etc. En Linux, cat /proc/partitions
ofrece un resumen rápido. 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 unintercambiovolumen.
Algunas computadoras tienen una partición que contiene elBIOSu otro software de diagnóstico. Computadoras conUEFItener una partición de cargador de arranque dedicada.
Finalmente, tenga en cuenta que la mayoría de los programas de computadora usan unidades basadas en potencias de 1024 = 2 · 10 (porque a los programadores les encanta el sistema 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 comokibibyteKiB,mebibyteMiB, 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 el sistema métrico (unidades basadas en 1000). De modo que esa unidad de 1 TB tiene solo 931 GiB o 0,904 TiB.
Respuesta2
Un breve resumen de las complicaciones para calcular el tamaño de los archivos y los espacios en disco:
El espacio que ocupa el archivo en el disco es un multiplicador del número de bloques que ocupa frente al tamaño de cada bloque + el número de inodos que ocupa. Un archivo de 1 byte de longitud ocupará al menos 1 bloque, 1 inodo y una entrada de directorio.
Pero podría necesitar sólo 1 entrada de directorio adicional si el archivo es un enlace físico a otro archivo. Sería simplemente otra referencia al mismo conjunto de bloques.
- El tamaño del contenido del archivo. Esto es lo que
ls
se muestra. - El espacio libre en disco no es el tamaño del archivo más grande que cabe ni la suma de todos los tamaños de contenido de archivos que caben en el disco. Está en algún punto intermedio. Depende de la cantidad de archivos (que ocupan inodos), el tamaño del bloque y qué tan cerca el contenido de cada archivo llena los bloques por completo.
Esto es sólo una muestra de los sistemas de archivos y está demasiado simplificado. Recuerde también que los diferentes sistemas de archivos funcionan de manera diferente.
stat
es 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
Respuesta3
df
Generalmente se usa para ver cuáles son los sistemas de archivos, qué tan completos están y dónde están montados. Muy útil cuando te estás quedando sin espacio en un sistema de archivos y tal vez quieras cambiar cosas entre los sistemas de archivos, o comprar un disco más grande, etc.
du
muestra detalles de cuánto almacenamiento acumulativo consume cada uno de los directorios (algo así como windirstat
en Windows). Excelente para encontrar dónde estás acaparando espacio cuando intentas realizar una limpieza de archivos.
Aparte de las pequeñas diferencias numéricas explicadas por otros, creo que las utilidades du
y df
tienen propósitos muy diferentes.
Respuesta4
Ilustraré aquí diferentes casos que causan du
ser diferentes df
.
df
cuenta los bloques asignados del sistema de archivos, du
utiliza la información de tamaño de cada archivo. Una diferencia puede tener muchas causas:
Archivos desvinculados (eliminados) que aún están abiertos por aplicación. Falta la información del archivo, el bloque aún está asignado.
lsof +aL1 <filesystem>
le ayudará a identificar los procesos. La mayoría de las veces hay que matar los procesos para liberar espacio (depende del proceso, a veces una recarga de configuración es suficiente).Archivos debajo de los puntos de montaje ocultos
du
pero no paradf
.debugfs
puede ayudarle 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
Archivos dispersoseso parece más grande que la realidad. Los bloques no asignados no se cuentan,
df
pero el tamaño aparente del archivo sí se cuentadu
.
Tenga en cuenta que los enlaces físicos no engañan du
.