Remplacement d'un disque défaillant dans la racine ZFS | INTROSERV
EUR
european

EUR

usa

USD

French Fr
Ex. VAT Ex. VAT 0%

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.

Warning

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>

Warning

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

Warning

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

Warning

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

Warning

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.

Info

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.

Warning

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é.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA