CLI AI

df meldet die Platte voll, du widerspricht. Wer hat recht?

2026-05-20

Beide. df fragt das Dateisystem, wie viele Blöcke belegt sind; du läuft den Verzeichnisbaum ab und addiert, was es sieht. Wenn die beiden auseinanderlaufen, hält etwas Platz fest, das keinen Namen mehr hat. So finden Sie es.

1. Die Differenz bestätigen

clai
$ clai vergleiche was df für / meldet mit dem was du dort tatsächlich findet→ df -h / && du -shx / 2>/dev/nullFilesystem      Size  Used Avail Use% Mounted on/dev/nvme1n1p2  915G  871G   44G  96% /348G	/

871 GB belegt, 348 GB gefunden. Diese Lücke ist das ganze Problem. -x hält du davon ab, in andere eingehängte Dateisysteme abzuwandern und die eigene Zahl aufzublähen.

2. Erst Inodes prüfen, dann Bytes jagen

clai
$ clai prüfe ob dem Dateisystem die Inodes ausgegangen sind statt des Platzes→ df -i /Filesystem        Inodes   IUsed      IFree IUse% Mounted on/dev/nvme1n1p2 124960768 3634368  121326400    3% /

Steht IUse% bei 100%, Use% aber nicht, haben Sie Millionen winziger Dateien und keinen freien Inode mehr. Das ist ein anderes Problem: Platz ist da, aber das Dateisystem kann keine weitere Datei mehr eintragen.

3. Gelöschte, aber noch offene Dateien finden

clai
$ clai zeig Dateien die gelöscht wurden aber noch von einem Prozess offen gehalten werden→ sudo lsof +L1COMMAND    PID USER   FD   TYPE DEVICE   SIZE/OFF NLINK  NODE NAMEpython3  23435 app     3u   REG  259,2 1000000000     0 41231 /var/log/app/debug.log (deleted)

NLINK 0 ist die Signatur: Kein Verzeichniseintrag zeigt mehr auf diese Datei, du sieht sie also nicht, die Blöcke bleiben aber belegt, bis der letzte Dateideskriptor schließt. Meist ist es ein Log, das jemand gelöscht hat, ohne den schreibenden Dienst neu zu starten.

4. Den Platz zurückholen

clai
$ clai starte den Dienst neu der diese gelöschte Datei festhält→ sudo systemctl restart app.service

Der Neustart schließt den Deskriptor und der Kernel gibt die Blöcke sofort frei. df fällt im selben Moment – ohne Aushängen, ohne Reboot.

5. Wenn ein Neustart gerade nicht geht

clai
$ clai leere die gelöschte Datei die pid 23435 auf fd 3 noch hält→ sudo truncate -s 0 /proc/23435/fd/3

Der Schreibzugriff über /proc/<pid>/fd/<n> leert die Datei, in die der Prozess weiterschreibt, ohne ihn zu beenden. Der Prozess behält seinen Deskriptor und loggt weiter; Sie bekommen den Platz sofort.

6. Der andere Klassiker: ein Mountpoint verdeckt Dateien

clai
$ clai prüfe ob etwas über ein Verzeichnis gemountet ist in dem noch Dateien liegen→ sudo mount --bind / /mnt/root && du -shx /mnt/root/var14G	/mnt/root/var

Wurde nach /var/data geschrieben, bevor dort eine Platte eingehängt wurde, liegen die Dateien weiter im Root-Dateisystem – und belegen Platz, den durch den Mount niemand sieht. Ein Bind-Mount von / legt sie offen.

Stolperfallen

  • du als root ausführen. Als normaler Nutzer überspringt es stillschweigend unlesbare Verzeichnisse, und Sie suchen ein Phantom, wo eigentlich Rechte das Problem sind.
  • lsof +L1 braucht Privilegien, um fremde Deskriptoren zu sehen. Ohne sudo bekommen Sie eine kurze, trügerisch saubere Liste.
  • Ein aktives Log nicht erneut löschen. Genau das hat die Situation erzeugt. Bei laufenden Logs truncate -s 0 nehmen oder logrotate mit copytruncate konfigurieren.

Verwandte Fragen

Warum kommt der Platz nach rm nicht zurück? Unter Unix entfernt Unlink den Namen, nicht die Daten. Die Blöcke werden frei, wenn der letzte offene Deskriptor schließt – bei einem laufenden Dienst also nie, bis er neu startet.

du und df weichen um ein paar Prozent ab, ist das schlimm? Nein. Das sind reservierte Blöcke (bei ext4 standardmäßig 5% für root) plus Metadaten. Nur große Lücken sind eine Untersuchung wert.

Geht das auch ohne lsof? Ja: sudo ls -l /proc/*/fd 2>/dev/null | grep deleted zeigt dasselbe über die Prozesstabelle.

Siehe auch

Schluss mit dem Nachschlagen von lsof-Flags um 3 Uhr nachts – beschreiben Sie das Problem, CliAI schreibt den Befehl. In einer Zeile installieren.