Con el disco lleno en Linux, el orden que funciona es este. Primero, df -h para saber qué sistema de archivos está al 100 %. Después, du -sh * | sort -h para bajar directorio a directorio hasta el culpable, y ncdu para explorarlo de forma interactiva. Por último, se libera espacio con journalctl --vacuum-size y docker system prune.
df -h: qué sistema de archivos está lleno y si faltan inodos
df -h muestra el tamaño, el espacio usado, el disponible y el porcentaje de cada sistema de archivos montado, en unidades legibles (K, M, G). Va primero porque responde a la pregunta previa: ¿qué partición está llena? Limpiar /home no sirve de nada si la que está al 100 % es /var.
df -h
df -h /var
df -iSi df -h indica espacio libre pero las escrituras fallan con «No space left on device», revisa df -i. Puede que se hayan agotado los inodos por culpa de millones de archivos pequeños: cachés, sesiones o colas de correo. En ese caso el problema no es el tamaño, sino el número de archivos, y hay que buscar el directorio con más entradas, no el más pesado.
du -sh * | sort -h: cómo encontrar el directorio que llena el disco
du -sh * | sort -h suma el tamaño de cada elemento del directorio actual y lo ordena de menor a mayor. El más grande queda en la última línea, justo encima del prompt, que es lo único que necesitas ver en una pantalla pequeña.
cd /var
sudo du -sh * | sort -h
# desde la raíz, sin cruzar a otros sistemas de archivos
sudo du -xh --max-depth=1 / 2>/dev/null | sort -h
# incluir archivos y directorios ocultos
du -sh .[!.]* * | sort -hConviene tener en cuenta tres detalles. El comodín * no incluye los elementos ocultos; de ahí la última línea. -x se queda en el sistema de archivos de partida y no cuenta /proc ni los montajes de red. 2>/dev/null descarta los avisos de permiso denegado. Repite el proceso bajando un nivel cada vez hasta llegar al archivo. Las demás opciones están en la página de manual de du.
En discos grandes, du puede tardar varios minutos. Lánzalo dentro de tmux: si se corta la conexión, el escaneo sigue y el resultado te espera al volver a adjuntar la sesión.
ncdu: explorar un disco lleno de forma interactiva
ncdu -x / escanea el sistema de archivos una sola vez y presenta un árbol navegable ordenado por tamaño. Así evitas repetir du en cada nivel. Se instala con el gestor de paquetes de la distribución (apt install ncdu, dnf install ncdu).
sudo ncdu -x /
sudo ncdu -x /var/libDentro de ncdu se usan estas teclas:
- las flechas, para moverte;
- Intro, para entrar en un directorio;
- la flecha izquierda, para subir un nivel;
d, para borrar (pide confirmación);q, para salir.
Desde el móvil todo depende de tener flechas y Esc a mano. El teclado propio de termi1 las incluye, junto con Ctrl, Tab y PgUp/PgDn, que permiten recorrer listados largos.
Archivos borrados que siguen ocupando el disco lleno: lsof +L1
Si el total de du es claramente menor que el uso que indica df, algún proceso mantiene abierto un archivo ya borrado. El caso típico es un log eliminado con rm mientras el servicio seguía escribiendo en él. El espacio no se libera hasta que ese descriptor se cierra.
sudo lsof +L1
# reiniciar el servicio que lo retiene, o vaciar el descriptor:
sudo truncate -s 0 /proc/PID/fd/NLa regla es sencilla: para vaciar un log en uso, usa truncate -s 0 archivo y no rm.
journalctl --vacuum: reducir los logs de systemd que llenan /var
journalctl --disk-usage indica cuánto ocupa el journal de systemd. Los modificadores --vacuum-size y --vacuum-time borran los archivos archivados más antiguos hasta cumplir el límite indicado.
journalctl --disk-usage
sudo journalctl --vacuum-size=500M
sudo journalctl --vacuum-time=2weeksEl vacuum es puntual. Para que el problema no vuelva, fija SystemMaxUse= en /etc/systemd/journald.conf y reinicia systemd-journald.
docker system prune: liberar el espacio que ocupa Docker
docker system df desglosa lo que ocupan las imágenes, los contenedores, los volúmenes y la caché de build. Ejecútalo antes de borrar nada para saber dónde está el volumen de datos.
docker system df
docker system prune
docker system prune -a --volumesSin opciones, docker system prune elimina los contenedores parados, las redes sin uso, las imágenes colgantes y la caché de build. -a borra además cualquier imagen que no use un contenedor. --volumes elimina los volúmenes no usados, y con ellos sus datos. En producción, revisa la salida de docker system df -v antes de añadir esa opción.
df, du y ncdu comparados para diagnosticar un disco lleno
| Herramienta | Qué mide | Cuándo usarla | Limitación |
|---|---|---|---|
df -h | Uso por sistema de archivos montado | Primer paso: saber qué partición está llena | No dice qué directorio ocupa el espacio |
du -sh * | sort -h | Tamaño de cada elemento del directorio actual | Servidores sin paquetes extra; salida fácil de leer | Hay que repetirlo en cada nivel; omite los ocultos |
ncdu -x / | Árbol completo ordenado por tamaño | Exploración interactiva y borrado con confirmación | Requiere instalarlo; necesita flechas en el teclado |
lsof +L1 | Archivos borrados aún abiertos | Cuando df y du no cuadran | Solo detecta, no libera el espacio |
Limpiar un disco lleno desde el móvil con termi1
Un disco lleno suele avisar a deshoras, así que conviene poder resolverlo desde el móvil sin riesgo. Antes de vaciar un log que quizá necesites, descárgalo por SFTP: termi1 lo integra sin salir de la sesión. Mosh mantiene la conexión al pasar de wifi a datos, y tmux conserva un du largo aunque cierres la app.
La IA de termi1 convierte una frase como «qué directorios de /var ocupan más» en el comando y lo escribe en el prompt sin pulsar Intro. En las conexiones etiquetadas como producción, Production Guard retiene lo que borra, como docker system prune o journalctl --vacuum-size, antes de que llegue al prompt. La terminal es gratis y está en la terminal SSH en App Store. Más guías en el blog técnico de termi1.
Preguntas frecuentes
¿Por qué df y du muestran tamaños distintos?
df y du difieren porque df lee el uso del sistema de archivos, mientras que du suma los archivos que encuentra. Si un proceso mantiene abierto un archivo borrado, df lo sigue contando y du no. Ejecuta sudo lsof +L1 para localizarlo y reinicia el servicio que lo retiene.
¿Es seguro ejecutar docker system prune en un servidor?
docker system prune sin opciones solo elimina contenedores parados, redes sin uso, imágenes colgantes y caché de build. El riesgo aparece con -a, que borra las imágenes sin contenedor, y sobre todo con --volumes, que elimina los datos de los volúmenes no usados. Revisa antes docker system df.
¿Cómo incluir archivos ocultos con du -sh?
Para que du -sh incluya archivos ocultos, añade el patrón .[!.]* al comodín: du -sh .[!.]* * | sort -h. El asterisco del shell no expande los nombres que empiezan por punto, así que directorios como .cache o .local pueden quedar fuera del recuento y pasar inadvertidos.
¿Cómo evitar que journald vuelva a llenar el disco?
Para limitar journald de forma permanente, define SystemMaxUse= en /etc/systemd/journald.conf con el tamaño máximo deseado y reinicia systemd-journald. journalctl --vacuum-size solo limpia una vez; el límite en la configuración impide que el journal vuelva a crecer sin control.