Wie viel Speicherplatz würde durch Entfernen eines btrfs-Subvolumes freigegeben?

11

Gibt es eine Möglichkeit zu berechnen, wie viel Speicherplatz ich freigeben würde, wenn ich ein (oder mehrere) Subvolumes auf einer Btrfs-Festplatte entfernen würde (ohne sie tatsächlich zu entfernen)? Ich weiß, dass es "derzeit keinen Code gibt, der die Berechnung für Sie übernimmt" , aber wie würden Sie das tun?

Ich frage mich auch, warum sie sagen, dass es so langsam sein würde? Sowohl das Entfernen eines Subvolumens als auch das Fragen nach freiem Speicherplatz ist meiner Erfahrung nach sehr schnell. Warum sollte das gleiche hypothetisch so viel langsamer sein?

Hjulle
quelle
2
Ich hoffe, Sie wissen, dass btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list ein besserer Ort ist, um Fragen zum Innenleben des btrfs (oder einer anderen Kernelkomponente) zu stellen. Wenn Sie die Antwort erhalten, posten Sie sie bitte auch hier. Ich bin selbst neugierig auf die Antwort.
Adam Ryczkowski
1
Sie sagen: "Sowohl das Entfernen eines Subvolumes als auch das Fragen nach freiem Speicherplatz ist meiner Erfahrung nach sehr schnell." Wenn Sie ein Subvolume löschen, wird dieses Subvolume nur zum Löschen markiert. Diese Blöcke werden nur dann freigegeben, wenn die Zeit abgelaufen ist (was die Meldung "Kein Festschreiben" bedeutet, wenn Sie dies tun). Nein, das Löschen ist dies nicht unbedingt sehr schnell.
Etskinner

Antworten:

3

Sie sollten sich btrfs quotaund btrfs qgroups(Quotengruppen) ansehen .

qgroupsMachen Sie im Grunde genau das, was Sie angefordert haben. Sie verfolgen, wie viel Speicherplatz von Subvolumes zugewiesen wird. Um die qgroupFunktionalität für ein btrfsDateisystem zu aktivieren, müssen Sie

# btrfs quota enable /path/to/btrfs/filesystem

Bevor Sie dies tun, sollten Sie jedoch gewarnt werden, dass dies eine vollständige qgroupNeuberechnung der Daten auslöst, was insbesondere bei großen Dateisystemen mit vielen Subvolumes einige Zeit in Anspruch nimmt. Dieser Prozess läuft asynchron im Hintergrund. Sie können den Status des qgroupsmit bereits überprüfen

# btrfs qgroup show /path/to/btrfs/filesystem

Dies gibt Ihnen eine Ausgabe wie folgt:

WARNING: rescan is running, qgroup data may be incorrect
qgroupid         rfer         excl
--------         ----         ----
0/5         843.69GiB     61.91MiB
0/4881      811.06GiB      9.34GiB
0/7990      867.32GiB    329.91MiB
0/8400      867.17GiB     37.64MiB

(Die Warnung in der ersten Zeile ist vorhanden, solange der Rescan noch ausgeführt wird.)

Btrfs erstellt automatisch ein qgroupfür jedes Subvolume. In diesem Fall gibt es drei Subvolumes mit den Subvolume-IDs 4881, 7990 und 8400. Der Teil vor dem Schrägstrich ist der Pegel des qgroup. Jedes Subvolumen qgroupbefindet sich auf Stufe 0. Zusätzlich gibt es ein speziellesqgroup auf Ebene 0, das immer die ID 5 hat und dem Stammverzeichnis des btrfs-Dateisystems entspricht.

Für jedes qgroup zeigt die obige Ausgabe, wie viel Speicherplatz von ihr referenziert wird. Das bedeutet, dass das entsprechende Teilvolumen Dateien enthält, deren Gesamtgröße der angezeigten Anzahl entspricht.

Aufgrund von Snapshots und der Copy-on-Write-Natur von btrfs-Subvolumes können jedoch Dateien gemeinsam genutzt werden. Dies bedeutet, dass der Inhalt (oder tatsächlich der Umfang) von Dateien von mehr als einem Subvolume referenziert werden kann. Dies wird durch die zweite Zahl ausgedrückt, die angibt , wie viel Speicherplatz ausschließlich von jedem Teilvolumen zugewiesen wird und nicht mit einem anderen Teilvolumen geteilt wird. Wenn Sie ein Subvolume löschen, ist dies der Speicherplatz, der tatsächlich freigegeben wird.

Wenn Sie herausfinden möchten, wie viel Speicherplatz beim Löschen mehrerer Subvolumes frei wird, können Sie die oben genannten Ebenen verwenden. qgroupssind in einer Hierarchie organisiert und Gruppen auf oberen Ebenen (höher als 0) aggregieren die Informationen der unteren Ebenen.

Um herauszufinden, wie viel Speicherplatz freigegeben würde, wenn die Subvolumes 4881 und 7990 (im obigen Beispiel) gelöscht würden, erstellen Sie eine neue qgroup(willkürlich mit der ID 0, aber Sie können hier wählen, was Sie möchten ) auf Ebene 1 mit

# btrfs qgroup create 1/0 /path/to/btrfs/filesystem

Weisen Sie dann das neu erstellte qgroupübergeordnete qgroupsElement den Subvolumes zu, mit denen Sie löschen möchten

# btrfs qgroup assign 0/4881 1/0 /path/to/btrfs/filesystem
# btrfs qgroup assign 0/7990 1/0 /path/to/btrfs/filesystem

Dies löst einen weiteren erneuten Scan der Kontingentinformationen aus, der eine Weile dauern kann. Wenn es fertig ist und Sie jetzt ausstellen

# btrfs qgroup show -p /path/to/btrfs/filesystem

Sie erhalten eine Ausgabe wie folgt:

qgroupid         rfer         excl parent
--------         ----         ---- ------
0/5           1.38TiB      2.51GiB ---
0/4881        1.11TiB     10.86GiB 1/0
0/7990        1.23TiB    502.41MiB 1/0
0/8400        1.34TiB      1.69GiB 1/0
1/0           1.51TiB    132.23GiB ---

(Ich habe das -pFlag hinzugefügt , um die parentSpalte zur Ausgabe hinzuzufügen, die die Eltern-Kind-Beziehung von zeigt qgroups.)

In der Zeile mit qgroup 1/0erfahren Sie nun, wie viel Speicherplatz von beiden zu löschenden Subvolumes referenziert wird, und, was noch wichtiger ist, wie viel Speicherplatz ausschließlich von ihnen zugewiesen wird . Dies ist die Menge an Speicherplatz, die freigegeben wird, wenn Sie beide Subvolumes löschen.

Ich frage mich auch, warum sie sagen, dass es so langsam sein würde?

Dies liegt an der Copy-on-Write-Natur von btrfs zusammen mit Snapshots. Wenn Sie in btrfs (normalerweise) einen Snapshot erstellen, werden alle tatsächlichen Daten in dem neu erstellten Subvolume, das den Snapshot enthält, für die Quelle des Snapshots freigegeben. Nur wenn eine Datei in der Quelle geändert oder ersetzt wird, verweist sie auf unterschiedliche Inhalte (Extents). Dies macht es sehr schwierig zu beurteilen, wie viel Speicherplatz tatsächlich freigegeben würde, wenn ein Subvolume gelöscht wird, da Sie den gesamten Speicherplatz berücksichtigen müssen, der mit anderen Subvolumes geteilt wird.

Erki der Loony
quelle