Zfs: remplacement d'un disque dans un Raidz2

Bonjour à tous,

Un petit billet qui va porter sur ZFS (plus précisément Zfs On Linux) et le remplacement d'un disque défectueux.

Situation de départ: un raidz2 (soit l'équivalent d'un raid6, donc 2 disques de parités) avec 6x2To. Un disque vieillissant avec une grosse réallocation de secteur:

5 Reallocated_Sector_Ct   0x0033   138   138   140    Pre-fail  Always   FAILING_NOW 1178
9 Power_On_Hours          0x0032   051   051   000    Old_age   Always       -       36037

Ces données ont été obtenues via smartmontools avec la commande:

smartctl -a /dev/sdc

Comme on peut le voir, le nombre de secteurs réalloués (première ligne) est important ainsi que le nombre d'heures (seconde ligne) de vie du disque.
Il est donc temps de remplacer ce disque.

Tout d'abord niveau zfs, il faut passer le disque en offline:

zpool offline tank sdc

L'avantage de cette manoeuvre est que si le remplacement se fait mal, il est toujours possible de rebrancher le disque mourant et de le repasser online afin de retrouver un raidz2 "utilisable".

Nous pouvons donc arrêter le serveur afin de faire le remplacement physique. Une fois terminé, nous pouvons relancer le serveur.
Il nous reste à faire le remplacement du disque au niveau zfs:

zpool replace tank sdc sdc

Nous remplaçons donc l'ancien disque en sdc, par le nouveau en sdc également. Il faut vérifier que la lettre assignée au disque (fdisk est utile dans ce cas). afin d'être sur d'assigner le bon disque.

Si votre disque est neuf, il ne contient pas de partition ou en tout cas pas une utilisable par zfs, il faudra donc utiliser l'option force:

zpool replace tank sdc sdc -f

Il ne reste plus maintenant qu'à attendre la fin du resilvering:

pool: tank
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sun Dec  6 11:14:25 2015
        50,4G scanned out of 7,85T at 275M/s, 8h16m to go
        8,39G resilvered, 0,63% done
config:

        NAME             STATE     READ WRITE CKSUM
        tank             DEGRADED     0     0     0
          raidz2-0       DEGRADED     0     0     0
            sda          ONLINE       0     0     0
            sdd          ONLINE       0     0     0
            replacing-2  OFFLINE      0     0     0
              old        OFFLINE      0     0     0
              sdc        ONLINE       0     0     0  (resilvering)
            sdb          ONLINE       0     0     0
            sde          ONLINE       0     0     0
            sdf          ONLINE       0     0     0

errors: No known data error

~9H Plus tard, nous avons un raidz2 à nouveau pleinement opérationnel.
J'ai également complété avec un scrub afin d'être sur de l'intégrité des fichiers:

zpool scrub tank

Have a nice day