Wymiana uszkodzonego dysku w macierzy mdadm w systemie Ubuntu
Opublikowano: 15 lutego 2025 22:02:29 UTC
Jeśli znalazłeś się w niepokojącej sytuacji, w której nastąpiła awaria dysku w macierzy RAID mdadm, w tym artykule wyjaśniono, jak poprawnie wymienić dysk w systemie Ubuntu.
Replacing a Failed Drive in an mdadm Array on Ubuntu
Informacje w tym poście są oparte na Ubuntu 18.04 i wersji mdadm zawartej w jego repozytoriach; w momencie pisania v4.1-rc1. Mogą być lub nie być ważne dla innych wersji.
Niedawno miałem nagłą awarię dysku w moim domowym serwerze plików, który składa się z dziewięciu dysków w macierzy RAID-6 mdadm. To zawsze przeraża, ale na szczęście udało mi się szybko znaleźć dysk zastępczy, który został dostarczony już następnego dnia, więc mogłem rozpocząć odbudowę.
Przyznaję, że byłem trochę zbyt skąpy, kiedy pierwotnie konfigurowałem serwer plików; tylko dwa dyski to prawdziwe dyski NAS (Seagate IronWolf), a reszta to dyski stacjonarne (Seagate Barracuda). Nic dziwnego, że był to jeden z dysków stacjonarnych, który się poddał (choć po prawie trzech latach użytkowania). Był całkowicie martwy; po przeniesieniu go do obudowy USB komputera stacjonarnego wszystko, co z niego wydobyłem, to niepokojący dźwięk klikania, a ani Ubuntu 20.04, ani Windows 10 nie były w stanie go wykryć.
No cóż, przejdźmy do części zamiennej (i tak, nowy dysk, który kupiłem, to IronWolf, nauczka) - tak samo jak przerażająca jest utrata dysku w działającej macierzy, jeszcze bardziej przerażająca jest, jeśli nie znasz prawidłowej procedury jego wymiany. To nie pierwszy raz, kiedy musiałem wymienić uszkodzony dysk w macierzy mdadm, ale na szczęście zdarza się to tak rzadko, że zazwyczaj muszę szukać odpowiednich poleceń. Tym razem postanowiłem stworzyć własny mały przewodnik na przyszłość.
Więc po pierwsze, kiedy otrzymasz od mdadm przerażającego e-maila o zdarzeniu awarii, musisz zidentyfikować, który dysk uległ awarii. Oczywiście, poda nazwę urządzenia (w moim przypadku /dev/sdf), ale prawdopodobnie nie jest oczywiste, który to fizyczny dysk, ponieważ te nazwy mogą się zmienić, gdy maszyna jest uruchamiana.
Jeśli nie masz pewności, która nazwa urządzenia uległa awarii, możesz użyć następującego polecenia, aby się tego dowiedzieć (zamień /dev/md0 na nazwę swojego urządzenia RAID):
Jak wspomniałem, w moim przypadku był to /dev/sdf, więc kontynuujmy z tym.
Następnie możesz spróbować znaleźć numer seryjny uszkodzonego dysku, wydając to polecenie:
(jeśli nie znaleziono smartctl, należy zainstalować pakiet smartmontools w systemie Ubuntu)
Następnie można porównać numer seryjny z numerami seryjnymi na etykiecie fizycznej dysku, aby ustalić, który dysk uległ awarii.
Tym razem nie miałem tyle szczęścia. Dysk był całkowicie martwy i nawet odmówił podania SMART lub innych danych, w tym numeru seryjnego.
Ponieważ miałem fizyczny dostęp do serwera (co jest naprawdę potrzebne, jeśli zamierzasz samodzielnie wymienić dysk fizyczny, jak sądzę ;-)), a serwer faktycznie działał, gdy dysk uległ awarii (i nadal działał dobrze dzięki redundancji RAID-6), wybrałem naprawdę prymitywną, ale w rzeczywistości wysoce skuteczną i oczywistą metodę po prostu kopiowania dużego pliku na serwer i obserwowania, która lampka dysku twardego nie migocze. W ciągu kilku sekund zidentyfikowałem winowajcę.
Teraz, zanim wyjmiesz fizyczny dysk, dobrym pomysłem będzie formalne poinformowanie mdadm o tym zamiarze, poprzez wydanie następującego polecenia (w razie potrzeby zastąp nazwy urządzeń swoimi własnymi):
W przypadku powodzenia operacji mdadm wyświetli komunikat informujący o „gorącym” usunięciu dysku, prawdopodobnie dlatego, że w tym czasie urządzenie wirtualnej macierzy RAID jest faktycznie uruchomione.
Jeśli nie powiedzie się z komunikatem o błędzie podobnym do „device or resource busy”, może się okazać, że mdadm nie zarejestrował dysku jako całkowicie niesprawnego. Aby to zrobić, wydaj to polecenie (ponownie pamiętaj, aby zastąpić nazwy urządzeń własnymi, jeśli to właściwe):
Następnie powinieneś móc usunąć urządzenie z macierzy za pomocą poprzedniego polecenia.
Teraz czas na rzeczywistą wymianę dysku. Jeśli jesteś naprawdę, naprawdę - naprawdę - pewien, że twój komputer i kontroler obsługują hot swapping, możesz to zrobić bez wyłączania komputera. To byłby sposób na krytyczne systemy produkcyjne działające na prawdziwym, właściwym sprzęcie serwerowym, o którym wiesz na pewno, że może sobie z tym poradzić. Mój domowy serwer plików opiera się na płycie głównej klasy konsumenckiej z kilkoma kontrolerami SATA semi-noname w gniazdach PCIe, aby zapewnić więcej portów SATA.
Mimo że SATA generalnie powinno obsługiwać funkcję wymiany dysku podczas pracy, nie chciałem ryzykować w tej konfiguracji. Postanowiłem więc wyłączyć komputer i wymienić dysk.
Zanim to zrobisz, dobrym pomysłem jest zakomentowanie urządzenia RAID w pliku /etc/fstab, aby Ubuntu nie próbowało go automatycznie zamontować przy następnym uruchomieniu, ponieważ może się zawiesić i zmusić do przejścia w tryb odzyskiwania z powodu zdegradowanej macierzy RAID. Może to nie być duży problem, jeśli jest to system stacjonarny, ale ja uruchamiam ten serwer bez monitora ani klawiatury, więc byłoby to trochę uciążliwe.
Po uruchomieniu maszyny z zainstalowanym nowym, błyszczącym dyskiem, użyj lsblk lub innego sposobu, aby go zidentyfikować. Jeśli nie zmieniłeś niczego innego, prawdopodobnie (ale niekoniecznie ) otrzyma tę samą nazwę, co wymieniony dysk. W moim przypadku tak się stało, więc nowy dysk nazywa się również /dev/sdf.
Ponieważ moja tablica opiera się na partycjach, a nie na urządzeniach fizycznych, musiałem skopiować tabelę partycji z działającego dysku na nowy dysk, aby upewnić się, że są dokładnie takie same. Jeśli zamiast tego uruchamiasz tablicę na urządzeniach fizycznych, możesz pominąć ten krok.
Użyłem sgdisk do tego celu, kopiując tabelę partycji z /dev/sdc do /dev/sdf. Upewnij się, że zamieniłeś nazwy urządzeń na swoje własne, jeśli to właściwe.
Zwróć uwagę na kolejność: najpierw wymieniasz dysk „do”! To trochę nieintuicyjne dla mnie, ale upewnij się, że robisz to dobrze, żeby nie doszło do kolejnej awarii dysku w tablicy ;-)
Następnie, aby uniknąć konfliktów UUID, wygeneruj nowe UUID dla nowego dysku:
I wreszcie nadszedł czas, aby dodać nowy dysk do macierzy i rozpocząć imprezę odbudowy! (Okej, to nie jest prawdziwa impreza, to w rzeczywistości dość powolny i niepokojący proces, ponieważ naprawdę, naprawdę nie chcesz, aby kolejny dysk uległ awarii w tym momencie. Piwo może jednak pomóc)
Tak czy inaczej, aby dodać nowy dysk do macierzy, wydaj to polecenie (pamiętaj, aby zastąpić nazwy urządzeń własnymi nazwami, jeśli to konieczne):
Jeśli wszystko pójdzie dobrze, dysk zostanie dodany do macierzy bez żadnych problemów. Wierzę, że jest on domyślnie dodawany jako „gorący zapas”, ale ponieważ tej macierzy brakuje dysku (tego, który uległ awarii), jest on natychmiast używany i rozpocznie się proces odbudowy.
Możesz to obserwować w następujący sposób:
To prawdopodobnie potrwa chwilę; na moim skromnym serwerze (opartym w dużej mierze na sprzęcie konsumenckim i dyskach stacjonarnych, pamiętaj) udało się osiągnąć nieco poniżej 100 MB/s. Należy pamiętać, że to RAID-6, więc odbudowa wymaga wielu obliczeń parzystości; RAID-10 byłby znacznie szybszy. Ta konkretna maszyna ma czterordzeniowy procesor AMD A10 9700E („E” oznacza, że jest to energooszczędny model o obniżonym taktowaniu, tj. nie jest super szybki), aby dać ci pojęcie, czego się spodziewać. Przy dziewięciu dyskach 8 TB w mojej konfiguracji pełna odbudowa zajęła nieco ponad 24 godziny.
Podczas odbudowy możesz zamontować system plików na tablicy i używać go normalnie, jeśli chcesz, ale ja wolę zostawić to do odbudowy, aż do jej zakończenia. Pamiętaj, że jeśli jeden dysk ulegnie awarii, wkrótce może nastąpić awaria kolejnego, więc chcesz, aby odbudowa została wykonana tak szybko, jak to możliwe, ponieważ naprawdę nie chcesz, aby inny dysk uległ awarii w trakcie tego procesu. Dlatego nie obciążaj go innymi operacjami wejścia/wyjścia, które nie są absolutnie konieczne.
Po wykonaniu tej czynności dodaj ją z powrotem do pliku /etc/fstab, uruchom ponownie komputer i ciesz się swoimi plikami :-)