Wohin ist der Plattenplatz? df, du und die Datei, die noch offen ist
„No space left on device" – und df zeigt 100 %, du findet aber nur die Hälfte. Diese Lücke hat fast immer denselben Grund, und mit vier Befehlen ist der Übeltäter in zwei Minuten gefunden.
Ein Server meldet „kein Platz mehr", die Anwendung schreibt nicht mehr, und die Uhr läuft. Die Suche folgt immer derselben Reihenfolge: erst welches Dateisystem, dann welches Verzeichnis, dann welche Datei – und wenn nichts passt, die unsichtbare Variante.
1. Welches Dateisystem ist voll?
df -h # Größe, belegt, frei – je Einhängepunkt
df -h /var/log # gezielt für einen Pfad
df -i # Inodes! Voll, obwohl Platz frei ist = Millionen kleine Dateiendf -i wird gern vergessen: Ein Verzeichnis mit 4 Millionen Sitzungsdateien belegt kaum Megabyte, aber alle Inodes – und dann schreibt nichts mehr, obwohl df -h 60 % frei meldet.
2. Welches Verzeichnis?
du -xh --max-depth=1 /var | sort -h | tail -20Drei Schalter, die zählen: -x bleibt auf einem Dateisystem (sonst zählst du das gemountete Backup mit), -h schreibt lesbare Größen, und sort -h sortiert genau diese – „1,2G" landet damit hinter „980M" und nicht davor.
Von dort arbeitest du dich nach unten:
du -xh --max-depth=1 /var/lib | sort -h | tail -103. Welche Dateien?
# Die 20 größten Dateien unterhalb eines Pfads
find /var -xdev -type f -printf '%s\t%p\n' 2>/dev/null | sort -rn | head -20 | numfmt --to=iec --field=1
# Alles über 500 MB
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null4. Der Klassiker: gelöscht, aber noch offen
Jemand hat rm access.log gemacht, während der Webserver hineinschrieb. Der Verzeichniseintrag ist weg, der Platz nicht – erst wenn der letzte Prozess die Datei schließt, wird er frei. Genau das erklärt die Lücke zwischen df und du:
lsof +L1 # Dateien mit Link-Zahl 0, also gelöscht und noch offen
lsof -nP | grep deletedFreigeben ohne Neustart des Dienstes:
: > /proc/<PID>/fd/<FD> # die offene Datei auf Länge 0 kürzenSauberer ist natürlich, den Dienst einmal neu zu laden (systemctl reload nginx) – oder logrotate richtig einzurichten, damit es gar nicht erst passiert.
Die üblichen Verdächtigen
journalctl --disk-usage # systemd-Journal
journalctl --vacuum-size=200M # auf 200 MB eindampfen
docker system df # Images, Container, Volumes, Build-Cache
apt-get clean # Paket-ZwischenspeicherFallstrick
du zeigt den belegten Platz, nicht die Dateigröße – bei Dateien mit Löchern (Datenbank-Dateien, VM-Abbilder) weichen beide stark voneinander ab. Und ohne -x läuft du / fröhlich in Netzlaufwerke und in /proc; das dauert nicht nur ewig, es zählt auch falsch. Letzter Hinweis: Lösch nie ins Blaue. Eine Datei, die gerade geschrieben wird, verschwindet nicht wirklich – sie belegt den Platz weiter und nimmt dir zusätzlich die Möglichkeit, hineinzuschauen.
Wenn dein Server regelmäßig volläuft, ist das meistens ein Einrichtungs- und kein Platzproblem. Ich schaue gern drauf: bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Heredocs in Bash – mehrzeilige Texte, Konfigurationen und SQL ohne Echo-Wüste
Zwanzig echo-Zeilen für eine Konfigurationsdatei sind mühsam und fehleranfällig. Ein Heredoc schreibt den Text so, wie er aussehen soll – mit oder ohne Variablen, je nachdem, wie du den Marker schreibst.
Standardwerte und Pflichtvariablen in Bash – ${VAR:-…} und ${VAR:?…}
Fehlt eine Umgebungsvariable, läuft das Skript oft trotzdem los – und löscht dann /backup/ statt /backup/kunde42/. Die Shell kann Standardwerte setzen und fehlende Werte laut einfordern, ohne eine einzige if-Abfrage.
Warum "$@" in Anführungszeichen gehört – Quoting und Arrays in Bash
Ein Dateiname mit Leerzeichen, und aus einem Argument werden zwei. Das ist keine Kleinigkeit: Genau daraus entstehen Skripte, die die falsche Datei löschen. Die Regeln dafür passen auf eine Seite.