Disco lleno en linux! Diferencias entre df y du

 Resulta que ambos comandos, reportan de diferente forma el espacio utilizado en el disco, y para demostrar esto y entenderlo de mejor forma, lo veremos con un ejemplo, acompañados de otro comando amigo el lsof.

Si utilizamos el comando du, de la siguiente forma:


# du -sh /

el -sh significa que queremos el gran total ( s: sumarizar) y que utilice letras para definir los tamaños, MB, GB, etc.

obtenemos el siguiente resultado:

13G /

Luego utilizando el comando df, supuestamente para realizar el mismo cálculo, podriamos utilizar lo siguiente:

df -h /

el -h significa que queremos que utilice letras para definir los tamaños, MB, GB, etc.

para lo que obtendríamos un resultado como este:

Filesystem Size Used Avail Use% Mounted on
/dev/sda3   64G  30G   32G  49% /

y llegamos entonces al punto! segun du tenemos 13G utilizados en nuestro disco y el df nos dice que estamos utilizando 30GB! pregunto entonces donde se encuentran los 17GB que no estan en el disco segun el du? Bueno resulta que el «open file descriptor» es el causante de esta diferencia en resultados, ya que el df toma en cuenta los archivos abiertos y el du realiza sus calculos sobre los archivos almacenados en cada una de las carpetas recursivamente.

 Es ahora donde el «lsof» entra en juego para ayudarnos a saber qué pasa con ese crecimiento en el espacio de disco utilizado. Al ejecutar el comando de la siguiente forma:

lsof -R | more

Obtenemos un resultado como el siguiente:

COMMAND PID PPID USER FD TYPE DEVICE SIZE NODE NAME
init 1 0 root cwd DIR 8,3 4096 2 /
init 1 0 root rtd DIR 8,3 4096 2 /
init 1 0 root txt REG 8,3 32652 7028751 /sbin/init
init 1 0 root mem REG 0,0 0 [heap] (stat: No such file or directory)
init 1 0 root mem REG 8,3 9592 7260587 /lib/tls/i686/cmov/libdl-2.3.6.so
init 1 0 root mem REG 8,3 1241392 7260584 /lib/tls/i686/cmov/libc-2.3.6.so
init 1 0 root mem REG 8,3 79368 7258210 /lib/libselinux.so.1
init 1 0 root mem REG 8,3 219824 7258211 /lib/libsepol.so.1
init 1 0 root mem REG 8,3 88164 7258114 /lib/ld-2.3.6.s

utilicé el «-R» para que me listara el proceso padre y así identificar quien está utilizando dichos archivos. Con ello podemos llegar de una mejor forma a detectar ese crecimiento «fantasma».

Como ejemplo practico podriamos hacer lo siguiente.

Primero utilicemos los siguientes comandos para el /home:

# df -h /home

# du -s -h /tmp

ahora creamos un archvo GRANDE:

# cd /home/user
# cat /bin/* >> demo.txt
# cat /sbin/* >> demo.txt

Ingresamos a otra consola y abrimos el archivo demo.txt utilizando el editor de texto vi :

# vi /home/user/demo.txt

sin cerrar vi (mantengalo corriendo en esa consola), regrese a la primer consola y borre el archivo demo.txt

# rm demo.txt

Ahora corra du y df y observará la diferencia.

# df -h /home
# du -s -h /tmp

Regrese a la siguiente consola y cierre vi sin grabar el archivo y la aparente causa principal del problema pareciera haberse resuelto, y la salida de los comandos du y df podria ya estar correcta. Este ejemplo fue solamente para «replicar» estas circunstancias en un entorno de pruebas ya que en el entorno de producción, estas diferencias se van dando por medio de los servicios que se estén ejecutando, por ello incluí el «lsof» ya que puede ayudarnos a detectar al culpable de un crecimiento en disco que pudiera llegar a «saturarlo».

Bueno, este fué mi primer post a tipsdeaweb.com, espero volver pronto con alguno de esos tips que nos gustaría encontrar facilmente y que lo mas probable es que no esten en español.