Remplacement d'un disque défaillant dans la racine ZFS
Ce guide explique comment remplacer un disque défaillant dans un pool ZFS en miroir sous Linux. La procédure couvre la mise hors ligne du disque, la copie de la table de partitions sur le disque de remplacement, la réintégration du disque dans le pool et l’installation du chargeur d’amorçage une fois le resilvering terminé.
Prérequis
Les privilèges root sont requis. Les exemples ci-dessous supposent que le serveur possède deux disques : /dev/sda (fonctionnel) et /dev/sdb (défaillant). Adaptez les noms des périphériques à votre configuration.
Effectuez une sauvegarde de toutes les données importantes avant de continuer. Le remplacement d'un disque racine est une opération à haut risque. Une erreur à n'importe quelle étape peut entraîner une perte de données ou rendre le système impossible à démarrer. Évitez d'utiliser les noms de périphériques tels que /dev/sdX dans les commandes ZFS. Les noms des périphériques peuvent changer après un redémarrage. Utilisez plutôt des identifiants stables tels que /dev/disk/by-id/. Les exemples ci-dessous utilisent /dev/sdX par souci de simplicité lors des opérations de partitionnement. Les commandes ZFS doivent toujours utiliser /dev/disk/by-id/.
Étape 1 : Vérifier l'état du pool
Avant d'effectuer toute modification, vérifiez l'état actuel du pool :
zpool status -v
La sortie indique quel disque est défaillant ainsi que son identifiant dans le pool.
Étape 2 : Mettre le disque défaillant hors ligne
Si le disque est ONLINE mais présente des signes de défaillance, mettez-le hors ligne avant de procéder à son remplacement physique :
zpool offline rpool <failed-device>
ZFS cessera d'essayer d'utiliser le disque défaillant avant son remplacement physique. Remplacez <failed-device> par l'identifiant affiché par zpool status -v. Si le disque est déjà dans l'état FAULTED ou REMOVED, ignorez cette étape et passez directement à l'étape 3.
Étape 3 : Remplacer physiquement le disque
Si votre serveur prend en charge le remplacement à chaud (hot swap), vous pouvez remplacer le disque sans arrêter le système.
Sinon, éteignez le système :
poweroff
Après avoir installé le disque de remplacement, démarrez le serveur et vérifiez que le nouveau disque est détecté :
lsblk -o NAME,SIZE,MODEL ls -l /dev/disk/by-id/
Utilisez l'identifiant by-id du nouveau disque dans les étapes suivantes.
Étape 4 : Déterminer le type de table de partitions
Installez gdisk s'il n'est pas déjà présent :
apt install gdisk -y
Vérifiez le type de table de partitions du disque fonctionnel :
gdisk -l /dev/sda
Dans la sortie, recherchez la section Partition table scan. Pour MBR, le résultat indiquera MBR: MBR only et GPT: not present. Pour GPT, il indiquera MBR: protective et GPT: present.
Étape 5 : Préparer et copier la table de partitions sur le nouveau disque
La plupart des configurations ZFS avec système racine utilisent le partitionnement GPT. La méthode MBR est incluse pour les systèmes anciens.
GPT
Avant de continuer, identifiez le nom /dev/sdX correspondant au nouveau disque, car les outils de partitionnement en ont besoin :
lsblk -o NAME,SIZE,MODEL,SERIAL
Effacez les anciennes signatures du disque de remplacement avant de copier la table de partitions :
wipefs -a /dev/disk/by-id/<new-disk>
wipefs -a supprime définitivement toutes les signatures de systèmes de fichiers et de partitions présentes sur le disque. Vérifiez que l'identifiant du bon disque est indiqué avant d'exécuter cette commande.
La commande suivante copie la table de partitions de /dev/sda (source) vers /dev/sdb (destination) :
sgdisk -R /dev/sdb /dev/sda
Dans sgdisk -R, le premier argument correspond au disque de destination et le second au disque source. Inverser les arguments écraserait la table de partitions du disque fonctionnel.
Si le disque de remplacement est plus grand que le disque d'origine, étendez la GPT afin d'utiliser tout l'espace disponible :
sgdisk -e /dev/sdb
Attribuez ensuite un nouvel UUID unique au disque de remplacement :
sgdisk -G /dev/sdb
sgdisk -G attribue de nouveaux UUID à toutes les partitions du disque de remplacement. Si /etc/fstab contient des entrées basées sur des UUID pour l'une de ces partitions, le système peut ne plus démarrer. Une fois le resilvering terminé, vérifiez que /etc/fstab utilise des identifiants /dev/disk/by-id/ plutôt que des UUID.
Rechargez la table de partitions afin que le noyau prenne en compte la nouvelle structure :
udevadm trigger udevadm settle
Si le disque de remplacement a déjà été utilisé dans un autre pool ZFS, effacez les anciennes métadonnées ZFS afin d'éviter les conflits :
zpool labelclear /dev/disk/by-id/<new-disk-partX> 2>/dev/null || true
Remplacez <new-disk-partX> par l'identifiant réel de la partition ZFS.
MBR
La commande suivante copie la table de partitions de /dev/sda (source) vers /dev/sdb (destination) :
sfdisk -d /dev/sda | sfdisk /dev/sdb
Si les nouvelles partitions ne sont pas visibles par le système après la copie, rechargez la table de partitions :
udevadm trigger udevadm settle
Étape 6 : Ajouter le disque au pool
Remplacez le disque défaillant dans le pool par le nouveau disque. Commencez par vérifier l'identifiant exact du disque défaillant tel qu'il apparaît dans le pool :
zpool status rpool
Dans la sortie, recherchez l'entrée correspondant au disque défaillant dans la liste des périphériques du pool. Elle apparaîtra sous la forme d'un chemin complet, par exemple /dev/disk/by-id/ata-WDC_WD10_12345-part3, avec l'état FAULTED, UNAVAIL ou OFFLINE. Utilisez ce chemin comme <old-device> dans la commande replace :
zpool replace rpool <old-device> /dev/disk/by-id/<new-disk-part>
Remplacez <old-device> par l'identifiant du disque défaillant trouvé à l'étape précédente. Remplacez <new-disk-part> par l'identifiant by-id de la partition du disque de remplacement, en utilisant le même numéro de partition que sur le disque fonctionnel (par exemple -part3 ou -part4). Pour trouver le bon identifiant, exécutez ls -l /dev/disk/by-id/.
Si l'ancien disque est complètement indisponible (UNAVAIL) et que zpool replace renvoie une erreur, ajoutez l'option -f pour forcer le remplacement :
zpool replace -f rpool <old-device> /dev/disk/by-id/<new-disk-part>
Après avoir exécuté zpool replace, vérifiez que le resilvering a commencé et que le nouveau disque apparaît comme ONLINE :
zpool status
Le resilvering se poursuit automatiquement en arrière-plan.
Étape 7 : Surveiller le resilvering
Suivez la progression du resilvering avec :
zpool status -v
La sortie affiche la progression, la vitesse et le temps restant estimé. Attendez que l'état indique state: ONLINE et que le resilvering soit terminé avant de poursuivre. Selon la capacité du disque, cette opération peut prendre plusieurs heures.
Étape 8 : Vérifier le dataset de démarrage
Avant d'installer le chargeur d'amorçage, vérifiez que le pool possède le bon dataset de démarrage :
zpool get bootfs rpool
La sortie doit afficher un chemin de dataset tel que rpool/ROOT/debian. Si la valeur est none ou pointe vers le mauvais dataset, définissez-la manuellement :
zpool set bootfs=rpool/ROOT/debian rpool
Remplacez rpool/ROOT/debian par le nom réel du dataset racine de votre système. Pour afficher les datasets disponibles, exécutez zfs list.
Étape 9 : Installer le chargeur d'amorçage
Installez le chargeur d'amorçage sur le disque de remplacement une fois le resilvering terminé. Le système continue de fonctionner depuis le disque d'origine pendant le resilvering ; cette étape peut donc être effectuée en toute sécurité une fois le pool redevenu sain.
BIOS (Legacy)
grub-install /dev/disk/by-id/<new-whole-disk>
Sur certains systèmes, grub-install peut ne pas accepter un chemin by-id. Dans ce cas, remplacez /dev/disk/by-id/<new-whole-disk> par le nom correspondant du périphérique, par exemple /dev/sdb.
UEFI
Montez la partition EFI du disque de remplacement dans un répertoire temporaire avant d'exécuter grub-install. Cela évite de masquer la partition EFI actuellement active :
mkdir -p /mnt/new_efi mount /dev/disk/by-id/<new-disk-part1> /mnt/new_efi
Remplacez <new-disk-part1> par l'identifiant réel de la partition EFI (généralement -part1 ou -part2 ; type de partition EF00). En cas de doute, vérifiez avec ls -l /dev/disk/by-id/.
Si la partition EFI est vide, copiez le contenu de la partition EFI existante avant d'exécuter grub-install :
cp -r /boot/efi/* /mnt/new_efi/
Installez le chargeur d'amorçage :
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
Remplacez --bootloader-id=debian par le nom correspondant à votre distribution (par exemple ubuntu ou debian). Remplacez /dev/disk/by-id/<new-whole-disk> par l'identifiant by-id du disque de remplacement complet, et non celui d'une partition.
L'exécution de update-initramfs garantit que le disque RAM initial contient les modules ZFS actuels et reconnaît la nouvelle structure du pool. Sans cette étape, le système peut ne pas démarrer après le remplacement.
Démontez la partition EFI après l'installation :
umount /mnt/new_efi
Vérifiez les entrées de démarrage EFI :
efibootmgr -v
Sur les systèmes utilisant ZFS comme système de fichiers racine, grub-install peut échouer ou nécessiter des options supplémentaires selon la version de GRUB et la configuration du système. Par exemple, certains systèmes nécessitent l'installation de GRUB avec les modules de prise en charge de ZFS ou l'exécution de la commande depuis un environnement chroot. Si la commande renvoie une erreur, consultez la documentation de votre distribution pour les instructions d'installation de GRUB spécifiques à ZFS.
Sur Proxmox VE, grub-install est désactivé. Utilisez plutôt proxmox-boot-tool. L'exemple ci-dessous utilise /dev/sdb2 — remplacez-le par la partition EFI réelle de votre système :
proxmox-boot-tool format /dev/sdb2 proxmox-boot-tool init /dev/sdb2
Conclusion
Après avoir installé le chargeur d'amorçage, redémarrez le serveur et vérifiez qu'il démarre normalement. Lancez un scrub afin de rechercher d'éventuelles erreurs de lecture/écriture qui auraient pu survenir pendant le resilvering :
zpool scrub rpool
Vérifiez ensuite l'état du pool :
zpool status -v
Le pool doit être en ligne et ne présenter aucune erreur. Si des problèmes surviennent pendant la procédure, consultez les journaux système avec journalctl -xe pour obtenir davantage d'informations.
Avant de mettre au rebut le disque défaillant retiré à l'étape 3, redémarrez le serveur et vérifiez que le système démarre normalement avec le disque de remplacement. Conservez le disque défaillant comme solution de secours jusqu'à ce que le démarrage soit confirmé.