Disque plein sur un serveur Linux : « No space left on device »

Mis à jour le Durée : 30 minutes

Réponse courte

L’erreur « No space left on device » signifie que le système de fichiers n’a plus d’octets libres ou plus d’inodes. Lancez df -h puis df -i pour savoir lequel manque, trouvez le dossier coupable avec du -xh --max-depth=1, puis videz les journaux, les sauvegardes locales, le cache de paquets ou les images Docker inutiles.

Un disque plein ne se contente pas d’empêcher d’écrire : MySQL s’arrête, nginx ne peut plus journaliser, les sessions PHP échouent, le site affiche des erreurs 500 et les mises à jour de paquets avortent. Les coupables habituels sont des journaux jamais purgés, des sauvegardes conservées en local, un dossier de fichiers temporaires, des images et volumes Docker, ou un fichier supprimé que le processus garde ouvert.

Il existe deux façons d’être « plein » : plus d’espace, ou plus d’inodes (le nombre de fichiers possibles) alors qu’il reste de la place. Les deux se contrôlent, sans rien supprimer, dès la première étape.

Mesurer l’espace et les inodes

Lancez df -h : repérez le système de fichiers à 100 % dans la colonne Use%, souvent /. Lancez ensuite df -i. Si l’espace libre existe mais que IUse% atteint 100 %, le disque est saturé de petits fichiers (sessions PHP, fichiers de cache, courriels en file d’attente) et il faudra les chercher par leur nombre, pas par leur taille. Un sudo est nécessaire pour lire certains dossiers.

Trouver les dossiers les plus lourds

Descendez niveau par niveau avec du -xh --max-depth=1 / | sort -h. L’option -x reste sur le même système de fichiers et évite de compter les disques montés ailleurs. Recommencez dans le dossier le plus gros, par exemple du -xh --max-depth=1 /var | sort -h. Si ncdu est installé (apt install ncdu, léger), ncdu -x / offre la même exploration de façon interactive. Pour une saturation d’inodes, comptez les fichiers par dossier avec find /var -xdev -type f | cut -d/ -f1-4 | sort | uniq -c | sort -n | tail.

Réduire les journaux systemd et logrotate

Mesurez le journal avec journalctl --disk-usage. Ramenez-le à une taille raisonnable avec journalctl --vacuum-size=500M ou, selon l’ancienneté, journalctl --vacuum-time=14d. Pour que cela dure, fixez SystemMaxUse=500M dans /etc/systemd/journald.conf, puis systemctl restart systemd-journald. Contrôlez ensuite /var/log : un fichier de plusieurs gigaoctets comme access.log indique que la rotation ne fonctionne pas. Testez-la avec logrotate -d /etc/logrotate.conf (simulation) et regardez les règles dans /etc/logrotate.d/. Pour vider un journal en gardant le fichier ouvert, utilisez truncate -s 0 /var/log/nginx/access.log plutôt que rm.

Rechercher les fichiers supprimés mais encore ouverts

Quand df annonce un disque plein alors que du ne retrouve pas l’espace, un processus garde un fichier supprimé ouvert. Listez-les avec lsof +L1 : la colonne SIZE/OFF indique le poids, la colonne COMMAND le processus. L’espace revient au redémarrage propre du service concerné, par exemple systemctl restart nginx, ou en vidant le descripteur avec truncate -s 0 /proc/PID/fd/numéro, en remplaçant PID et numéro par les valeurs relevées.

Vérifier les sauvegardes et les archives conservées en local

Cherchez les gros fichiers avec find / -xdev -type f -size +500M -exec ls -lh {} +. Les candidats fréquents : archives .tar.gz ou .sql.gz oubliées dans /root ou /home, dumps de base de données, anciennes copies du site. Ne supprimez une sauvegarde qu’après l’avoir copiée vers un autre serveur ou un stockage externe : une sauvegarde qui n’existe que sur le disque qu’elle protège ne protège rien. Voyez à ce sujet la page sur les sauvegardes.

Nettoyer le cache de paquets et les anciens noyaux

Sous Debian et Ubuntu, apt clean vide le cache de paquets téléchargés, apt autoremove --purge retire les paquets devenus inutiles, dont d’anciens noyaux. Lisez la liste proposée avant de confirmer et gardez le noyau actuellement utilisé (uname -r). Le dossier /var/cache et les fichiers temporaires de /tmp se contrôlent aussi avec du.

Faire le tri dans Docker

Si Docker est installé, docker system df affiche l’espace occupé par les images, conteneurs, volumes et caches de construction. docker image prune supprime les images sans étiquette, docker builder prune le cache de construction. Évitez docker system prune --volumes sans relecture : un volume non rattaché à un conteneur arrêté peut contenir une base de données. Les journaux des conteneurs, dans /var/lib/docker/containers, grossissent aussi sans limite si la rotation n’est pas configurée.

Redémarrer les services arrêtés et empêcher la récidive

Une fois de la place libérée, relancez les services tombés : systemctl --failed les liste, puis systemctl restart mysql ou systemctl restart nginx. Vérifiez qu’aucune table n’a été endommagée dans le journal MySQL, et lisez le guide MySQL ne démarre pas si le service refuse de repartir. Mettez en place une alerte à 80 % d’occupation, ou un contrôle quotidien de df -h, pour agir avant la prochaine saturation.

Questions fréquentes

Pourquoi « No space left on device » alors que df montre de la place ?

Deux causes principales : les inodes sont épuisés (vérifiez avec df -i), ou une partition différente de celle que vous regardez est pleine. Un quota utilisateur ou un espace réservé à root peuvent aussi produire ce message. Contrôlez le dossier exact où l’écriture échoue avec df -h /chemin.

Comment savoir quels fichiers remplissent mon serveur ?

Combinez du -xh --max-depth=1 / | sort -h pour descendre dossier par dossier et find / -xdev -type f -size +500M pour isoler les gros fichiers. L’outil ncdu présente le même résultat de façon interactive et se lance avec ncdu -x /.

Puis-je supprimer les fichiers de /var/log sans risque ?

Ne supprimez pas les fichiers avec rm pendant qu’un service écrit dedans : l’espace n’est alors pas libéré. Videz-les avec truncate -s 0 fichier, ou purgez le journal systemd avec journalctl --vacuum-size. Gardez les journaux récents : ils servent à comprendre un incident.

Que faire quand df -h indique 100 % mais du ne retrouve pas l’espace ?

Un fichier supprimé est probablement encore ouvert par un processus. Lancez lsof +L1 pour l’identifier, puis redémarrez le service concerné. Autre piste : des fichiers cachés sous un point de montage, si un disque a été monté sur un dossier déjà rempli.

Comment éviter qu’un disque se remplisse à nouveau ?

Limitez la taille du journal avec SystemMaxUse dans journald.conf, vérifiez que logrotate tourne, déportez les sauvegardes vers un stockage externe, et surveillez l’occupation avec une alerte avant 90 %. Sur Docker, configurez la rotation des journaux des conteneurs.

Sources

Voir aussi

Nos garanties

Comment se passe l’intervention