Musiałem uruchomić btrfs balance
na moim pojedynczym systemie plików, ponieważ otrzymywałem ENOSPC
mimo że rzeczywiście było wolne miejsce.
Dlaczego trzeba to uruchomić?
Co właściwie robi saldo?
Odpowiedź
W przeciwieństwie do większości konwencjonalnych systemów plików, BTRFS używa dwustopniowego alokatora. Pierwszy etap przydziela duże obszary przestrzeni zwane fragmentami dla określonych typów danych , a następnie drugi etap przydziela bloki jak zwykły system plików w tych większych regionach. Istnieją trzy różne typy fragmentów:
-
Fragmenty danych: przechowują zwykłe dane pliku.
-
Fragmenty metadanych: przechowują metadane dotyczące plików, w tym między innymi znaczniki czasu, sumy kontrolne, nazwy plików, własność, uprawnienia i atrybuty rozszerzone.
-
Fragmenty systemu: Jest to specjalny rodzaj porcji, który przechowuje dane o tym, gdzie znajdują się wszystkie inne fragmenty.
Tylko typ danych, do których jest przydzielona porcja, może być przechowywany w tej porcji. Obecnie najczęstszym przypadkiem, kiedy pojawia się błąd -ENOSPC w BTRFS, jest brak miejsca na dane lub metadane w istniejących fragmentach i nie można przydzielić nowej porcji. Możesz sprawdzić, czy tak jest, uruchamianie btrfs fi df
w systemie plików, który spowodował błąd. Jeśli w wierszu Dane lub metadane jest wyświetlana wartość Łączna, która znacznie różni się od wartości Użyte, prawdopodobnie jest to przyczyna.
btrfs balance
polega na wysyłaniu rzeczy z powrotem przez alokator, co skutkuje zużyciem miejsca w kompaktowanych porcjach. Na przykład, jeśli masz dwie porcje metadanych, które są 40% zapełnienia, saldo spowoduje, że staną się one jednym fragmentem metadanych, który jest zapełniony w 80%. Dzięki takiemu zagęszczeniu wykorzystania przestrzeni operacja równoważenia jest następnie w stanie usunąć puste fragmenty, a tym samym zwolnić miejsce na przydzielanie nowych fragmentów. Jeśli ponownie uruchomisz btrfs fi df
po uruchomieniu salda, powinieneś zobaczyć, że wartości Total i Used są znacznie bliżej siebie, ponieważ saldo usunięte fragmenty, które nie były już potrzebne.