objectif
Diagnostiquer un “No space left on device” sur un serveur en vérifiant l’espace et les inodes, en trouvant les fichiers supprimés mais encore ouverts, en ciblant les plus gros dossiers et en appliquant des nettoyages sûrs.
code minimal
# triage rapide: espace, inodes et fichiers supprimés encore ouverts
df -hT; df -i
sudo lsof +L1 | head -n 20
utilisation
# 1) vérifier l'espace par filesystem et le type (ext4, xfs, zfs)
df -hT | sort -k6,6
# 2) vérifier les inodes (si IUse% ≈ 100% → plus de fichiers possibles)
df -i | sort -k5,5nr | head
# 3) trouver les plus gros dossiers (GNU, sans traverser d'autres FS)
sudo du -x --max-depth=1 -h / | sort -hr | head -n 20
# macOS/BSD:
sudo du -hd 1 / | sort -hr | head -n 20
# 4) lister les très gros fichiers (≥ 1G) sans traverser d'autres FS
sudo find / -xdev -type f -size +1G -exec ls -lh {} + 2>/dev/null | sort -k5 -h | tail
# 5) détecter des fichiers supprimés mais toujours ouverts (ne libèrent pas d'espace)
sudo lsof +L1 | awk '{printf "%10s %-8s %-6s %s\n",$7,$1,$2,$9}' | sort -nr | head -n 20
# libérer: redémarrer le service fautif (exemple)
# sudo systemctl restart data-pm-api.service
# 6) nettoyer journald proprement (si systemd)
sudo journalctl --vacuum-size=500M
# ou par temps
sudo journalctl --vacuum-time=7d
# 7) caches package (Debian/Ubuntu)
sudo apt-get clean
# 8) Docker (si présent) - prudence: supprime images/containers inutilisés
docker system df
docker system prune -af --volumes
# 9) rotation nginx (ex: logs data.pm) si logrotate présent
sudo logrotate -f /etc/logrotate.conf 2>/dev/null || true
variante(s) utile(s)
# repérer où les inodes partent: top dossiers par nombre de fichiers (GNU find)
sudo find /var -xdev -printf '%h\n' 2>/dev/null | sort | uniq -c | sort -nr | head -n 30
# GNU du: compter les inodes par dossier
sudo du -x --inodes --max-depth=1 /var | sort -nr | head
# alternative portable (compte fichiers par dossier) via Python
python3 - <<'PY'
import os, collections
root='/var'
cnt=collections.Counter()
for dp, dn, fn in os.walk(root, followlinks=False):
cnt[dp]+=len(fn)
for p,n in cnt.most_common(30):
print(f"{n:8d} {p}")
PY
# fichiers supprimés ouverts: libérer sans redémarrer (truncate via fd)
# (identifier PID et FD via lsof, puis:)
sudo truncate -s 0 /proc/<PID>/fd/<FD>
# ext4: vérifier les blocs réservés root (peut faire "plein" pour les non-root)
sudo tune2fs -l /dev/sda1 | grep -E 'Block count|Reserved block count|Reserved block percentage'
# réduire prudemment (ex: 1%) si nécessaire:
# sudo tune2fs -m 1 /dev/sda1
# coredumps systemd volumineux
coredumpctl list | tail
sudo coredumpctl purge
# dossiers applicatifs typiques (data.pm)
sudo du -x --max-depth=1 -h /var/log/data.pm | sort -hr | head
sudo du -x --max-depth=1 -h /srv/data.pm | sort -hr | head
notes
- un disque peut être “plein” à cause des inodes (df -i à 100%) même si
df -hmontre de l’espace libre; ciblez les dossiers avec énormément de petits fichiers. - les fichiers supprimés mais toujours ouverts n’affranchissent pas l’espace tant que le processus ne ferme pas le descripteur (
lsof +L1pour repérer). - ne traversez pas d’autres filesystems pendant l’audit (
-x/-xdev) pour rester focalisé et plus rapide. - évitez les suppressions sauvages; préférez les mécanismes natifs (logrotate, journalctl vacuum, apt clean, prune Docker).
- sur ext4, une part des blocs est réservée au root (par défaut 5%); ajustez-la avec
tune2fs -msi pertinent sur de gros volumes non critiques.