Linux BTRFS - konwertuj na pojedynczy z uszkodzonym dyskiem

12

Mała ilość historii:

Mam mały system plików multimedialnych, w którym przechowuję różne filmy i programy telewizyjne używane do konfiguracji HTPC. Zostało to pierwotnie skonfigurowane przy użyciu btrfszewnętrznego dysku WD 1 TB.

Później zdecydowałem się na zakup innego dysku, aby dać temu systemowi plików możliwość kopiowania RAID1. Ten dysk to Seagate Barracuda (2 TB, BARRACUDA 7200.14 FAMILY). Niestety nie był to dobry wybór napędu. Dysk zaczął wkrótce rozwijać dużą liczbę błędów odczytu, chociaż BTRFS był w stanie je naprawić.

Ostatnio wzrosła liczba błędów odczytu z tego dysku, a jego stan stale się pogarsza. BTRFS zaczyna się teraz zawieszać:

kernel: RSP: 0018:ffff88005f0e7cc0  EFLAGS: 00010282
kernel: RIP: 0010:[<ffffffffa0081736>]  [<ffffffffa0081736>] btrfs_check_repairable+0xf6/0x100 [btrfs]
kernel: task: ffff88001b5c4740 ti: ffff88005f0e4000 task.ti: ffff88005f0e4000
kernel: Workqueue: btrfs-endio btrfs_endio_helper [btrfs]
kernel: CPU: 1 PID: 3136 Comm: kworker/u8:3 Tainted: G           O    4.5.3-1-ARCH #1
kernel: invalid opcode: 0000 [#1] PREEMPT SMP 
kernel: kernel BUG at fs/btrfs/extent_io.c:2309!
kernel: ------------[ cut here ]------------
kernel: BTRFS info (device sdc1): csum failed ino 73072 extent 1531717287936 csum 3335082470 wanted 3200325796 mirror 0
kernel: ata3: EH complete
kernel: BTRFS error (device sdc1): bdev /dev/sda3 errs: wr 0, rd 18, flush 0, corrupt 0, gen 0
kernel: blk_update_request: I/O error, dev sda, sector 2991635296

Chciałbym usunąć wadliwy dysk z macierzy RAID1, wracając do braku nadmiarowości na jednym dysku. Niestety wydaje się, że brakuje dokumentacji, jak to zrobić.

Wiem, że można uruchomić następujące czynności:

sudo btrfs balance start -dconvert=single /media

przekonwertować profil danych do singletrybu, ale nie jestem pewien, gdzie GDZIE dane zostaną umieszczone. Ponieważ jeden z dysków ulega awarii, chciałbym być w stanie zapewnić, że BTRFS nie usunie sumiennie wszystkich danych z dobrego dysku i umieści jedną kopię na złym dysku - zamiast tego chciałbym po prostu zachowywać się tak, jakby drugi dysk nigdy nie istniał (jak w, przekonwertować z powrotem do mojej starej konfiguracji)

To nie działa:

$ sudo btrfs device delete /dev/sda3 /media
ERROR: error removing device '/dev/sda3': unable to go below two devices on raid1

Co mam zrobić Pomoc byłaby bardzo mile widziana.

TL; DR: zacząłem z 1 dyskiem w BTRFS single, dodałem inny dysk, sprawiłem , że RAID1inny dysk jest teraz w błędzie, w jaki sposób powrócić do tylko jednego dysku (w szczególności znanego dobrego) z single?

eeeeeta
źródło
Aktualizacja: próbowanie tego dconvert=singledla jednego fragmentu robi tylko to, czego się obawiałem i usuwa znaną dobrą kopię. :(
eeeeeta

Odpowiedzi:

11

W porządku, zrozumiałem to za pomocą tego linku Trello . Jeśli ktoś chce to zrobić, oto procedura.

Procedura

Z macierzy RAID1 dwóch dysków, z /dev/sdaktórych jeden jest wadliwy, a drugi /dev/sdcznany jako dobry:

  1. Wyłącz automatyczne montowanie tej tablicy w /etc/fstab, uruchom ponownie . Zasadniczo chcemy, aby btrfs zapomniał o istnieniu tej tablicy, ponieważ istnieje błąd, w którym nadal będzie próbował użyć jednego z dysków, jeśli jest odłączony.
  2. Teraz, gdy tablica jest odmontowana, wykonaj:

    echo 1 | sudo tee /sys/block/sda/device/delete

    zastępując sdawadliwą nazwą urządzenia. Powoduje to, że dysk się obraca (powinieneś to sprawdzić w dmesg) i staje się niedostępny dla jądra.

    Alternatywnie : po prostu wyjmij dysk z komputera przed uruchomieniem! Nie zdecydowałem się na tę metodę, ponieważ powyższe działa dla mnie dobrze.

  3. Zamontuj tablicę w -o degradedtrybie.
  4. Rozpocznij operację ponownego równoważenia za pomocą sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Spowoduje to reorganizację zakresu na znanym dobrym dysku, przekształcając je w single(inne niż RAID). Zajmie to prawie dzień, w zależności od prędkości dysku i wielkości macierzy. (mój miał ~ 700 GiB i został ponownie zbilansowany w tempie 1 1GiB na minutę) Na szczęście operacja ta może zostać wstrzymana i utrzyma tablicę w trybie online, gdy się pojawi.
  5. Po wykonaniu tej czynności możesz wydać sudo btrfs device remove missing /mountpointpolecenie usunięcia „brakującego” wadliwego urządzenia.
  6. Rozpocznij drugą równowagę, sudo btrfs balance start -mconvert=dup /mountpointaby przywrócić nadmiarowość metadanych. To zajmuje kilka minut w moim systemie.
  7. Jesteś skończony! Twoja tablica jest teraz w singletrybie, z usuniętą nadmiarowością.
  8. Wyjmij wadliwy dysk na zewnątrz i pokonaj go młotkiem.

Rozwiązywanie problemów

  • Pomóż, btrfs próbował zapisać na mój wadliwy dysk, zignorował go i zmusił do odczytu!
    • Czy wykonałeś krok 1 i uruchomiłeś ponownie przed kontynuowaniem? Prawdopodobnie btrfs nadal myśli, że dysk, który obróciłeś, jest obecny. Ponowne uruchomienie spowoduje, że btrfs zapomni o błędach i pozwoli ci kontynuować.
eeeeeta
źródło
2
To nie działa Używam Ubuntu 16.04 (jądro 4.4). dmesg mówi „brakujące urządzenia (1) przekraczają limit (0), montowanie zapisu nie jest dozwolone”. Tak więc
utknąłem na
@HelloSam: Może to błąd. Zobacz bbs.archlinux.org/viewtopic.php?id=210541
jaltek
Rozważ dodanie ,softpo każdym, convert=aby pominąć fragmenty, które mają już profil docelowy (którym powinny być wszystkie).
Tom Hale
9

Dzięki za twój post. Wpadłem na pomysł, że mogę przetestować nalot, wyjąć dysk z wnęki Hotswap, użyć innego dysku, a następnie ponownie wsadzić dysk RAID. Z perspektywy czasu był to zły pomysł i teraz potrzebuję mojej zatoki Hotswap.

Oto co znalazłem. Jako root:

# sudo btrfs fi show
Label: 'disk'  uuid: 12817aeb-d303-4815-8bba-a3440e36c62c
Total devices 2 FS bytes used 803.10GiB
    devid    1 size 931.51GiB used 805.03GiB path /dev/sda1
    devid    2 size 931.51GiB used 805.03GiB path /dev/sdb1

Zwróć uwagę na devid wymienione dla każdego dysku. Man for brtrfs balance doprowadził mnie do opcji devid, podjął kilka prób, aby dowiedzieć się, jak działają filtry (początkowo próbowałem devid = / dev / sdb1). Więc twoja pierwsza próba będzie wyglądać mniej więcej tak.

# btrfs balance start -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

Co dało mi błąd.

ERROR: error during balancing '/media/.media': Invalid argument
There may be more info in syslog - try dmesg | tail    

Oto błąd z dmesg:

BTRFS error (device sdb1): balance will reduce metadata integrity, use force if you want this

Więc to jest finał, który zadziałał:

# btrfs balance start -f -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

Mam nadzieję, że pomoże to komuś innemu.

PG
źródło
Jeśli chcesz po prostu wymienić jeden dysk na inny, możesz to zrobić za pomocą btrfs replace.
dma_k
To działało dla mnie rok temu, ale dzisiaj nie. Niezależnie od tego devid=, co
wpisuję
Sprawdź także, -sconvertaby przekonwertować fragmenty systemu.
Tom Hale
Zastanów się nad użyciem |zamiast strony ,podręcznika do bilansu:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale