Sempre gustoso svegliarsi la domenica mattina con un allarme sull'infrastruttura, del resto è un caso estremamente raro per i sysops. Controllo velocemente: pool ZFS degradata, uno dei dischi ha deciso di farla finita, senza avvisare i suoi compagni. Anche se controllo regolarmente lo smart, lo sappiamo, shit happens.
Quando accade, mi si triggera automaticamente il processo che ho in testa. Chiedo al DC il cambio, mi ricollego ed inizio

Sarò sincero, non ho prestato attenzione alla foto sopra. Tu?
was /dev/s..
Ora non so' cosa possa essere successo. Linux ha cambiato da solo i vdev? Il dcguy ha swappato fra loro i dischi? Sta di fatto che il nome del vdev era ridondante fra quello funzionante (che prima era sdb) e quello da sostituire
$ zpool status -v
config:
NAME STATE READ WRITE CKSUM
rpool DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
sdc3 ONLINE 0 0 0
9418680667891011951 FAULTED 0 0 0 was /dev/sdc3
Ergo, il classico "replace" falliva nei modi più disparati tipo:
- invalid vdev specification
- cannot offline /dev/sdx: no such device in pool
- /dev/sdx is part of active pool 'rpool'
Iniziamo
Identifichiamo i vdev e prepariamo il disco; meglio iniziare puliti, sicuramente ho spataccato talmente tanto da scrivere più metadata ZFS sul nuovo volume creando altri problemi, oltre al resto
# Identifichiamo..
$ fdisk -l
# Disk /dev/sdc: 1.8 TiB Disk model: HGST HUS724020AL -> SORGENTE
# Disk /dev/sdd: 1.8 TiB Disk model: HGST HUS724020AL -> DESTINAZIONE
# Puliamo..
$ dd if=/dev/zero of=/dev/sdd bs=512 count=10
$ dd if=/dev/zero of=/dev/sdd bs=512 seek=$(( $(blockdev --getsz /dev/sdd) - 4096 )) count=1M
$ wipefs -a /dev/sdd
Cloniamo la tabella partizioni, generiamo i GUIDs ed installiamo GRUB
# Clona la tabella di partizioni GPT
$ sgdisk /dev/sdc -R /dev/sdd
# Genera nuovi GUIDs
$ sgdisk -G /dev/sdd
# Installa GRUB
$ grub-install /dev/sdd
Assumendo che i vdev sono stati rinominati, usiamo quell'identificativo per mettere offline la partizione del disco che non esiste più
$ zpool offline rpool 9418680667891011951
Forziamo il replace e teniamo sott'occhio l'andamento
$ zpool replace -f rpool 9418680667891011951 /dev/sdd3
Make sure to wait until resilver is done before rebooting.


Risultato: mattinata a puttane, signora incazzata perchè non ho tagliato l'erba in giardino, server ok.
