Esta pagina se ve mejor con JavaScript habilitado

DF vs DU

 ·  🎃 kr0m

Hay ocasiones en las que la salida de df no nos cuadrará con la de du, esto puede ser debido a varios factores. Los ficheros son retenidos por procesos activos, se ha montado un directorio sobre otro.

Para comprender este comportamiento debemos tener en cuenta el funcionamiento de cada una de las herramientas:

  • df –> Consulta el superbloque principal del sistema de ficheros, si esta info es incorrecta df mostrará datos incorrectos. Si se ha realizado un fsck y no se reinicia puede que los datos sean erróneos.
  • du –> Pasa por los directorios buscando ficheros y sumando el espacio consumido, puede ver lo mismo que un ls.

NOTA: Si un fichero es utilizado por un proceso y se borra, du no lo detectará ya que en el disco no existe, pero df consultará la info del sistema de ficheros, como el proceso está utilizando este espacio no se ha marcado como libre(no se ha eliminado la entrada correspondiente en la tabla de inodos).

Para encontrar los procesos responsables podemos ejecutar:

for PID in $(lsof |grep deleted|awk -F " " ‘{print$2}’); do echo PID: $PID; done

Quien dice echo $PID dice kill -9 $PID, jajaja

Otro posible problema es montar un dispositivo en un dir con datos, du solo verá lo que hay arriba mientras df verá todos los datos, para solventar este problema podemos emplear el siguiente “truco”:

mkdir /mnt/aux
mkdir /mnt/aux2
touch /mnt/aux/aaa
mount /dev/sda1 /mnt/aux/
ls -la /mnt/aux/aaa

ls: no se puede acceder a /mnt/aux/aaa: No existe el fichero o el directorio

Ahora solo vemos el contenido de sda1.

mount --bind / /mnt/aux2/
ls -la /mnt/aux2/mnt/aux/aaa

-rw-r--r-- 1 root root 0 sep 20 22:22 /mnt/aux2/mnt/aux/aaa

Si hacemos un du sobre /mnt/aux2/ podemos ver lo que hay en el sistema de ficheros de abajo ;)

Si te ha gustado el artículo puedes invitarme a un RedBull aquí