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 du
comando: si su sistema de archivos tiene un tamaño de bloque de 4KiB, du
informará 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 -l
o 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 du
es la suma de los tamaños de los bloques o extensiones utilizados por el archivo.
El tamaño informado por du
puede 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 du
diferente de la suma de los tamaños de archivo?
Como hemos visto anteriormente, el tamaño informado por du
cada 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 -l
enumera los tamaños en bytes, pero du
enumera los tamaños en KiB o en unidades de 512 bytes (sectores) en algunos sistemas más tradicionales ( du -k
obliga al uso de kilobytes). La mayoría de las unidades modernas admiten ls -lh
y du -h
usar números "legibles para 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, 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 -l
es 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 du
incluye archivos de puntos que ls
no se muestran a menos que use la opción -A
o -a
.
A veces du
informa menos que la suma esperada. Esto sucede si hay enlaces duros dentro del árbol de directorios: du
cuenta cada archivo solo una vez.
En algunos sistemas de archivos como ZFS
en Linux, du
no 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, 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 no vacío , el sistema de archivos montado oculta los archivos en ese directorio. Todavía ocupan su espacio, pero du
no 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 -m
o lsof
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, el espacio del archivo no se puede reclamar si ese archivo es el back-end de un
loop
dispositivo. losetup -a
(as root
) puede decirle qué loop
dispositivos 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 df
exactamente 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 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 "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 -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 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 /home
sistema de archivos y exporta/home/bob
), entonces df
un 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 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 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, lsblk
presenta 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
, pvs
para LVM , fdisk
para PC tradicional de estilo ( “MBR”) particiones (así como GPT en sistemas recientes), gdisk
para GPT particiones, disklabel
para etiquetas de disco BSD, Parted , etc. Bajo Linux, cat /proc/partitions
da 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.
tune2fs
requiere 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.