Das Root-Dateisystem meines Kubuntu (eingehängt unter /
) ist Btrfs. Ich verwende es nicht -o discard
als Einhängeoption. Das bedeutetIch muss fstrim
auf 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 /
fstrim
meine 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 fstrim
mindestens ein paar MiB gekürzt habe, nicht nur 24 KiB wie heute. Jetzt scheint es eine Zwickmühle zu sein, in der fstrim
entweder das eine oder btrfs balance
das 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 upgrade
mich dann mit btrfs balance
und 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, fstrim
ohne btrfs balance
sich 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 mit
btrfs 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):
- Fügen Sie dem Btrfs-Dateisystem ein zusätzliches Gerät hinzu.
btrfs balance start …
fstrim …
- Löschen Sie das zusätzliche Gerät aus dem Btrfs-Dateisystem.
btrfs balance start …
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/sdb
oder 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 $extra
ist es so /dev/loop0
oder 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 scan
es während des Bootvorgangs erkannt wird.
# btrfs balance start /
In meinem Fall tempfile
ist das eine Sparse-Datei. In einer anderen Konsole führe ich sie aus watch ls -hls /mnt/hdd/tempfile
und 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
fstrim
Viel 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"