Btrfs auf SSD, "kein Platz mehr auf Gerät"; catch-22 mit "fstrim" und "btrfs balance"; wie man sich erholt

686
Kamil Maciorowski

Das Root-Dateisystem meines Kubuntu (gemountet /) ist Btrfs. Ich benutze nicht -o discardals Mount-Option. Das heißt, ich muss fstrimauf Abruf laufen .

In der Vergangenheit traf ich dieses Problem: btrfs, kein Speicherplatz mehr . Ich bemerkte fstrim -v /, dass fast kein Platz zugeschnitten wurde. Meine Lösung sollte btrfs balance start /vorher laufen fstrim. Das ist der Kern meiner Antwort dort .

Heute ist es anders. Vielleicht bin ich mit der Wartung zu spät. Das ist, was passiert:

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

Ich habe einige Subvolumes (Schnappschüsse) mit gelöscht btrfs subvolume delete …und es hat nicht geholfen. Ich kann mich nicht gut an Details erinnern, aber ich glaube, ich konnte früher laufen, btrfs balance …weil die fstrimVorrendite mindestens ein paar MiB-Werte gekürzt hat, nicht weniger als 24 KiB wie heute. Nun scheint es wie eine Catch-22 Situation, in fstrimoder btrfs balancewürde nur funktionieren, wenn die anderen zuerst seinen Job.

Dies sind einige Statistiken, die zeigen, dass ich tatsächlich viel 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 

Hinweis Ich habe im normalen Betrieb noch keinen Platz auf dem Gerät. Ich denke, Btrfs passt immer neue Schreibvorgänge in bereits aufgenommenen Brocken ein. In der Vergangenheit habe ich jedoch "no space left ..." gedrückt apt-get upgrade, dann habe ich mich mit btrfs balanceund erholt fstrim. Ich weiß nicht wann (ob) das mich wieder trifft. Ich möchte meine Wartung durchführen, bevor ich "etwas Platz übrig habe", wenn ich etwas Wichtiges mache.

Wie kann man sich so von dieser Situation erholen fstrimund btrfs balancesich nicht gegenseitig blockieren? Kann ich das in meinem laufenden System beheben?

In der Tat habe ich das schon behoben, meine Antwort ist unten. Die Frage ist für die Zukunft gedacht. Fühlen Sie sich frei, eine andere Lösung hinzuzufügen.


Zusätzliche Information:

$ 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 
3

1 Antwort auf die Frage

4
Kamil Maciorowski

Ja, Sie können von Ihrem laufenden System aus wiederherstellen. Mein ursprünglicher Ansatz ist unten. Dank des Kommentars von Zan Lynx fand ich jedoch einen einfacheren Weg.

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 btrfs filesystem resize

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

Gute Nachrichten: Meine Tests zeigen, dass ich nicht weiter denken muss! Selbst wenn btrfs balance start /"kein Platz mehr übrig bleibt", kann ich das Dateisystem immer noch verkleinern, wenn nur Platz dafür vorhanden ist (dh 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 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, so dass btrfs balance …zusätzlicher Speicherplatz zur Verfügung steht. Das Gerät kann wie /dev/sdboder sein /dev/sdb3. In diesem Beispiel verwende ich eine reguläre 1-GiB-Datei auf meiner Festplatte ( sehr wichtig: Ich überprüfe, ob die Datei nicht zum Btrfs-Dateisystem gehört, das ich erweitern möchte! Dies könnte fatal sein). Ich denke, eine Datei im RAM (zB 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 /dev/loop0oder so etwas.

# btrfs device add "$extra" / 

In diesem Moment darf ich mein Betriebssystem nicht neu starten. Wenn ich dies täte, würde es einen Teil seines Root-Dateisystems haben, da kein zugeordnet werden /dev/loop*würde /mnt/hdd/tempfile. Dies ist kein Problem, wenn Sie ein normales Gerät (oder eine Partition) als zusätzliches Gerät verwenden, da dies btrfs device scanbeim Booten erkannt wird.

# btrfs balance start / 

In meinem Fall tempfileist das eine spärliche Datei. In einer anderen Konsole laufe ich watch ls -hls /mnt/hdd/tempfileund merke, wann es seine (fast) volle Größe erreicht. Auf diese Weise weiß ich, wann einige Btrfs-Chunks von der SSD verschoben werden. Wenn Sie Zweifel haben, lassen Sie es zu btrfs ballance …Ende gehen. aber ich rufe btrfs balance cancel /, um etwas Zeit zu sparen. Gehen wir jetzt zurück zur Hauptkonsole.

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

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

fstrimviel mehr als zuvor getrimmt. 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 zu säubern:

# losetup -d "$extra" # rm "$tmpf" 
Ich verwende häufig ein USB-Laufwerk oder Swap -off -a und formatiere meine Swap-Partition als Btrfs-Gerät. Die Verwendung eines RAM-Laufwerks scheint viel zu riskant zu sein. Zan Lynx vor 6 Jahren 0
Oder wenn Sie vorausdenken, können Sie btrfs anweisen, mit `btrfs filesystem size 'weniger als das Maximum des Geräts zu verwenden Zan Lynx vor 6 Jahren 1
@ZanLynx Danke! Ich habe meine Antwort mit dieser 'Resize'-Idee sehr verbessert. Kamil Maciorowski vor 6 Jahren 0