Btrfs auf SSD, „kein Speicherplatz mehr auf dem Gerät“; Catch-22 mit „fstrim“ und „btrfs balance“; wie kann ich das Problem wiederherstellen?

Btrfs auf SSD, „kein Speicherplatz mehr auf dem Gerät“; Catch-22 mit „fstrim“ und „btrfs balance“; wie kann ich das Problem wiederherstellen?

Das Root-Dateisystem meines Kubuntu (eingehängt unter /) ist Btrfs. Ich verwende es nicht -o discardals Einhängeoption. Das bedeutetIch muss fstrimauf Abruf laufen.

In der Vergangenheit hatte ich dieses Problem:btrfs, kein Speicherplatz mehr frei. Mir fiel auf, dass fast kein Platz abgeschnitten wurde. Meine Lösung war, vor fstrim -v /auszuführen . Das ist der Kern vonbtrfs balance start /fstrimmeine Antwort dort.

Heute ist es anders. Vielleicht bin ich mit der Wartung zu spät dran. Folgendes passiert:

# fstrim -v /
/: 24 KiB (24576 bytes) trimmed
# btrfs balance start /
ERROR: error during balancing '/': No space left on device

Ich habe ein paar Subvolumes (Snapshots) gelöscht btrfs subvolume delete …und es hat nicht geholfen. Ich kann mich nicht mehr so ​​gut an Details erinnern, aber ich glaube, vorher konnte ich es ausführen, btrfs balance …weil ich vorab fstrimmindestens ein paar MiB gekürzt habe, nicht nur 24 KiB wie heute. Jetzt scheint es eine Zwickmühle zu sein, in der fstrimentweder das eine oder btrfs balancedas andere nur funktionieren würde, wenn das andere zuerst seine Arbeit erledigt hätte.

Der Vollständigkeit halber seien hier einige Statistiken aufgeführt, die zeigen, dass ich tatsächlich jede Menge Platz habe:

# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       112G   43G   68G  39% /

# btrfs fi df /
Data, single: total=108.73GiB, used=41.00GiB
System, single: total=64.00MiB, used=16.00KiB
Metadata, single: total=3.00GiB, used=1.02GiB
GlobalReserve, single: total=352.00MiB, used=0.00B

Beachten Sie, dass ich während des normalen Betriebs noch nicht die Meldung „Kein Speicherplatz mehr auf dem Gerät“ erhalten habe. Ich denke, Btrfs fügt neue Schreibvorgänge weiterhin in bereits belegte Blöcke ein. In der Vergangenheit habe ich jedoch während die Meldung „Kein Speicherplatz mehr …“ erhalten und apt-get upgrademich dann mit btrfs balanceund erholt fstrim. Ich weiß nicht, wann (ob) mir dies erneut passiert. Ich möchte meine Wartung durchführen, bevor ich bei wichtigen Aufgaben die Meldung „Kein Speicherplatz mehr …“ erhalte.

Wie kann man aus dieser Situation wieder herauskommen, fstrimohne btrfs balancesich gegenseitig zu blockieren?Kann ich das Problem innerhalb meines laufenden Systems beheben?

Tatsächlich habe ich das bereits behoben, meine Antwort ist unten. Die Frage dient zur späteren Bezugnahme. Fügen Sie gerne eine weitere Lösung hinzu.


Weitere Informationen:

$ uname -a
Linux foobar 4.4.0-78-generic #99-Ubuntu SMP […] x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

# dpkg -l | grep btrfs
ii  btrfs-tools  4.4-1ubuntu1  amd64  Checksumming Copy on Write Filesystem utilities

Antwort1

Ja, Sie können die Wiederherstellung innerhalb Ihres laufenden Systems durchführen. Mein ursprünglicher Ansatz ist unten aufgeführt. Dank des Kommentars von Zan Lynx habe ich jedoch einen einfacheren Weg gefunden.

Mein verbesserter Ansatz

Dies ist der erwähnte Kommentar:

Oder wenn Sie vorausdenken, können Sie btrfs anweisen, weniger als das Maximum des Geräts zu verwenden mitbtrfs filesystem resize

