Disco lleno en Linux: cómo encontrar y liberar espacio en un VPS
«No space left on device» rompe casi todo en un servidor: las bases de datos dejan de escribir, las webs devuelven errores, las actualizaciones fallan y a veces ni siquiera se puede iniciar sesión con normalidad. Esta guía explica paso a paso qué hacer cuando el disco está lleno en Linux: comprobar si se agotaron los bloques o los inodos, encontrar qué ocupa espacio con du y ncdu y después liberar espacio en disco del journal de systemd, las cachés de apt/dnf, Docker, logs enormes y archivos borrados que siguen abiertos. Los comandos sirven para Debian, Ubuntu, CentOS 7 y Rocky Linux / AlmaLinux 8 y 9.
Paso 1: Comprueba el uso del disco con df -hT y df -i
Primero averigua qué sistema de archivos está lleno. Un disco también puede estar «lleno» con gigas libres si se quedó sin inodos, algo que ocurre cuando una aplicación crea millones de archivos pequeños.
df -hT # space per file system, with type
df -i # inodes: IUse% at 100% also means "No space left on device"
Si Use% está al 100 %, sigue con el paso 2. Si solo IUse% está alto, salta al paso 9.
Paso 2: Encuentra directorios y archivos grandes con du
du suma el tamaño de cada directorio. La opción -x se queda en un único sistema de archivos, así los discos montados y los sistemas virtuales no distorsionan el resultado. Baja nivel a nivel.
# Largest top-level directories on the root file system
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -n 15
# Drill down into the biggest one, for example /var
du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -n 15
# Single files larger than 200 MB
find / -xdev -type f -size +200M -exec ls -lh {} + 2>/dev/null | sort -k5 -h
Paso 3: Explora el uso del disco de forma interactiva con ncdu
ncdu escanea una vez y te deja recorrer el árbol con las flechas, mucho más rápido que repetir du. Si el disco está tan lleno que la instalación falla, libera primero algo de espacio con el paso 4 o el 5.
# Debian / Ubuntu
apt install -y ncdu
# Rocky Linux / AlmaLinux / CentOS (from EPEL)
dnf install -y epel-release && dnf install -y ncdu
ncdu -x / # arrows to browse, d = delete, q = quit
Paso 4: Reduce el journal de systemd (journalctl --vacuum)
Con journal persistente, /var/log/journal puede crecer hasta varios gigas. El vacuum elimina con seguridad los archivos más antiguos y un límite de tamaño evita que el problema vuelva.
journalctl --disk-usage
journalctl --vacuum-size=200M # or: journalctl --vacuum-time=14d
# Cap the journal permanently
mkdir -p /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/size.conf <<'EOF'
[Journal]
SystemMaxUse=200M
EOF
systemctl restart systemd-journald
Paso 5: Limpia la caché de apt / dnf y los kernels antiguos
Los paquetes descargados y los kernels viejos son una victoria rápida, sobre todo en discos cloud pequeños.
# Debian / Ubuntu
apt clean
apt autoremove --purge
# Rocky Linux / AlmaLinux 8, 9
dnf clean all
dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q) # keep 2 newest kernels
# CentOS 7
yum clean all
yum install -y yum-utils && package-cleanup --oldkernels --count=2
Paso 6: Gestiona los logs grandes de forma segura
Los logs de aplicaciones en /var/log o dentro del directorio de una web son una causa frecuente de disco lleno. No hagas rm de un log en el que un servicio sigue escribiendo: el espacio no se libera (ver paso 8). Vacíalo con truncate y corrige la rotación.
# Log files larger than 100 MB
find /var/log -type f -size +100M -exec ls -lh {} +
# Empty a live log WITHOUT deleting it (the service keeps writing)
truncate -s 0 /var/log/nginx/access.log
# Remove compressed rotated logs older than 14 days
find /var/log -type f -name '*.gz' -mtime +14 -delete
# Dry-run logrotate to see why a log is not rotating
logrotate -d /etc/logrotate.conf
Paso 7: Recupera espacio de Docker (docker system prune)
Imágenes antiguas, contenedores detenidos y caché de compilación se acumulan rápido en /var/lib/docker. Revisa primero y luego limpia.
docker system df # what Docker is using
docker system prune # stopped containers, unused networks,
# dangling images and build cache
docker system prune -a # also ALL images not used by a container
# Container logs live here and can grow without limit
du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail
--volumes salvo que estés seguro: borra para siempre los volúmenes Docker sin uso, que a menudo contienen datos de bases de datos.Para que los logs de los contenedores no vuelvan a llenar el disco, limita su tamaño:
# /etc/docker/daemon.json - limit future container logs
{
"log-driver": "json-file",
"log-opts": { "max-size": "50m", "max-file": "3" }
}
# then: systemctl restart docker (applies to newly created containers)
Paso 8: Encuentra archivos borrados pero abiertos con lsof +L1
Cuando df dice que el disco está lleno pero du no encuentra el espacio, normalmente un proceso mantiene abierto un archivo ya borrado. El espacio solo vuelve cuando ese proceso cierra el archivo.
# Debian / Ubuntu: apt install -y lsof | Rocky / AlmaLinux: dnf install -y lsof
lsof +L1
# COMMAND PID ... SIZE/OFF NLINK NAME
# php-fpm 1234 ... 4.2G 0 /var/log/app/debug.log (deleted)
# Fix 1: restart the service holding the file
systemctl restart php-fpm
# Fix 2: truncate it through /proc (PID 1234, file descriptor 7 from "ls -l /proc/1234/fd")
: > /proc/1234/fd/7
Paso 9: Soluciona «No space left» por falta de inodos
Si df -i muestra 100 %, busca directorios con enormes cantidades de archivos pequeños: sesiones de PHP, colas de correo, cachés o subidas temporales.
# Directories that contain the most files
find / -xdev -type f 2>/dev/null | cut -d/ -f2-4 | sort | uniq -c | sort -n | tail -n 10
Limpia el directorio responsable y configura la aplicación para que elimine automáticamente los archivos antiguos.
Preguntas frecuentes
¿Por qué df y du muestran cifras distintas?
Normalmente por archivos borrados que siguen abiertos (paso 8). También influyen los archivos ocultos bajo un punto de montaje y el espacio que ext4 reserva para root (un 5 % por defecto).
¿Es seguro borrar todo lo que hay en /var/log?
No. Elimina los .gz rotados antiguos y vacía los logs activos grandes, pero conserva la estructura de directorios: algunos servicios no arrancan si falta su carpeta de logs.
Mi disco se llena una y otra vez. ¿Puedo ampliar el espacio?
Primero encuentra la causa con los pasos anteriores. Si los datos realmente necesitan más sitio, los servidores cloud de JUSTG admiten SSD adicional: revisa las opciones de ampliación en el área de clientes o abre un ticket.
Si tu servidor Linux sigue sin espacio en disco, abre un ticket en https://www.justg.com/submitticket.php y el soporte técnico de JUSTG te ayudará.