Btrfs na SSD, „brak miejsca na urządzeniu”; catch-22 z `fstrim` i` btrfs balance`; jak odzyskać?

3

Główny system plików mojego Kubuntu (zamontowany pod /) to Btrfs. Nie używam -o discardjako opcji montowania. Oznacza to, że muszę działać fstrimna żądanie .

W przeszłości napotkałem ten problem: btrfs, nie ma już miejsca na dysku . Zauważyłem, fstrim -v /że prawie nie przycina się miejsca. Moje rozwiązanie miało działać btrfs balance start /wcześniej fstrim. Oto sedno mojej odpowiedzi .

Dzisiaj jest inaczej. Może spóźniłem się z konserwacją. Oto co się dzieje:

# fstrim -v /
/: 24 KiB (24576 bytes) trimmed
# btrfs balance start /
ERROR: error during balancing '/': No space left on device

Usunąłem kilka podwoluminów (migawek) btrfs subvolume delete …i to nie pomogło. Nie pamiętam zbyt dobrze szczegółów, ale myślę, że wcześniej mogłem biegać, btrfs balance …ponieważ wstępne fstrimprzycięcie przynajmniej kilku MiB, nie tak małych jak 24 KiB, jak dzisiaj. Teraz wydaje się, że jest to sytuacja typu catch-22, w której działałby fstrimlub btrfs balancedziałałby tylko, gdyby drugi wykonał swoją pracę jako pierwszy.

Dla przypomnienia, są to niektóre statystyki, które pokazują, że mam dużo miejsca:

# 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

Uwaga: Podczas normalnej pracy nie mam jeszcze „brak wolnego miejsca na urządzeniu”. Myślę, że Btrfs ciągle dopasowuje nowe zapisy do już pobranych fragmentów. Jednak w przeszłości uderzyłem „brak miejsca…” apt-get upgrade, potem wyzdrowiałem z btrfs balancei fstrim. Nie wiem kiedy (jeśli) to znów mnie uderza. Chciałbym przeprowadzić konserwację, zanim otrzymam „brak miejsca…” podczas robienia czegoś ważnego.

Jak wyjść z tej sytuacji tak fstrimi btrfs balancenie blokują się nawzajem? Czy mogę to naprawić z poziomu mojego uruchomionego systemu?

W rzeczywistości już to naprawiłem, moja odpowiedź jest poniżej. Pytanie jest do wykorzystania w przyszłości. Dodaj kolejne rozwiązanie.


Dodatkowe informacje:

$ 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
Kamil Maciorowski
źródło

Odpowiedzi:

4

Tak, możesz odzyskać dane z działającego systemu. Moje oryginalne podejście znajduje się poniżej; jednak dzięki komentarzowi Zana Lynxa znalazłem łatwiejszy sposób.

Moje ulepszone podejście

Oto wspomniany komentarz:

Lub jeśli myślisz o przyszłości, możesz powiedzieć btrfs, aby używał mniej niż maksimum urządzenia z btrfs filesystem resize

(W porównaniu z moim pierwotnym podejściem, chodzi o to, aby celowo mieć trochę wolnego miejsca na tym konkretnym urządzeniu i rozbudować tam system plików, zamiast dodawać osobne urządzenie, co może nie być takie łatwe.)

Dobra wiadomość: moje testy wskazują, że nie muszę wybiegać w przyszłość! Nawet jeśli btrfs balance start /wyrzuci „brak miejsca…”, nadal jestem w stanie zmniejszyć system plików, jeśli tylko jest na to miejsce (tzn. Wszystkie pliki i metadane pasują do nowego rozmiaru). To prowadzi do następującego rozwiązania:

# 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

Moje oryginalne podejście

Oto, co musisz zrobić (szczegółowy opis poniżej):

  1. Dodaj dodatkowe urządzenie do systemu plików Btrfs.
  2. btrfs balance start …
  3. fstrim …
  4. Usuń dodatkowe urządzenie z systemu plików Btrfs.
  5. btrfs balance start …
  6. fstrim …

Sztuką jest dodanie dodatkowego urządzenia do systemu plików Btrfs, więc btrfs balance …ma trochę dodatkowej przestrzeni. Urządzenie może być jak /dev/sdblub /dev/sdb3. W tym przykładzie używam zwykłego pliku 1 GiB na moim dysku twardym ( bardzo ważne: podwójnie sprawdzam, czy plik nie należy do systemu plików Btrfs, który chcę rozwinąć! Może to być fatalne). Myślę, że plik w pamięci RAM (np. W /dev/shm/) powinien działać równie dobrze.

# tmpf=/mnt/hdd/tempfile   # if this file exists, it will be overwritten!
# truncate -s 1G "$tmpf"
# extra=$(losetup -f --show "$tmpf")

Teraz $extrajest jak /dev/loop0czy coś.

# btrfs device add "$extra" /

W tej chwili nie wolno mi ponownie uruchamiać mojego systemu operacyjnego. Gdybym to zrobił, nie miałby części swojego głównego systemu plików, ponieważ żaden nie /dev/loop*byłby z nim powiązany /mnt/hdd/tempfile. Nie będzie to stanowić problemu, jeśli użyjesz zwykłego urządzenia (lub partycji) jako dodatkowego urządzenia, ponieważ btrfs device scanpodczas uruchamiania go wykryje.

# btrfs balance start /

W moim przypadku tempfilejest to rzadki plik. W innej konsoli uruchamiam watch ls -hls /mnt/hdd/tempfilei zauważam, kiedy osiągnie (prawie) pełny rozmiar. W ten sposób wiem, że niektóre fragmenty Btrfs są przenoszone z dysku SSD. W razie wątpliwości btrfs ballance …zakończmy; ale wzywam, btrfs balance cancel /by zaoszczędzić trochę czasu. Wróćmy teraz do głównej konsoli.

Uwaga: pierwszy wiersz poniżej pochodzi z powyższego btrfs balance start /polecenia, które zostało przerwane.

balance canceled by user
# fstrim -v /
/: 26,7 GiB (28696862720 bytes) trimmed

fstrimprzycięte znacznie bardziej niż wcześniej. Nie potrzebuję już mojego dodatkowego urządzenia.

# 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

I to jest to. Czas wyczyścić:

# losetup -d "$extra"
# rm "$tmpf"
Kamil Maciorowski
źródło
Często używam napędu USB lub swapoff -a i formatuję partycję wymiany jako urządzenie btrfs. Korzystanie z napędu RAM wydaje się zbyt ryzykowne.
Zan Lynx,
1
Lub jeśli myślisz o przyszłości, możesz powiedzieć btrfs, aby używał mniej niż maksimum urządzenia zbtrfs filesystem resize
Zan Lynx
@ZanLynx Dziękujemy! Dzięki temu resizepomysłowi znacznie poprawiłem swoją odpowiedź .
Kamil Maciorowski