df -h dando datos falsos?

5 minutos de lectura

cuando estoy escribiendo df -h en mi caso, obtengo estos datos:

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.7G     0  7.7G   0% /dev
tmpfs           7.7G     0  7.7G   0% /dev/shm
tmpfs           7.7G  408K  7.7G   1% /run
tmpfs           7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/nvme0n1p1   32G   24G  8.5G  74% /
tmpfs           1.6G     0  1.6G   0% /run/user/1000

pero cuando estoy haciendo clic sudo du -sh / Me estoy poniendo:

11G /

así que en df -h, / el tamaño es 24G pero en du -sh mismo directorio el tamaño es 11G. Estoy tratando de obtener algo de espacio libre en mi instancia y no puedo encontrar los archivos que causan eso. ¿Qué me estoy perdiendo? hizo df -h es realmente dar datos falsos?

Esta pregunta surge con bastante frecuencia. El sistema de archivos asigna bloques de disco en el sistema de archivos para registrar sus datos. Estos datos se conocen como metadatos que no son visibles para la mayoría de los programas de nivel de usuario (como du). Ejemplos de metadatos son inodos, mapas de disco, bloques indirectos y superbloques.

El comando du es un programa de nivel de usuario que no conoce los metadatos del sistema de archivos, mientras que df analiza los mapas de asignación de disco del sistema de archivos y conoce los metadatos del sistema de archivos. df obtiene estadísticas reales del sistema de archivos, mientras que du solo ve una imagen parcial.

Hay muchas causas por las que difiere el espacio en disco utilizado o disponible cuando se ejecutan los comandos du o df.

Quizás el más común son los archivos eliminados. Los archivos que se han eliminado aún pueden estar abiertos por al menos un proceso. La entrada para dichos archivos se elimina del directorio asociado, lo que hace que el archivo sea inaccesible. Por lo tanto, el comando du, que solo cuenta archivos, no los tiene en cuenta y genera un valor más pequeño. Sin embargo, siempre que un proceso aún tenga el archivo eliminado en uso, los bloques asociados aún no se liberan en el sistema de archivos, por lo que df, que funciona en el nivel del kernel, los muestra correctamente como ocupados. Puede averiguar si este es el caso ejecutando lo siguiente:

lsof | grep '(deleted)'

La solución para este problema sería reiniciar los servicios que aún tienen abiertos esos archivos eliminados.

La segunda causa más común es si tiene una partición o unidad montada encima de un directorio con el mismo nombre. Por ejemplo, si tiene un directorio bajo / llamado copia de seguridad que contiene datos y luego monta una nueva unidad encima de ese directorio y la etiqueta como /copia de seguridad pero no contiene datos, entonces el espacio utilizado aparecerá con el comando df aunque el comando du no muestra ningún archivo.

Para determinar si hay archivos o directorios ocultos bajo un punto de montaje activo, puede intentar usar un montaje de enlace para montar su sistema de archivos / que me permitirá inspeccionar debajo de otros puntos de montaje. Tenga en cuenta que esto se recomienda solo para administradores de sistemas experimentados.

mkdir /tmp/tmpmnt
mount -o bind //tmp/tmpmnt
du /tmp/tmpmnt

Una vez que haya confirmado que este es el problema, el montaje de vinculación se puede eliminar ejecutando:

umount /tmp/tmpmnt/
rmdir /tmp/tmpmnt

Otra posible causa podría ser la corrupción del sistema de archivos. Si sospecha esto, asegúrese de tener buenas copias de seguridad y, según su conveniencia, desmonte el sistema de archivos y ejecute fsck.

Nuevamente, esto debe ser realizado por administradores de sistemas experimentados.

También puede verificar el cálculo ejecutando:

strace -e statfs df /

Esto le dará una salida similar a:

statfs("/", {f_type=XFS_SB_MAGIC, f_bsize=4096, f_blocks=20968699, f_bfree=17420469, 
f_bavail=17420469, f_files=41942464, f_ffree=41509188, f_fsid={val=[64769, 0]}, 
f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 83874796 14192920 69681876 17% /
+++ exited with 0 +++

¿Notas la diferencia entre f_bfree y f_bavail? Estos son los bloques gratuitos en el sistema de archivos frente a los bloques gratuitos disponibles para un usuario sin privilegios. La columna utilizada es simplemente un cálculo entre los dos.

Espero que esto aclare tu idea. Déjame saber si todavía tienes alguna duda.

  • En primer lugar, muchas gracias por su detallada respuesta. En segundo lugar, solo estoy tratando de entender, mi sistema de archivos se monta en ‘/’ y usa el 75% de mi almacenamiento, mis archivos de registro y todo lo que puedo “ver” es 34%, revisé lo que escribiste pero ninguno de ellos en realidad, ayúdame a resolver dónde puedo encontrar el 41% faltante del almacenamiento, solo quiero limpiar el sistema.

    – Bernana

    25 de noviembre de 2021 a las 8:23

  • De acuerdo, la forma simple de verificar el almacenamiento y eliminar archivos y carpetas de su sistema usando la terminal es ncdu simplemente escriba “sudo apt install ncdu -y” y luego escriba “ncdu /” para obtener sus datos de almacenamiento.

    – Amogh Saxena – REXTER

    25 de noviembre de 2021 a las 8:33

  • Si quieres, puedo agregar otra respuesta publicando la solución para eso.

    – Amogh Saxena – REXTER

    25 de noviembre de 2021 a las 8:34

  • cuando ejecuto el comando ‘ncdu’, todavía me muestra solo 11G en lugar de mostrar todos los 25G que hay en usgae

    – Bernana

    25 de noviembre de 2021 a las 8:56

  • como dije, solo el comando df le dará datos en tiempo real. No creas en du datas.

    – Amogh Saxena – REXTER

    25 de noviembre de 2021 a las 9:39

¿Ha sido útil esta solución?