Wymiana uszkodzonego dysku w macierzy mdadm w systemie Ubuntu
Opublikowano: 15 lutego 2025 22:02:29 UTC
Ostatnia aktualizacja: 12 stycznia 2026 08:50:00 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śnimy, jak poprawnie go wymienić w systemie Ubuntu.
Replacing a Failed Drive in an mdadm Array on Ubuntu
Informacje zawarte w tym poście dotyczą Ubuntu 18.04 i wersji mdadm zawartej w jego repozytoriach; w momencie pisania tego tekstu była to wersja 4.1-rc1. Mogą one być lub nie być aktualne dla innych wersji.
Niedawno nagła awaria dysku w moim domowym serwerze plików, składającym się z dziewięciu dysków w macierzy RAID-6 mdadm, spowodowała u mnie awarię. To zawsze jest przerażające, 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 oszczędny, 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ę zepsuł (choć po prawie trzech latach użytkowania). Był całkowicie martwy; po przeniesieniu do obudowy USB komputera stacjonarnego słyszałem jedynie niepokojący dźwięk klikania, którego nie wykryły ani Ubuntu 20.04, ani Windows 10.
No cóż, przejdźmy do części zamiennej (i tak, nowy dysk, który kupiłem, to IronWolf, nauczka na przyszłość) – utrata dysku w działającej macierzy jest przerażająca, ale jeszcze bardziej przerażająca, 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 poradnik na przyszłość.
Po pierwsze, gdy otrzymasz od mdadm przerażającego e-maila z informacją o awarii, musisz zidentyfikować dysk, który uległ awarii. Oczywiście, program poda nazwę urządzenia (w moim przypadku /dev/sdf), ale prawdopodobnie nie będzie wiadomo, który to dysk fizyczny, ponieważ nazwy te mogą się zmieniać podczas uruchamiania komputera.
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 pakietu 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 z nich uległ awarii.
Tym razem jednak nie miałem tyle szczęścia. Dysk był całkowicie martwy i odmówił nawet udostępnienia danych SMART ani 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 działał, gdy dysk uległ awarii (i działał bez zarzutu dzięki redundancji RAID-6), wybrałem bardzo prymitywną, ale w rzeczywistości bardzo skuteczną i oczywistą metodę – po prostu skopiowałem duży plik na serwer i obserwowałem, który dysk twardy nie miga. W ciągu kilku sekund zidentyfikowałem winowajcę.
Teraz, zanim wyjmiesz dysk fizyczny, dobrym pomysłem będzie formalne poinformowanie narzędzia 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 wystąpi błąd podobny do „urządzenie lub zasób zajęty”, może to oznaczać, że mdadm nie zarejestrował dysku jako całkowicie uszkodzonego. Aby to zrobić, wydaj to polecenie (pamiętaj, aby zastąpić nazwy urządzeń własnymi, jeśli to konieczne):
Następnie powinieneś móc usunąć urządzenie z tablicy za pomocą poprzedniego polecenia.
Teraz czas na faktyczną wymianę dysku. Jeśli jesteś naprawdę, naprawdę – naprawdę – pewien, że Twój komputer i kontroler obsługują funkcję hot swap, możesz to zrobić bez wyłączania komputera. To byłby sposób na obsługę krytycznych systemów produkcyjnych na prawdziwym, porządnym sprzęcie serwerowym, o którym wiesz na pewno, że sobie z tym poradzi. Mój domowy serwer plików opiera się jednak na płycie głównej klasy konsumenckiej z kilkoma kontrolerami SATA typu semi-noname w gniazdach PCIe, co zapewnia więcej portów SATA.
Mimo że SATA generalnie powinna obsługiwać funkcję wymiany dysku podczas pracy, w tej konfiguracji nie chciałem ryzykować, więc postanowiłem wyłączyć komputer na czas wymiany dysku.
Zanim to zrobisz, warto zakomentować urządzenie RAID w pliku /etc/fstab, aby Ubuntu nie próbowało go automatycznie zamontować przy następnym uruchomieniu, ponieważ mogłoby to spowodować zawieszenie systemu i wymusić przejście w tryb odzyskiwania z powodu zdegradowanej macierzy RAID. Może to nie być duży problem w przypadku komputerów stacjonarnych, ale ja uruchamiam ten serwer bez monitora ani klawiatury, więc byłoby to dość uciążliwe.
Po uruchomieniu komputera z zainstalowanym nowym, lśniącym dyskiem, użyj lsblk lub innego narzędzia, aby go zidentyfikować. Jeśli nic innego nie zmieniłeś, prawdopodobnie (ale niekoniecznie) otrzyma taką samą nazwę jak wymieniony dysk. W moim przypadku tak się stało, więc nowy dysk również nazywa się /dev/sdf.
Ponieważ moja macierz opiera się na partycjach, a nie na urządzeniach fizycznych, musiałem skopiować tabelę partycji z działającego dysku na nowy, aby upewnić się, że są one identyczne. Jeśli uruchamiasz macierz na urządzeniach fizycznych, możesz pominąć ten krok.
Użyłem w tym celu programu sgdisk, kopiując tablicę partycji z /dev/sdc do /dev/sdf. Pamiętaj o zastąpieniu nazw urządzeń własnymi nazwami.
Zwróć uwagę na kolejność: najpierw wpisujesz dysk „do”! To trochę nieintuicyjne, ale upewnij się, że robisz to poprawnie, żeby uniknąć kolejnej awarii dysku w macierzy ;-)
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ąć odbudowę! (No dobrze, to nie jest prawdziwa odbudowa, to raczej powolny i irytujący proces, bo naprawdę, naprawdę nie chcesz, żeby kolejny dysk w tym momencie się zepsuł. 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. Wydaje mi się, że domyślnie jest on dodawany jako „gorący zapas”, ale ponieważ w macierzy brakuje dysku (tego, który uległ awarii), zostanie on natychmiast uruchomiony i rozpocznie się proces odbudowy.
Możesz to obserwować w ten sposób:
To prawdopodobnie potrwa chwilę; na moim skromnym serwerze (opartym głównie na sprzęcie konsumenckim i dyskach stacjonarnych, trzeba przyznać) 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. Ten konkretny komputer jest wyposażony w czterordzeniowy procesor AMD A10 9700E („E” oznacza, że jest to model energooszczędny, ale podkręcony, czyli nie superszybki), żeby dać Wam pojęcie, czego się spodziewać. Z dziewięcioma dyskami 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ę poczekać na zakończenie odbudowy. Pamiętaj, że jeśli jeden dysk ulegnie awarii, wkrótce może dojść do awarii kolejnego, więc odbudowa powinna być przeprowadzona jak najszybciej, aby uniknąć awarii kolejnego dysku. Dlatego nie obciążaj go dodatkowymi 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 :-)
