Die Tücken von BTRFS - Festplatte voll, obwohl nicht voll

  • Die alten Hasen und Häsinnen unter uns werden es bestimmt kennen, aber für Linux Frischlinge könnte das Thema interessant sein. BTRFS ist in den letzten Jahren auch durch diverse Linux YouTuber als der "heiße Scheiß" kolportiert worden. Und ja, BTRFS hat ein paar nette Features und bringt so manche Vorteile mit. Einer der großen Vorteile ist, dass es als copy on write Filesystem in Verbindung mit subvolumes eine Snapshot Funktion mitbringt, die ein Zurückrollen z.B. bei einem fehlerhaften Update ermöglicht.

    Mit seinen Vorteilen ist aber auch ein Nachteil, der von den YT Fanboys und Fangirls selten angesprochen wird. BTRFS gibt einmal beschriebene Festplattenbereich automatisch nicht wieder frei, auch wenn die Daten dort gelöscht wurden. Das liegt an dem Aufbau von BTRFS. Stark vereinfacht unterscheidet BTRFS die Daten in Nutzdaten (mir fällt kein besserer Begriff dazu ein) und Metadaten. Die Nutzdaten die Daten die wir auf der Festplatte kennen, also z.B. ein Video, ein Musikdatei, ein Dokument, Foto etc. Zu diesen Daten hält BTRFS noch einen Bereich vor, in dem es die Metadaten zu diesen Nutzdaten verwaltet. In diesen Dingen steht z.B. drin, wo es die Daten abgelegt hat, in welchem Volume es liegt, wieviele Snapshots es davon gibt etc.

    Dabei kann es nicht selten passieren, dass dieser Metadaten-Bereich voll läuft. Das passiert immer dann, wenn die Festplatte auch physisch wirklich einmal ziemlich voll ist, weil man z.B. ein fettes Spiel installiert hat oder eine installierte VM stark gewachsen ist oder die MP3 Sammlung explodiert etc.

    Auch wenn man jetzt die eigentlichen Nutzungsdaten löscht (VM Image weg, Spiel wieder deinstalliert etc.), hält BTRFS dessen Metadaten trotzdem noch vor. BTRFS bereinigt diese Daten nicht unbedingt automatisch. Man spricht hier von "Balancierung". Diese Balancierung müssen diese User in vielen Fällen selbst durchführen, weil BTRFS das noch nicht selbst machen kann. Es kann sein, dass manche Distros, die BTRFS nativ mitbringen, diese Metadaten über Tools oder Cronjobs im Hintergrund balancieren, aber die meisten Distros, bei denen der Anwender bewusst BTRFS als Dateisystem ausgewählt hat (Debian, Ubuntu, deren Derivate etc.), bringen diesen Automatismus nicht mit.

    Warum erzähle ich Euch das? Aktuell habe ich auf meinem Läppi mal wieder diesen Effekt. Sowohl der Dateiexplorer (1) als auf "df -H" (2) zeigen noch massig Speicherplatz auf meinem Rechner an (83 GB). Wenn ich auf diesem Rechner jetzt eine größere Datei kopieren möchte, eine VM starte oder z.B. ein Spiel installieren will, bricht der Vorgang mit "Disk write error", "Disk full" oder ähnliches ab. Fies daran ist, dass die althergebrachten Tools zur Berechnung des freien Speichers nicht die Metadaten von BTRFS berücksichtigen. Benutzt man hingegen den BTRFS exklusiven Befehl "btrfs filesystem show" (3), zeigt BTRFS an, dass die Platte proppevoll ist.

    In meinem Fall kann ich auf der HD kein "btrfs balance start fulldisk" Kommando absetzen, weil btrfs balance freien Speicher benötigt, um Speicher zu löschen. Ich muss in meinem Fall über einen Bootstick oder eine Image-Datei gehen und mein System mounten, um die Metadaten zu bereinigen. Die Mühe werde mich mir aber nicht mehr machen, weil der Rechner demnächst sowieso platt gemacht werden soll.

    Lange Rede, kurzer Sinn: Behaltet immer den Füllstand Eures BTRFS im Auge.

    Daily Driver PC: Pop!_OS 22.04 + Win 10 Dual Boot/ Intel i7-7700K / NVIDIA GeForce GTX 1070 / 32 GB RAM / 3x 1TB Samsung SSD

    Daily Driver Laptop: Framework 13 / Ubuntu 24.04 LTS / AMD Ryzen 7 7840U / 64 GB RAM / 2TB WD NVME

    Backup Laptop: HP Elitebook x360 1030 G2 / Fedora 39 / Intel i5-7200U / Intel HD 620 / 8 GB RAM / 500 GB Samsung NVMe

    Spiele PC: MX Linux + Garuda / AMD Ryzen 7 7800X3D / Radeon RX 6750 XT / 64 GB RAM / 2TB Samsung NVME + 512 GB Kingston NVME + 250 GB Samsung SSD

  • Ich konnte das System doch noch bereinigen, ohne die Platte in ein anderes System einzuhängen. Ich hatte noch luxuriöse 1.06 MB nicht-allokierten Speicher frei. ;)

    Über den Befehl sudo btrfs balance start -dusage=50 / konnte ich alle Datenblöcke komprimieren, die weniger als 50% voll sind und konnte auf die schnelle 37 GB Speicher im BTRFS wieder als frei deklarieren. Näheres dazu findet Ihr in diesem Artikel.

    Das sollte bis zur Neuinstallation mehr als ausreichend sein.

    Daily Driver PC: Pop!_OS 22.04 + Win 10 Dual Boot/ Intel i7-7700K / NVIDIA GeForce GTX 1070 / 32 GB RAM / 3x 1TB Samsung SSD

    Daily Driver Laptop: Framework 13 / Ubuntu 24.04 LTS / AMD Ryzen 7 7840U / 64 GB RAM / 2TB WD NVME

    Backup Laptop: HP Elitebook x360 1030 G2 / Fedora 39 / Intel i5-7200U / Intel HD 620 / 8 GB RAM / 500 GB Samsung NVMe

    Spiele PC: MX Linux + Garuda / AMD Ryzen 7 7800X3D / Radeon RX 6750 XT / 64 GB RAM / 2TB Samsung NVME + 512 GB Kingston NVME + 250 GB Samsung SSD

  • Danke "verrücktes Hähnchen" :);)

    Da gibt es verschiedene Lösungsmöglichkeiten.

    Gut beschrieben und dient wirklich für alle die sich, auch nicht nur oberflächlich damit beschäftigen.

    Klasse, nochmals Danke für den Beitrag !!


    Gruss


    Fubba

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!