Disque plein sous Linux : trouver et libérer de l'espace sur un VPS
« No space left on device » paralyse presque tout sur un serveur : les bases de données n'écrivent plus, les sites renvoient des erreurs, les mises à jour échouent et parfois même la connexion devient difficile. Ce guide explique pas à pas comment résoudre un disque plein sous Linux : vérifier s'il manque des blocs ou des inodes, trouver ce qui occupe la place avec du et ncdu, puis libérer de l'espace disque en nettoyant le journal systemd, les caches apt/dnf, Docker, les gros fichiers de logs et les fichiers supprimés mais encore ouverts. Les commandes couvrent Debian, Ubuntu, CentOS 7 et Rocky Linux / AlmaLinux 8 et 9.
Étape 1 : Vérifier l'occupation avec df -hT et df -i
Identifiez d'abord le système de fichiers saturé. Un disque peut aussi être « plein » avec des gigaoctets libres s'il n'a plus d'inodes, ce qui arrive quand une application crée des millions de petits fichiers.
df -hT # space per file system, with type
df -i # inodes: IUse% at 100% also means "No space left on device"
Si Use% atteint 100 %, passez à l'étape 2. Si seul IUse% est élevé, allez directement à l'étape 9.
Étape 2 : Trouver les gros dossiers et fichiers avec du
du totalise la taille de chaque dossier. L'option -x reste sur un seul système de fichiers, ce qui évite que les disques montés et les systèmes virtuels faussent le résultat. Descendez niveau par niveau.
# 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
Étape 3 : Explorer l'espace disque en interactif avec ncdu
ncdu analyse une seule fois puis permet de naviguer dans l'arborescence avec les flèches, bien plus vite qu'en relançant du. Si le disque est tellement plein que l'installation échoue, libérez d'abord un peu d'espace avec l'étape 4 ou 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
Étape 4 : Réduire le journal systemd (journalctl --vacuum)
Avec un journal persistant, /var/log/journal peut atteindre plusieurs gigaoctets. Le vacuum supprime proprement les archives les plus anciennes, et une limite de taille évite que le problème revienne.
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
Étape 5 : Vider le cache apt / dnf et les anciens noyaux
Les paquets téléchargés et les anciens noyaux sont un gain rapide, surtout sur les petits disques cloud.
# 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
Étape 6 : Traiter les gros fichiers de logs sans risque
Les logs applicatifs dans /var/log ou dans le dossier d'un site sont une cause fréquente de disque plein. Ne faites pas rm sur un log encore utilisé par un service : l'espace ne sera pas libéré (voir l'étape 8). Videz-le avec truncate, puis corrigez la rotation.
# 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
Étape 7 : Récupérer l'espace utilisé par Docker (docker system prune)
Anciennes images, conteneurs arrêtés et cache de build s'accumulent vite dans /var/lib/docker. Vérifiez d'abord, puis nettoyez.
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 sans certitude : l'option supprime définitivement les volumes Docker inutilisés, qui contiennent souvent des données de bases.Pour éviter que les logs de conteneurs ne remplissent de nouveau le disque, limitez leur taille :
# /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)
Étape 8 : Repérer les fichiers supprimés mais ouverts avec lsof +L1
Quand df indique un disque plein mais que du ne trouve pas l'espace, un processus garde généralement ouvert un fichier déjà supprimé. L'espace ne revient que lorsque ce processus ferme le fichier.
# 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
Étape 9 : Corriger un « No space left » dû aux inodes
Si df -i affiche 100 %, cherchez les dossiers contenant énormément de petits fichiers : sessions PHP, files d'attente mail, caches ou uploads temporaires.
# 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
Nettoyez le dossier en cause et configurez l'application pour qu'elle purge automatiquement les anciens fichiers.
Questions fréquentes
Pourquoi df et du n'affichent-ils pas les mêmes chiffres ?
Le plus souvent à cause de fichiers supprimés mais encore ouverts (étape 8). Des fichiers masqués sous un point de montage et l'espace réservé à root par ext4 (5 % par défaut) expliquent aussi l'écart.
Puis-je tout supprimer dans /var/log ?
Non. Supprimez les anciens fichiers .gz et videz les gros logs actifs, mais conservez l'arborescence : certains services refusent de démarrer sans leur dossier de logs.
Mon disque se remplit sans cesse. Puis-je ajouter de l'espace ?
Trouvez d'abord la cause avec les étapes ci-dessus. Si les données ont vraiment besoin de place, les serveurs cloud JUSTG peuvent recevoir de l'espace SSD supplémentaire : consultez les options de mise à niveau dans l'espace client ou ouvrez un ticket.
Si votre serveur Linux manque toujours d'espace disque, ouvrez un ticket sur https://www.justg.com/submitticket.php et le support technique JUSTG vous aidera.