If it works, Dante will fix it !

Aller au contenu | Aller au menu | Aller à la recherche

samedi 17 octobre 2009

ZFS et USB 2. Resilvering et vdev failure

Comme indiqué dans mon billet précédent, je possède des disques durs USBs utilisés dans un zpool[1].

Il peut arriver qu'on ai des erreurs ZFS: vdev I/O failure lors du resilvering d'un disque entier. Et ce, au remplacement d'un disque dur USB ou à celui d'un disque SATA en couple avec un disque dur USB.

Cela a pour conséquences le freeze du zpool et des utilitaires zfs, et aussi de la led du boitier USB dans mon cas (elle reste rouge en mode "activité"). La manière la plus simple de débloquer la situation est de rebooter le boitier USB. Une fois le disque dur redémarré, le resilvering reprend depuis le début... et on se retrouve ainsi coincé dans une boucle sans fin.

Pour éviter ce genre de problème, on peut modifier la propriété failmode du zpool concerné. Pour cela, on l'export puis l'import en modifiant la propriété de la façon suivante :

zpool export tank
zpool import -o failmode=continue tank

Par défaut[2], le mode est wait. Ce qui fait que lors d'une erreur I/O, le système attend que l'utilisateur rebranche ou remplace le disque concerné et effectue un zpool replace/clear. Or dans notre cas, il s'agit d'une erreur ponctuelle causée par le boitier USB ou le driver umass.

Une fois le resilvering complété, vous pouvez exporter puis importer le zpool sans options pour repasser en failmode wait. Si jamais vous avez régulièrement ce genre d'erreurs, vous pouvez laisser votre zpool en failmode continue mais cela peut cacher l'apparition d'un vrai problème matériel.

Notes

[1] Je déconseille ce genre d'utilisation, préférez acquérir une carte pci-e e-sata avec les boitiers qui vont bien par exemple.

[2] Sous FreeBSD-7.2

ZFS et USB. Erreur sur la synchronisation du cache

J'ai un vieux serveur que j'utilise comme entité de stockage et sauvegarde. La carte mère n'étant pas très récente (A7N8X-X), il n'y a pas de port SATA à disposition. J'ai donc acheté une carte promise TX4 qui marche à perfection. Manquant d'espace, je me suis aussi procuré deux boitiers externes USB Cooler Master X-Craft 350.

Le tout est dans un même zpool avec une configuration mirror.

Seul souci : les disques durs USB flood mon dmesg avec l'erreur suivante :

(da0:umass-sim0:0:0:0): SYNCHRONIZE CACHE(10). CDB: 35 0 0 0 0 0 0 0 0 0 
(da0:umass-sim0:0:0:0): CAM Status: SCSI Status Error
(da0:umass-sim0:0:0:0): SCSI Status: Check Condition
(da0:umass-sim0:0:0:0): ILLEGAL REQUEST asc:20,0
(da0:umass-sim0:0:0:0): Invalid command operation code
(da0:umass-sim0:0:0:0): Unretryable error

Pour m'en débarrasser il m'a suffit d'indiquer au driver umass le fait que ces disques ne supporte pas l'opération SYNCHRONIZE CACHE.

J'ai tout d'abord récupéré les codes vendor et product du chipset sata des boitiers.

lsusb # Présent dans le port sysutils/usbutils
Bus /dev/usb Device /dev/ugen2.2: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge
Bus /dev/usb Device /dev/ugen5.2: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge

Voici donc mes deux boitiers externes, 152d correspond au code vendor et 2338 au code product Je vais ensuite éditer le fichier /usr/src/sys/dev/usb/usbdevs :

Y ajouter le vendor JMicron :

...
vendor UBIQUAM          0x1529  UBIQUAM Co., Ltd.
vendor JMICRON          0x152d  JMicron Technology Corp.
vendor UBLOX            0x1546  U-blox
...

Et la catégorie lui correspondant avec le produit JM20337 :

/* Jaton products */
....

/* JMicron products */
product JMICRON JM20337         0x2338  Hi-Speed USB to SATA & PATA Combo Bridge

/* JVC products */
....

Ensuite, dans /usr/src/sys/dev/usb/storage/umass.c J'indique que ce produit ne support pas la synchronisation du cache :

{USB_VENDOR_JMICRON, USB_PRODUCT_JMICRON_JM20337, RID_WILDCARD,
        UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
        NO_SYNCHRONIZE_CACHE
},
{USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_L3, RID_WILDCARD,
...

Puis on recompile et réinstalle le kernel:[1]

cd /usr/src
make buildkernel
make installkernel

Et on redémarre dessus.

Notes

[1] Il est aussi possible de ne faire recompiler que le module umass avec l'option MODULES_OVERRIDE, voir le handbook pour plus de détails.