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):
- 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, so dass btrfs balance …
zusätzlicher Speicherplatz zur Verfügung steht. Das Gerät kann wie /dev/sdb
oder 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 $extra
ist /dev/loop0
oder 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 scan
beim Booten erkannt wird.
# btrfs balance start /
In meinem Fall tempfile
ist das eine spärliche Datei. In einer anderen Konsole laufe ich watch ls -hls /mnt/hdd/tempfile
und 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
fstrim
viel 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"