Ile miejsca zostałoby zwolnione przez usunięcie podobjętości btrfs?

11

Czy jest jakiś sposób, aby obliczyć, ile miejsca zwolnię, gdybym usunął jedno (lub kilka) podwolumny z dysku Btrfs (bez ich faktycznego usuwania)? Wiem, że „nie ma obecnie kodu, który wykonałby dla ciebie obliczenia” , ale jak byś to zrobił?

Zastanawiam się także, dlaczego mówią, że byłoby tak wolno? Zarówno usuwanie podobjętości, jak i pytanie o wolne miejsce jest z mojego doświadczenia bardzo szybkie, dlaczego robienie tego samego hipotetycznie byłoby o wiele wolniejsze?

Hjulle
źródło
2
Mam nadzieję, że wiesz, że btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list może być lepszym miejscem do zadawania pytań na temat wewnętrznego działania btrfs (lub dowolnego innego komponentu jądra). Jeśli otrzymasz odpowiedź, opublikuj ją tutaj. Sam jestem ciekawy odpowiedzi.
Adam Ryczkowski
1
Mówisz „Zarówno usunięcie podobjętości, jak i pytanie o wolne miejsce jest bardzo szybkie z mojego doświadczenia”. Kiedy usuwasz podwolumnę, tak naprawdę oznacza to, że podobjętość do usunięcia, w rzeczywistości uwalnia te bloki tylko, gdy nadejdzie czas (co oznacza komunikat „brak zatwierdzenia”, kiedy to robisz), więc nie, usuwanie nie jest koniecznie bardzo szybko.
etskinner

Odpowiedzi:

3

Powinieneś spojrzeć na btrfs quotai btrfs qgroups(grupy przydziałów).

Zasadniczo qgroupsrób dokładnie to, o co prosiłeś, śledzą, ile miejsca przydzielają podwolumny. Aby włączyć qgroupfunkcjonalność btrfssystemu plików, musisz

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

Jednak zanim to zrobisz, należy ostrzec, że spowoduje to całkowite ponowne obliczenie qgroupdanych, co zajmie trochę czasu, szczególnie w przypadku dużych systemów plików z wieloma podwoluminami. Ten proces przebiega asynchronicznie w tle. Możesz już sprawdzić status za qgroupspomocą

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

To da ci trochę takich wyników:

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

(Ostrzeżenie w pierwszym wierszu jest obecne tak długo, jak trwa ponowne skanowanie).

Btrfs automatycznie tworzy qgroupdla każdej podobjętości. W tym przypadku istnieją trzy podwolumny o podobjętościach ID 4881, 7990 i 8400. Część przed ukośnikiem to poziom qgroup. Każda podobjętość qgroupznajduje się na poziomie 0. Dodatkowo istnieje specjalna qgroupna poziomie 0, która zawsze ma identyfikator 5 i odpowiada katalogowi głównemu systemu plików btrfs.

Dla każdego qgrouppowyższego wyjścia pokazuje, ile miejsca odnosi się do niego. Oznacza to, że odpowiednie podobjętość zawiera pliki, których całkowity rozmiar jest równy podanej liczbie.

Jednak ze względu na migawki i charakter woluminów btrfs kopiowania przy zapisie mogą udostępniać pliki. Oznacza to, że do treści (lub w rzeczywistości zakresu) plików może odnosić się więcej niż jedna podwolumna. Jest to wyrażone przez drugą liczbę, która pokazuje, ile miejsca jest przydzielane wyłącznie przez każdą podobjętość i nie jest dzielone z żadną inną podobjętością. W przypadku usunięcia podobjętości jest to miejsce, które zostanie faktycznie zwolnione.

Jeśli chcesz dowiedzieć się, ile miejsca zostanie zwolnione, jeśli usuniesz wiele podwoluminów, możesz użyć wyżej wymienionych poziomów. qgroupszorganizowane w hierarchię, a grupy na wyższych poziomach (powyżej 0) agregują informacje o niższych poziomach.

Tak więc, aby dowiedzieć się, ile miejsca zostałoby zwolnione, gdyby podwoluminy 4881 i 7990 (w powyższym przykładzie) zostałyby usunięte, utwórz nowy qgroup(dowolnie z ID 0, ale możesz wybrać, co chcesz tutaj) na poziomie 1 za pomocą

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

Następnie przypisz nowo utworzony qgroupelement nadrzędny do qgroupspodwoluminów, które chcesz usunąć

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

Spowoduje to kolejne ponowne skanowanie informacji o przydziale, co może chwilę potrwać. Jeśli jest zakończony, a teraz wydajesz

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

otrzymujesz taki wynik:

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

(Dodałem -pflagę, aby dodać parentkolumnę do wyniku, który pokazuje relację nadrzędny / podrzędny qgroups.)

Teraz linia z qgroup 1/0informuje o tym, ile miejsca odnoszą się do obu podwoluminów, które chcesz usunąć, a co ważniejsze, mówi, ile miejsca przydzielają wyłącznie one . Jest to ilość miejsca, które zostanie zwolnione, jeśli usuniesz oba podwoluminy.

Zastanawiam się także, dlaczego mówią, że byłoby tak wolno?

Jest to spowodowane naturą btrfs podczas kopiowania i zapisu wraz z migawkami. Jeśli utworzysz migawkę w btrfs (normalnie), wszystkie rzeczywiste dane w nowo utworzonym podwolumnie zawierającym migawkę są współdzielone ze źródłem migawki. Tylko gdy plik zostanie zmieniony lub zamieniony w źródle, wskazuje to na inną zawartość (zakres). To sprawia, że ​​bardzo trudno jest oszacować, ile miejsca faktycznie zostałoby zwolnione, gdyby podobjętości zostały usunięte, ponieważ trzeba uwzględnić całe miejsce, które jest współdzielone z innymi podobjętościami.

Erki der Loony
źródło