Wymiana uszkodzonego dysku w systemie głównym ZFS
Ten poradnik wyjaśnia, jak wymienić uszkodzony dysk w puli ZFS skonfigurowanej jako mirror w systemie Linux. Procedura obejmuje przełączenie dysku w tryb offline, skopiowanie tablicy partycji na dysk zastępczy, ponowne dodanie dysku do puli oraz zainstalowanie programu rozruchowego po zakończeniu procesu resilveringu.
Wymagania wstępne
Wymagane są uprawnienia root. Poniższe przykłady zakładają, że serwer ma dwa dyski: /dev/sda (sprawny) i /dev/sdb (uszkodzony). Dostosuj nazwy urządzeń do swojej konfiguracji.
Przed rozpoczęciem wykonaj kopię zapasową wszystkich ważnych danych. Wymiana dysku systemowego jest operacją wysokiego ryzyka. Błąd na dowolnym etapie może doprowadzić do utraty danych lub uniemożliwić uruchomienie systemu. Unikaj używania nazw urządzeń /dev/sdX w poleceniach ZFS. Nazwy urządzeń mogą się zmienić po ponownym uruchomieniu systemu. Zamiast nich używaj stabilnych identyfikatorów, takich jak /dev/disk/by-id/. W poniższych przykładach użyto /dev/sdX dla uproszczenia podczas pracy z narzędziami do partycjonowania. Polecenia ZFS powinny zawsze korzystać z /dev/disk/by-id/.
Krok 1: Sprawdź stan puli
Przed wprowadzeniem jakichkolwiek zmian sprawdź bieżący stan puli:
zpool status -v
Wynik pokaże, który dysk jest uszkodzony oraz jaki identyfikator ma w puli.
Krok 2: Przełącz uszkodzony dysk w tryb offline
Jeśli dysk ma status ONLINE, ale wykazuje oznaki awarii, przełącz go w tryb offline przed fizyczną wymianą:
zpool offline rpool <failed-device>
ZFS przestanie próbować korzystać z uszkodzonego dysku przed jego fizyczną wymianą. Zastąp <failed-device> identyfikatorem wyświetlonym przez zpool status -v. Jeśli dysk ma już status FAULTED lub REMOVED, pomiń ten krok i przejdź bezpośrednio do kroku 3.
Krok 3: Fizycznie wymień dysk
Jeśli serwer obsługuje hot swap, możesz wymienić dysk bez wyłączania systemu.
W przeciwnym razie wyłącz system:
poweroff
Po zainstalowaniu dysku zastępczego uruchom serwer i sprawdź, czy nowy dysk jest widoczny:
lsblk -o NAME,SIZE,MODEL ls -l /dev/disk/by-id/
W kolejnych krokach używaj identyfikatora by-id nowego dysku.
Krok 4: Określ typ tablicy partycji
Zainstaluj gdisk, jeśli nie jest jeszcze zainstalowany:
apt install gdisk -y
Sprawdź typ tablicy partycji na sprawnym dysku:
gdisk -l /dev/sda
W wynikach znajdź sekcję Partition table scan. W przypadku MBR zobaczysz MBR: MBR only oraz GPT: not present. W przypadku GPT zobaczysz MBR: protective oraz GPT: present.
Krok 5: Przygotuj i skopiuj tablicę partycji na nowy dysk
Większość konfiguracji systemu root z ZFS korzysta z partycjonowania GPT. Metoda MBR została uwzględniona dla starszych systemów.
GPT
Przed rozpoczęciem zidentyfikuj nazwę /dev/sdX odpowiadającą nowemu dyskowi, ponieważ narzędzia do partycjonowania jej wymagają:
lsblk -o NAME,SIZE,MODEL,SERIAL
Usuń wszystkie stare sygnatury z dysku zastępczego przed skopiowaniem tablicy partycji:
wipefs -a /dev/disk/by-id/<new-disk>
wipefs -a trwale usuwa wszystkie sygnatury systemów plików i partycji z dysku. Przed wykonaniem tego polecenia upewnij się, że podano prawidłowy identyfikator dysku.
Poniższe polecenie kopiuje tablicę partycji z /dev/sda (źródło) do /dev/sdb (cel):
sgdisk -R /dev/sdb /dev/sda
W poleceniu sgdisk -R pierwszy argument oznacza dysk docelowy, a drugi dysk źródłowy. Uruchomienie tego polecenia z odwróconymi argumentami spowoduje nadpisanie tablicy partycji na sprawnym dysku.
Jeśli dysk zastępczy jest większy od oryginalnego, rozszerz GPT, aby wykorzystać całą jego pojemność:
sgdisk -e /dev/sdb
Następnie przypisz nowy, unikalny identyfikator UUID do dysku zastępczego:
sgdisk -G /dev/sdb
sgdisk -G przypisuje nowe identyfikatory UUID wszystkim partycjom na dysku zastępczym. Jeśli /etc/fstab zawiera wpisy oparte na UUID dla którejkolwiek z tych partycji, system może się nie uruchomić. Po zakończeniu resilveringu sprawdź, czy /etc/fstab korzysta z identyfikatorów /dev/disk/by-id/ zamiast UUID.
Przeładuj tablicę partycji, aby kernel wykrył nowy układ:
udevadm trigger udevadm settle
Jeśli dysk zastępczy był wcześniej używany w innej puli ZFS, usuń stare metadane ZFS, aby uniknąć konfliktów:
zpool labelclear /dev/disk/by-id/<new-disk-partX> 2>/dev/null || true
Zastąp <new-disk-partX> rzeczywistym identyfikatorem partycji ZFS.
MBR
Poniższe polecenie kopiuje tablicę partycji z /dev/sda (źródło) do /dev/sdb (cel):
sfdisk -d /dev/sda | sfdisk /dev/sdb
Jeśli po skopiowaniu nowe partycje nie są widoczne w systemie, przeładuj tablicę partycji:
udevadm trigger udevadm settle
Krok 6: Dodaj dysk do puli
Zastąp wpis uszkodzonego dysku w puli nowym dyskiem. Najpierw sprawdź dokładny identyfikator uszkodzonego dysku widoczny w puli:
zpool status rpool
W wynikach znajdź wpis dotyczący uszkodzonego dysku na liście urządzeń puli. Będzie on wyświetlony jako pełna ścieżka, na przykład /dev/disk/by-id/ata-WDC_WD10_12345-part3, ze statusem FAULTED, UNAVAIL lub OFFLINE. Użyj tej ścieżki jako <old-device> w poleceniu replace:
zpool replace rpool <old-device> /dev/disk/by-id/<new-disk-part>
Zastąp <old-device> identyfikatorem uszkodzonego dysku z poprzedniego kroku. Zastąp <new-disk-part> identyfikatorem by-id partycji na dysku zastępczym, używając tego samego numeru partycji co na sprawnym dysku, na przykład -part3 lub -part4. Aby znaleźć prawidłowy identyfikator, uruchom ls -l /dev/disk/by-id/.
Jeśli stary dysk jest całkowicie niedostępny (UNAVAIL), a zpool replace zwraca błąd, dodaj opcję -f, aby wymusić wymianę:
zpool replace -f rpool <old-device> /dev/disk/by-id/<new-disk-part>
Po wykonaniu zpool replace potwierdź, że rozpoczął się resilvering i że nowy dysk pojawił się jako ONLINE:
zpool status
Resilvering będzie automatycznie kontynuowany w tle.
Krok 7: Monitoruj resilvering
Monitoruj postęp resilveringu za pomocą:
zpool status -v
Wynik pokazuje postęp, prędkość oraz szacowany pozostały czas. Przed przejściem dalej poczekaj, aż stan zmieni się na state: ONLINE i resilvering zostanie zakończony. W zależności od rozmiaru dysku może to potrwać kilka godzin.
Krok 8: Sprawdź dataset rozruchowy
Przed zainstalowaniem programu rozruchowego sprawdź, czy pula ma skonfigurowany właściwy dataset rozruchowy:
zpool get bootfs rpool
Wynik powinien zawierać ścieżkę datasetu, taką jak rpool/ROOT/debian. Jeśli wartość to none lub wskazuje niewłaściwy dataset, ustaw ją ręcznie:
zpool set bootfs=rpool/ROOT/debian rpool
Zastąp rpool/ROOT/debian rzeczywistą nazwą datasetu root w swoim systemie. Aby wyświetlić dostępne datasety, uruchom zfs list.
Krok 9: Zainstaluj program rozruchowy
Zainstaluj program rozruchowy na dysku zastępczym po zakończeniu resilveringu. Podczas resilveringu system nadal działa z oryginalnego dysku, dlatego ten krok można bezpiecznie wykonać po przywróceniu prawidłowego stanu puli.
BIOS (Legacy)
grub-install /dev/disk/by-id/<new-whole-disk>
W niektórych systemach grub-install może nie akceptować ścieżki by-id. W takim przypadku zastąp /dev/disk/by-id/<new-whole-disk> odpowiednią nazwą urządzenia, na przykład /dev/sdb.
UEFI
Zamontuj partycję EFI z dysku zastępczego w katalogu tymczasowym przed uruchomieniem grub-install. Zapobiega to przesłonięciu aktualnie używanej partycji EFI:
mkdir -p /mnt/new_efi mount /dev/disk/by-id/<new-disk-part1> /mnt/new_efi
Zastąp <new-disk-part1> rzeczywistym identyfikatorem partycji EFI (zazwyczaj -part1 lub -part2; typ partycji EF00). W razie wątpliwości sprawdź za pomocą ls -l /dev/disk/by-id/.
Jeśli partycja EFI jest pusta, skopiuj zawartość istniejącej partycji EFI przed uruchomieniem grub-install:
cp -r /boot/efi/* /mnt/new_efi/
Zainstaluj program rozruchowy:
apt install grub-efi-amd64 efibootmgr -y grub-install --target=x86_64-efi --efi-directory=/mnt/new_efi --bootloader-id=debian --recheck /dev/disk/by-id/<new-whole-disk> update-grub update-initramfs -u -k all
Zastąp --bootloader-id=debian nazwą odpowiadającą używanej dystrybucji, na przykład ubuntu lub debian. Zastąp /dev/disk/by-id/<new-whole-disk> identyfikatorem by-id całego dysku zastępczego, a nie pojedynczej partycji.
Uruchomienie update-initramfs zapewnia, że początkowy ramdisk zawiera aktualne moduły ZFS i rozpoznaje nowy układ puli. Bez tego kroku system może nie uruchomić się po wymianie dysku.
Po zakończeniu instalacji odmontuj partycję EFI:
umount /mnt/new_efi
Sprawdź wpisy rozruchowe EFI:
efibootmgr -v
W systemach z rootem na ZFS polecenie grub-install może zakończyć się błędem lub wymagać dodatkowych opcji w zależności od wersji GRUB i konfiguracji systemu. Na przykład niektóre systemy wymagają zainstalowania GRUB z modułami obsługującymi ZFS lub uruchomienia polecenia z poziomu środowiska chroot. Jeśli polecenie zwróci błąd, zapoznaj się z dokumentacją swojej dystrybucji dotyczącą instalacji GRUB z obsługą ZFS.
W Proxmox VE grub-install jest wyłączony. Zamiast niego użyj proxmox-boot-tool. Poniższy przykład korzysta z /dev/sdb2 — zastąp go rzeczywistą partycją EFI w swoim systemie:
proxmox-boot-tool format /dev/sdb2 proxmox-boot-tool init /dev/sdb2
Podsumowanie
Po zainstalowaniu programu rozruchowego uruchom ponownie serwer i sprawdź, czy system uruchamia się prawidłowo. Wykonaj scrub, aby sprawdzić, czy podczas resilveringu nie wystąpiły błędy odczytu/zapisu:
zpool scrub rpool
Następnie sprawdź stan puli:
zpool status -v
Pula powinna być w stanie online i nie powinna zgłaszać żadnych błędów. Jeśli podczas procesu pojawią się problemy, sprawdź dzienniki systemowe za pomocą journalctl -xe, aby uzyskać dodatkowe informacje.
Przed wyrzuceniem uszkodzonego dysku usuniętego w kroku 3 uruchom ponownie serwer i upewnij się, że system prawidłowo uruchamia się z dysku zastępczego. Zachowaj uszkodzony dysk jako awaryjną kopię do czasu potwierdzenia prawidłowego uruchamiania systemu.