(Im Vergleich zu meinem ursprünglichen Ansatz geht es darum, absichtlich etwas freien Speicherplatz auf diesem bestimmten Gerät zu schaffen und das Dateisystem dort zu erweitern, anstatt ein separates Gerät hinzuzufügen, was möglicherweise nicht so einfach ist.)

Gute Neuigkeiten: Meine Tests zeigen, dass ich nicht vorausdenken muss! Selbst wenn btrfs balance start /"kein Platz mehr übrig ..." ausgegeben wird, kann ich das Dateisystem immer noch verkleinern, wenn nur Platz dafür vorhanden ist (d. h. alle Dateien und Metadaten passen in die neue Größe). Dies führt zu folgender Lösung:

# btrfs filesystem resize -100M /  # shrink a little...
Resize '/' of '-100M'
# btrfs filesystem resize +100M /  # ... and expand back
Resize '/' of '+100M'
# btrfs balance start /            # should work now
Done, had to relocate 88 out of 88 chunks
# fstrim -v /
/: 67,8 GiB (72753831936 bytes) trimmed

Mein ursprünglicher Ansatz

Das müssen Sie tun (detaillierte Beschreibung weiter unten):

  1. Fügen Sie dem Btrfs-Dateisystem ein zusätzliches Gerät hinzu.
  2. btrfs balance start …
  3. fstrim …
  4. Löschen Sie das zusätzliche Gerät aus dem Btrfs-Dateisystem.
  5. btrfs balance start …
  6. fstrim …

Der Trick besteht darin, dem Btrfs-Dateisystem ein zusätzliches Gerät hinzuzufügen, um btrfs balance …zusätzlichen Speicherplatz zu erhalten. Das Gerät kann wie /dev/sdboder aussehen /dev/sdb3. In diesem Beispiel verwende ich eine normale 1-GiB-Datei auf meiner Festplatte (sehr wichtig:Ich überprüfe noch einmal, dass die Datei nicht zum Btrfs-Dateisystem gehört, das ich erweitern möchte! Das könnte fatale Folgen haben. Ich denke, eine Datei im RAM (z. B. in /dev/shm/) sollte genauso gut funktionieren.

# tmpf=/mnt/hdd/tempfile   # if this file exists, it will be overwritten!
# truncate -s 1G "$tmpf"
# extra=$(losetup -f --show "$tmpf")

Jetzt $extraist es so /dev/loop0oder so.

# btrfs device add "$extra" /

In diesem Moment darf ich mein Betriebssystem nicht neu starten. Wenn ich das täte, würde ein Teil des Root-Dateisystems fehlen, da kein /dev/loop*mit verknüpft wäre /mnt/hdd/tempfile. Das ist kein Problem, wenn Sie ein normales Gerät (oder eine Partition) als zusätzliches Gerät verwenden, da btrfs device scanes während des Bootvorgangs erkannt wird.

# btrfs balance start /

In meinem Fall tempfileist das eine Sparse-Datei. In einer anderen Konsole führe ich sie aus watch ls -hls /mnt/hdd/tempfileund merke, wenn sie ihre (fast) volle Größe erreicht. Auf diese Weise weiß ich, wann einige Btrfs-Blöcke von der SSD verschoben werden. Im Zweifelsfall lasse ich sie btrfs ballance …beenden; ich rufe sie jedoch auf, btrfs balance cancel /um Zeit zu sparen. Kehren wir nun zur Hauptkonsole zurück.

Hinweis: Die erste Zeile unten stammt aus dem obigen btrfs balance start /Befehl, der unterbrochen wurde.

balance canceled by user
# fstrim -v /
/: 26,7 GiB (28696862720 bytes) trimmed

fstrimViel mehr abgespeckt als vorher. Ich brauche mein zusätzliches Gerät nicht mehr.

# btrfs device delete "$extra" /   # may take a while
# btrfs balance start /            # should work now
Done, had to relocate 88 out of 88 chunks
# fstrim -v /
/: 67,8 GiB (72753831936 bytes) trimmed

Und das ist es. Jetzt ist es Zeit zum Reinigen:

# losetup -d "$extra"
# rm "$tmpf"

verwandte Informationen