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.

Buy Me A Coffee