= Cambiare un disco rotto in ZFS = == Situazione di partenza == '''Attenzione: versioni diverse di PVE hanno metodi abbastanza diversi fra loro. Se si usa UEFI e non BIOS ci sono differenze. Se si usa systemd-bootloader o come cavolo si chiama e non GRUB ci sono differenze. Questa procedura funzione SOLO con le condizioni sotto indicate''' Questa procedura è stata usata in questa configurazione: * pve-manager/6.0-4/2a719255 (running kernel: 5.0.15-1-pve) * due dischi in ZFS dai quali viene fatto il boot in modalità BIOS con GRUB * il disco sda è guasto * la macchina supporta hot swap (anche se ufficialmente non lo fa, di fatto lo fa) La condizione iniziale è un failure del mirror, che si presenta cosi`: {{{ #zpool status pool: rpool state: DEGRADED status: One or more devices has been removed by the administrator. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Online the device using 'zpool online' or replace the device with 'zpool replace'. scan: scrub repaired 0B in 0 days 02:57:11 with 0 errors on Sun Sep 11 03:21:12 2022 config: NAME STATE READ WRITE CKSUM rpool DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 ata-HGST_HUS722T2TALA604_WMC6N0P2VZD7-part3 REMOVED 0 0 0 ata-HGST_HUS722T2TALA604_WMC6N0P3WHRV-part3 ONLINE 0 0 0 }}} I dischi sono partizionati (default dell'installer di PVE) in questo modo: * Una partizione BIOS BOOT * Una partizione EFI * Una partizione grande con dentro ZFS La caratteristica peculiare di questa installazione (default di PVE prima di 6.4) è che usa GRUB con il supporto per ZFS, ergo boota caricando il kernel dalla partizione ZFS (sda3 / sdb3) e non dalla partizione EFI, nella quale comunque si trova una copia del kernel e (credo) del bootloader di systemd, che non viene usato. Ricordo che il PC boota in modalità BIOS e non UEFI. Ogni versione di PVE ha piccole differenze, e la documentazione purtroppo non è dettagliatissima, specie per le versioni piu` vecchie. == Procedura == * mettere definitivamente offline il disco che già è guasto (nel nostro caso, il disco è ata-HGST_HUS722T2TALA604_WMC6N0P2VZD7-part3 ovvero /dev/sda3) usando il comando "zpool offline " {{{ zpool offline rpool ata-HGST_HUS722T2TALA604_WMC6N0P2VZD7-part3 }}} * Staccare fisicamente il disco e cambiarlo con uno totalmente vergine * Verificare che il kernel lo veda (nel mio caso ho cambiato sda con un disco nuovo che viene visto sempre come sda) * Copiare le partizioni (GPT) dal disco buono a quello nuovo (occhio a non fare al contrario) con il comando "sgdisk -R " {{{ sgdisk /dev/sdb -R /dev/sda }}} * Randomizzare gli UID delle partizioni, in quanto la copia le fa IDENTICHE e non vogliamo avere UID uguali nei due dischi. Si usa il comando "sgdisk -G " {{{ sgdisk -G /dev/sda }}} * Eseguire dentro ZFS il "replace" del disco rotto con quello nuovo. Per verificare come si chiama il disco nuovo, ci aiuta fare un "ls -la /dev/disk-by-id" dove troviamo dei link simbolici dall' ID al /dev/sdXX. Qui vediamo che il nostro nuovo disco si chiama ata-HGST_HUS722T2TALA604_WMC6N0R544H5-part3. Facciamo quindi il comando "zpool replace ". In questo caso a dire il vero non sono dischi ma partizioni di dischi. L' id del disco rotto l'abbiamo visto prima con il comando "zpool status". La doc di PVE dice di usare il modificatore "-f" (force), io non l'ho usato e ha funzionato lo stesso. {{{ # zpool replace rpool ata-HGST_HUS722T2TALA604_WMC6N0P2VZD7-part3 ata-HGST_HUS722T2TALA604_WMC6N0R544H5-part3 }}} * Ora dovrebbe iniziare la ricostruzione del mirror, che impiegherà qualche ora ragionevolmente, in funzione di dimensioni e velocità (e spazio occupato nel disco). La posso seguire con il comando {{{ zpool status }}} * A questo punto devo ASPETTARE CHE FINISCA altrimenti grub NON SI INSTALLA. Ergo, posso andare a pranzo. * Finita la ricostruzione, formattiamo e riempiamo la partizione EFI (nel nostro caso, /dev/sda2) anche se di fatto non la useremo. Ma è opportuno averla funzionante se mai dovessimo avviare da super grub disk in quanto quest'ultimo NON VEDE ZFS. Per fare questo lavoro possiamo usare il comando pve-efiboot-tool che è stato però sostituito da "proxmox-boot-tool" dalla 6.4 in poi. Io poi per stare sicuro di copio dentro anche la config di grub, sempre per poterla poi leggere con super grub disk. {{{ pve-efiboot-tool format /dev/sda2 pve-efiboot-tool init /dev/sda2 mount /dev/sda2 /mnt cp -a /boot/grub /mnt umount /mnt }}} * ultimo passo, installiamo grub su /dev/sda (il nostro disco nuovo) lasciando stare quello gia` presente su /dev/sdb (il nostro disco vecchio) {{{ grub-install /dev/sda }}} Riferimento dal quale ho preso parte della procedura: https://pve.proxmox.com/wiki/ZFS_on_Linux#sysadmin_zfs_change_failed_dev