Sostituzione di un disco guasto nella root ZFS
Questa guida spiega come sostituire un disco guasto in un pool ZFS in configurazione mirror su Linux. La procedura comprende la messa offline del disco, la copia della tabella delle partizioni sul disco sostitutivo, il nuovo inserimento del disco nel pool e l'installazione del bootloader dopo il completamento del resilvering.
Prerequisiti
Sono necessari i privilegi di root. Gli esempi seguenti presuppongono un server con due dischi: /dev/sda (funzionante) e /dev/sdb (guasto). Adattare i nomi dei dispositivi alla propria configurazione.
Eseguire un backup di tutti i dati importanti prima di procedere. La sostituzione di un disco root è un'operazione ad alto rischio. Un errore in qualsiasi fase può causare la perdita di dati o rendere il sistema non avviabile. Evitare di utilizzare nomi di dispositivo come /dev/sdX nei comandi ZFS. I nomi dei dispositivi possono cambiare dopo un riavvio. Utilizzare invece identificatori stabili come /dev/disk/by-id/. Negli esempi seguenti viene utilizzato /dev/sdX per semplicità durante l'utilizzo degli strumenti di partizionamento. I comandi ZFS devono utilizzare sempre /dev/disk/by-id/.
Passaggio 1: controllare lo stato del pool
Prima di apportare qualsiasi modifica, controllare lo stato attuale del pool:
zpool status -v
L'output mostrerà quale disco presenta problemi e il relativo identificatore all'interno del pool.
Passaggio 2: mettere offline il disco guasto
Se il disco è ONLINE ma presenta problemi, metterlo offline prima della sostituzione fisica:
zpool offline rpool <failed-device>
ZFS smetterà di tentare di utilizzare il disco difettoso prima della sostituzione fisica. Sostituire <failed-device> con l'identificatore mostrato da zpool status -v. Se il disco è già nello stato FAULTED o REMOVED, saltare questo passaggio e procedere direttamente al Passaggio 3.
Passaggio 3: sostituire fisicamente il disco
Se il server supporta l'hot swap, è possibile sostituire il disco senza spegnerlo.
In caso contrario, spegnere il sistema:
poweroff
Dopo aver installato il disco sostitutivo, avviare il server e verificare che il nuovo disco sia visibile:
lsblk -o NAME,SIZE,MODEL ls -l /dev/disk/by-id/
Utilizzare l'identificatore by-id del nuovo disco nei passaggi successivi.
Passaggio 4: determinare il tipo di tabella delle partizioni
Installare gdisk se non è già presente:
apt install gdisk -y
Controllare il tipo di tabella delle partizioni del disco funzionante:
gdisk -l /dev/sda
Nell'output, cercare la sezione Partition table scan. Per MBR verranno visualizzati MBR: MBR only e GPT: not present. Per GPT verranno visualizzati MBR: protective e GPT: present.
Passaggio 5: preparare e copiare la tabella delle partizioni sul nuovo disco
La maggior parte delle configurazioni root ZFS utilizza il partizionamento GPT. Il metodo MBR è incluso per i sistemi legacy.
GPT
Prima di procedere, identificare il nome /dev/sdX corrispondente al nuovo disco, poiché gli strumenti di partizionamento lo richiedono:
lsblk -o NAME,SIZE,MODEL,SERIAL
Cancellare tutte le vecchie firme dal disco sostitutivo prima di copiare la tabella delle partizioni:
wipefs -a /dev/disk/by-id/<new-disk>
wipefs -a rimuove permanentemente tutte le firme dei filesystem e delle partizioni dal disco. Assicurarsi di specificare l'identificatore corretto del disco prima di eseguire questo comando.
Il comando seguente copia la tabella delle partizioni da /dev/sda (origine) a /dev/sdb (destinazione):
sgdisk -R /dev/sdb /dev/sda
In sgdisk -R, il primo argomento è il disco di destinazione e il secondo è quello di origine. Eseguire questo comando con gli argomenti invertiti sovrascriverà la tabella delle partizioni del disco funzionante.
Se il disco sostitutivo è più grande di quello originale, espandere la GPT per utilizzare l'intero disco:
sgdisk -e /dev/sdb
Quindi assegnare un nuovo UUID univoco al disco sostitutivo:
sgdisk -G /dev/sdb
sgdisk -G assegna nuovi UUID a tutte le partizioni del disco sostitutivo. Se /etc/fstab contiene voci basate su UUID per una di queste partizioni, il sistema potrebbe non avviarsi. Dopo il completamento del resilvering, verificare che /etc/fstab utilizzi identificatori /dev/disk/by-id/ invece degli UUID.
Ricaricare la tabella delle partizioni affinché il kernel rilevi il nuovo layout:
udevadm trigger udevadm settle
Se il disco sostitutivo era stato precedentemente utilizzato in un altro pool ZFS, cancellare i vecchi metadati ZFS per evitare conflitti:
zpool labelclear /dev/disk/by-id/<new-disk-partX> 2>/dev/null || true
Sostituire <new-disk-partX> con l'identificatore effettivo della partizione ZFS.
MBR
Il comando seguente copia la tabella delle partizioni da /dev/sda (origine) a /dev/sdb (destinazione):
sfdisk -d /dev/sda | sfdisk /dev/sdb
Se le nuove partizioni non sono visibili nel sistema dopo la copia, ricaricare la tabella delle partizioni:
udevadm trigger udevadm settle
Passaggio 6: aggiungere il disco al pool
Sostituire la voce del disco guasto nel pool con il nuovo disco. Per prima cosa, verificare l'identificatore esatto del disco guasto così come viene visualizzato nel pool:
zpool status rpool
Nell'output, individuare la voce relativa al disco guasto nell'elenco dei dispositivi del pool. Verrà visualizzata come percorso completo, ad esempio /dev/disk/by-id/ata-WDC_WD10_12345-part3, con stato FAULTED, UNAVAIL o OFFLINE. Utilizzare questo percorso come <old-device> nel comando replace:
zpool replace rpool <old-device> /dev/disk/by-id/<new-disk-part>
Sostituire <old-device> con l'identificatore del disco guasto del passaggio precedente. Sostituire <new-disk-part> con l'identificatore by-id della partizione del disco sostitutivo, utilizzando lo stesso numero di partizione del disco funzionante, ad esempio -part3 o -part4. Per trovare l'identificatore corretto, eseguire ls -l /dev/disk/by-id/.
Se il vecchio disco è completamente non disponibile (UNAVAIL) e zpool replace restituisce un errore, aggiungere l'opzione -f per forzare la sostituzione:
zpool replace -f rpool <old-device> /dev/disk/by-id/<new-disk-part>
Dopo aver eseguito zpool replace, verificare che il resilvering sia iniziato e che il nuovo disco appaia come ONLINE:
zpool status
Il resilvering continuerà automaticamente in background.
Passaggio 7: monitorare il resilvering
Monitorare l'avanzamento del resilvering con:
zpool status -v
L'output mostra l'avanzamento, la velocità e il tempo stimato rimanente. Attendere che lo stato mostri state: ONLINE e che il resilvering sia completato prima di procedere. A seconda delle dimensioni del disco, l'operazione può richiedere diverse ore.
Passaggio 8: verificare il dataset di avvio
Prima di installare il bootloader, verificare che il pool abbia configurato il dataset di avvio corretto:
zpool get bootfs rpool
L'output dovrebbe mostrare un percorso del dataset come rpool/ROOT/debian. Se il valore è none o punta al dataset errato, impostarlo manualmente:
zpool set bootfs=rpool/ROOT/debian rpool
Sostituire rpool/ROOT/debian con il nome effettivo del dataset root del sistema. Per elencare i dataset disponibili, eseguire zfs list.
Passaggio 9: installare il bootloader
Installare il bootloader sul disco sostitutivo dopo il completamento del resilvering. Durante il resilvering, il sistema continua a funzionare dal disco originale, quindi questo passaggio può essere eseguito in sicurezza una volta che il pool è integro.
BIOS (Legacy)
grub-install /dev/disk/by-id/<new-whole-disk>
Su alcuni sistemi, grub-install potrebbe non accettare un percorso by-id. In tal caso, sostituire /dev/disk/by-id/<new-whole-disk> con il nome del dispositivo corrispondente, ad esempio /dev/sdb.
UEFI
Montare la partizione EFI del disco sostitutivo in una directory temporanea prima di eseguire grub-install. Questo evita di nascondere la partizione EFI attualmente attiva:
mkdir -p /mnt/new_efi mount /dev/disk/by-id/<new-disk-part1> /mnt/new_efi
Sostituire <new-disk-part1> con l'identificatore effettivo della partizione EFI (in genere -part1 o -part2; tipo di partizione EF00). In caso di dubbi, verificare con ls -l /dev/disk/by-id/.
Se la partizione EFI è vuota, copiare il contenuto della partizione EFI esistente prima di eseguire grub-install:
cp -r /boot/efi/* /mnt/new_efi/
Installare il bootloader:
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
Sostituire --bootloader-id=debian con il nome corrispondente alla propria distribuzione, ad esempio ubuntu o debian. Sostituire /dev/disk/by-id/<new-whole-disk> con l'identificatore by-id dell'intero disco sostitutivo, non di una partizione.
L'esecuzione di update-initramfs garantisce che il ramdisk iniziale includa i moduli ZFS correnti e riconosca il nuovo layout del pool. Senza questo passaggio, il sistema potrebbe non avviarsi dopo la sostituzione.
Smontare la partizione EFI dopo l'installazione:
umount /mnt/new_efi
Verificare le voci di avvio EFI:
efibootmgr -v
Sui sistemi con root ZFS, grub-install potrebbe non riuscire o potrebbe richiedere opzioni aggiuntive a seconda della versione di GRUB e della configurazione del sistema. Ad esempio, alcuni sistemi richiedono l'installazione di GRUB con i moduli di supporto ZFS oppure l'esecuzione del comando da un ambiente chroot. Se il comando restituisce un errore, consultare la documentazione della propria distribuzione per le istruzioni specifiche sull'installazione di GRUB con ZFS.
Su Proxmox VE, grub-install è disabilitato. Utilizzare invece proxmox-boot-tool. L'esempio seguente utilizza /dev/sdb2: sostituirlo con la partizione EFI effettiva del proprio sistema:
proxmox-boot-tool format /dev/sdb2 proxmox-boot-tool init /dev/sdb2
Conclusione
Dopo aver installato il bootloader, riavviare il server e verificare che si avvii normalmente. Eseguire uno scrub per verificare la presenza di eventuali errori di lettura/scrittura che potrebbero essersi verificati durante il resilvering:
zpool scrub rpool
Verificare quindi lo stato del pool:
zpool status -v
Il pool dovrebbe essere online e senza errori. Se durante la procedura si verificano problemi, controllare i log di sistema con journalctl -xe per ulteriori dettagli.
Prima di smaltire il disco guasto rimosso nel Passaggio 3, riavviare il server e verificare che il sistema si avvii normalmente con il disco sostitutivo. Conservare il disco guasto come fallback fino a quando non sarà confermato il corretto avvio del sistema.