Założenia

Mamy system który bootuje się z EFI. Partycja EFI, boot i root są założone na wolumenach RAID-1 MD. ZFS jest na partycjach osobnych partycjach i ma formę mirrora.

Korzystając z tego, że dane są zduplikowane najpierw podmienimy jeden dysk, wyjęty usuniemy z macierzy i zduplikujemy macierze na nowy dysk. Po tym podmienimy drugi z pierwotnych dysków na nowy i dokonamy ponownej duplikacji macierzy.

Sprawdzanie czy system jest bootowany z BIOS

W powłoce bash wydajemy polecenie [ -d /sys/firmware/efi ] && echo UEFI || echo BIOS

Usuwanie pierwszego pierwotnego dysku z macierzy

Upewniamy się, że wszystkie dane zostały zapisane na dysk wywołując polecenie sync. Następnie za pomocą polecenia cat /proc/mdstat i df -h | grep md możemy zidentyfikować dyski które są częścią macierzy.

root@tmp:~# cat /proc/mdstat 
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid1 sdf3[0] sdh3[1]
      16759808 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sdf2[0] sdh2[1]
      523264 blocks super 1.2 [2/2] [UU]

md127 : active raid1 sdh1[0] sdf1[1]
      523200 blocks [2/2] [UU]

unused devices: <none>
root@tmp:~# df -h | grep md
/dev/mapper/md125                          16G  7,9G  7,8G  51% /
/dev/md0                                  477M  118M  355M  25% /boot
/dev/md127                                511M  5,9M  505M   2% /boot/efi

Dzięki temu wiemy, że programowa macierz składa się z dysków sdf i sdh

Oznaczamy jeden z dysków z urządzeń md jako niesprawny:

mdadm --manage /dev/md127 --fail /dev/sdh1
mdadm --manage /dev/md0 --fail /dev/sdh2
mdadm --manage /dev/md1 --fail /dev/sdh3

Następnie usuwamy niesprawny dysk:

mdadm --manage /dev/md127 --remove /dev/sdh1
mdadm --manage /dev/md0 --remove /dev/sdh2
mdadm --manage /dev/md1 --remove /dev/sdh3
Nowy dysk i tablica partycji

Teraz można fizycznie podmienić dyski w komputerze. Następnie na nowym dysku trzeba odwzorować układ partycji ze starego dysku:

sfdisk -d /dev/sdf | sfdisk /dev/sdX
Odtworzenie macierzy md

Teraz kiedy fizycznie mamy już nowy dysk, który zawiera partycje o wymaganym rozmiarze możemy go dodać do macierzy:

mdadm --manage /dev/md127 --add /dev/sdX1
mdadm --manage /dev/md0 --add /dev/sdX2
mdadm --manage /dev/md1 --add /dev/sdX3

Za pomocą polecenia mdadm --detail /dev/mdX możemy sprawdzić szczegółowe informacje na temat macierzy. Jeżeli macierz ma znowu dwa napędy to za pomocą polecania cat /proc/mdstat możemy zweryfikować jej status i sprawdzić postęp odtwarzania danych.

Uruchamianie systemu - efibootmgr

Ze względu na to, że zmianie mogły ulec identyfikatory dysków konieczne może być ponowne dodanie do UEFI właściwych wpisów dotyczących uruchamiania systemu. Do tego celu wykorzystamy efibootmgr.

Polecenie efibootmgr -v wyświetla obecną listę startową.

Dodanie nowego wpisu z nowym dyskiem możemy dokonać tak:

efibootmgr -c -d /dev/sdX -p 1 -L "Dysk_sdX" -l '\EFI\debian\grubx64.efi'
efibootmgr -c -d /dev/sdY -p 1 -L "Dysk_sdT" -l '\EFI\debian\grubx64.efi'

Kolejność bootowania ustalamy używając parametru -o i dodając numery wpisów:

efibootmgr -o 0000,0001,0007,0005,0004,0006,0008

Jeżeli przy numerze wpisu nie ma gwiazdki * to oznacza, że wpis nie jest aktywny. Aktywować go można wydając polecenie efibootmgr -a 000X

Teraz warto przetestować czy system się prawidłowo ładuje z nowych dysków, jeśli tak to możemy usunąć stare wpisy i zagospodarować stare dyski na inne cele.

efibootmgr --delete-bootnum --bootnum 000X
efibootmgr --delete-bootnum --bootnum 000Y
ZFS

Tutaj sytuacja jest już nieco prostsza - wystarczy za pomocą polecenia zpool status odczytać identyfikator brakującego dysku po czym zastąpić go nowym wydając polecenie:

zpool replace POOLNAME ID_STAREGO_DYSKU /dev/disk/by-id/NOWY_DYSK

Następny wpis