Le serveur en question tourne sur Debian 6 avec zfs-fuse comme système de fichier sur un volume stripped mirror, équivalent d'un RAID 10.
zpool get version tank
NAME PROPERTY VALUE SOURCE
tank version 23 default
Alors que je regardais l'espace disponible sur un volume ZFS dédié à des backups, je m'apercois du message d'erreur suivant:
zpool status | head
pool: tank
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors using 'zpool clear' or replace the device with 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-9P
scrub: none requested
config:
Effectivement le noyau a du mal à communiquer avec un disque dur
dmesg | grep sd
[87538.049395] sd 1:0:1:0: [sdd] Unhandled sense code
[87538.049399] sd 1:0:1:0: [sdd] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[87538.049404] sd 1:0:1:0: [sdd] Sense Key : Medium Error [current] [descriptor]
[87538.049430] sd 1:0:1:0: [sdd] Add. Sense: Unrecovered read error - auto reallocate failed
[87538.049437] sd 1:0:1:0: [sdd] CDB: Read(10): 28 00 48 06 54 00 00 00 80 00
[87538.049448] end_request: I/O error, dev sdd, sector 1208374353
Cecu est confirmé par le status SMART du disque en question: un disque dur vieux de 1541 jours, on peut le changer !
smartctl --all /dev/sdd | grep ^Error
Error logging capability: (0x01) Error logging supported.
Error 7453 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hours)
Error 7452 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hours)
Error 7451 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hours)
Error 7450 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hours)
Error 7449 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hour
Notons tout d'abord son numéro de série:
hdparm -I /dev/sdd | grep "Serial Number"
Serial Number: WD-WCASJ0402738
Un petit tour sur le site du constructeur permet d'ailleurs de constater que la date de garantie est déja dépassée:
Et retirons le disque dur du pool zfs:
zpool offline tank /dev/sdd
Notre pool "tank" apparait alors en statut "dégradé" mais heureusement pas d'erreurs sur les données.
zpool status
pool: tank
state: DEGRADED
status: One or more devices has been taken offline 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'.
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
mirror-0 ONLINE 0 0 0
sda ONLINE 0 0 0
sdb ONLINE 0 0 0
mirror-1 DEGRADED 0 0 0
sdc ONLINE 0 0 0
sdd OFFLINE 0 0 0
errors: No known data errors
Une fois le serveur arrêté il s'agit de remplacer le disque dur comme le noyau l'avait reconnu comme /dev/sdd, il est sans doute sur la troisième nappe SATA (la numérotation commençant à partir de 0)
Un coup d’œil au disque permet de vérifier le numéro de série:
Après avoir recablé le disque, rajoutons le dans le pool zfs:
zpool replace tank /dev/sdd
Si vous utilisez les numeros de series des disques comme identifiant:
zpool replace tank ata-WDC_WD2003FYYS-02W0B0_WD-WMAY02196811 ata-Hitachi_HDS721010KLA330_GTE002PBGTNYME
Zfs va maintenant resynchroniser les blocs de données:
(Dans le jargon de ZFS, resilvering signifie copier les blocs d'un disque à un autre pour regagner un état initial)
zpool status
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.
scrub: resilver in progress for 0h33m, 34.92% done, 1h1m to go
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
mirror-0 ONLINE 0 0 0
sda ONLINE 0 0 0
sdb ONLINE 0 0 0
mirror-1 DEGRADED 0 0 0
sdc ONLINE 0 0 0
replacing-1 DEGRADED 0 0 0
sdd/old OFFLINE 0 0 0
sdd ONLINE 0 0 0 67.0G resilvered
On peut aussi suivre l'état de la synchronisation, qui s'effectue environ à 47MB/s sur ce système:
iostat -d 1 -m
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 0.00 0.00 0.00 0 0
sdd 137.00 0.00 48.13 0 48
sdc 138.00 48.69 0.00 48 0
sdb 0.00 0.00 0.00 0 0
sde 0.00 0.00 0.00 0 0
Environ deux heures plus tard la synchronisation des blocs de données est terminée, et le pool zfs est de nouveau en statut normal:
zpool status
pool: tank
state: ONLINE
scrub: resilver completed after 1h38m with 0 errors on Tue Sep 18 17:04:25 2012
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sda ONLINE 0 0 0
sdb ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0 192G resilvered
errors: No known data errors