FreeBSD : RAID1 hotswap avec gestion AHCI

FreeBSD 8 gère par défaut vos disques par le driver ATA. Celui ne gère pas le hotswap disque. Si atacontrol permet bien de désactiver et débrancher un disque à chaud, la détection n’est effective qu’au prochain reboot. Pour permettre une détection à chaud, il est nécessaire d’utiliser le driver expérimental AHCI, tout en s’assurant que la gestion AHCI des disques est supportée et activée dans le BIOS.
La gestion AHCI s’appuie sur la couche CAM (déjà utilisée pour les périphériques SCSI et USB), ce qui implique un changement de noms des disques durs. Ainsi _/dev/ad0 _devient _/dev/ada0. La _fstab est à modifier avant de redémarrer, d’autant qu’un LiveCD est nécessaire en cas d’erreur ou pour réactiver la gestion ATA. Pour éviter ces désagréments, GEOM propose comme solution les labels qui permettent de bénéficier de noms fixes pour les disques (quelque soit le mode en cours). Pour récupérer les labels de vos partitions UFS, activez l’option suivante :
# sysctl kern.geom.label.debug=1
Les labels seront alors listés au prochain boot, lesquels seront à récupérer et à placer dans la fstab. Pour la partition de swap, le label doit être créer par glabel :
# glabel label swap /dev/ad0s1b
Dans le cas d’un système déjà configuré en RAID par GEOM, les labels sont déjà configurés : GEOM les utilise implicitement. Ainsi, l’activation / désactivation de l’AHCI est transparente et un simple reboot permet de bénéficier de la gestion AHCI.
Pour rappel, voici la méthode de création d’un RAID1 sous GEOM :
# sysctl kern.geom.debugflags=16
# gmirror label -v -b round-robin gm0 /dev/ad8
# cat geom_mirror_load="YES" >> /boot/loader.conf
# ee /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/gm0s1b none swap sw 0 0
/dev/mirror/gm0s1a / ufs rw 1 1
/dev/mirror/gm0s1f /home ufs rw 2 2
/dev/mirror/gm0s1d /usr ufs rw 2 2
/dev/mirror/gm0s1e /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
# shutdown -r now
# gmirror insert gm0 /dev/ad10
# gmirror status Name Status Components
mirror/gm0 DEGRADED ada0
ada1 (48%)
A présent, la gestion des AHCI peut être activée :
# cat ahci_load="YES" >> /boot/loader.conf
# shutdown -r now
# camcontrol devlist
<WDC WD2502ABYS-02B7A0 02.03B03> at scbus2 target 0 lun 0 (ada1,pass2)
<WDC WD2502ABYS-02B7A0 02.03B03> at scbus3 target 0 lun 0 (pass0,ada0)
<Slimtype DVD A DS8A2S 6P5D> at scbus5 target 0 lun 0 (cd0,pass1)
Je débranche le second disque, la pile RAID se dégrade :
(ada1:ahcich3:0:0:0): lost device
(ada1:ahcich3:0:0:0): Invalidating pack
GEOM_MIRROR: Cannot write metadata on ada1 (device=gm0, error=6).
GEOM_MIRROR: Cannot update metadata on disk ada1 (error=6).
GEOM_MIRROR: Device gm0: provider ada1 disconnected.
Une fois le disque rebranché, une détection des périphériques de masse est nécessaire (ce n’est pas automatisé) :
# camcontrol devlist
<WDC WD2502ABYS-02B7A0 02.03B03> at scbus2 target 0 lun 0 (pass0,ada0)
<Slimtype DVD A DS8A2S 6P5D> at scbus5 target 0 lun 0 (cd0,pass1)
# camcontrol rescan all
Re-scan of bus 0 was successful
Re-scan of bus 1 was successful
Re-scan of bus 2 was successful
Re-scan of bus 3 was successful
Re-scan of bus 4 was successful
Re-scan of bus 5 was successful
# camcontrol devlist
<WDC WD2502ABYS-02B7A0 02.03B03> at scbus2 target 0 lun 0 (pass0,ada0)
<WDC WD2502ABYS-02B7A0 02.03B03> at scbus3 target 0 lun 0 (ada1,pass2)
<Slimtype DVD A DS8A2S 6P5D> at scbus5 target 0 lun 0 (cd0,pass1)
Le disque est à présent reconnu mais le RAID lui aussi ne se reconstruit pas automatiquement :
(ada1:ahcich3:0:0:0): Synchronize cache failed
(ada1:ahcich3:0:0:0): removing device entry
(aprobe0:ahcich3:0:0:0): SIGNATURE: 0000
ada1 at ahcich3 bus 0 target 0 lun 0
ada1: <WDC WD2502ABYS-02B7A0 02.03B03> ATA/ATAPI-8 SATA 2.x device
ada1: 300.000MB/s transfers
ada1: 239429MB (490350672 512 byte sectors: 16H 63S/T 16383C)
ada1: Native Command Queueing enabled
GEOM_MIRROR: Component ada1 (device gm0) broken, skipping.
GEOM_MIRROR: Cannot add disk ada1 to gm0 (error=22).
GEOM_MIRROR: Device gm0: rebuilding provider ada1.
Ce qui est entrepris de suite :
# gmirror forget gm0 /dev/ada1
gmirror: No such device: /dev/ada1.
# gmirror insert gm0 /dev/ada1
# gmirror status
Name Status Components
mirror/gm0 DEGRADED ada0
ada1 (1%)
La reconstruction RAID au final ne nécessite plus aucun redémarrage. Le driver AHCI apporte également d’autres fonctionnalités comme le support du NCQ, ce qui permet d’augmenter le débit en cas de forte charge. Pour le vérifier et obtenir des informations détaillées sur un disque, camcontrol est de rigueur :
# camcontrol identify ada0
pass0: <WDC WD2502ABYS-02B7A0 02.03B03> ATA/ATAPI-8 SATA 2.x device
protocol ATA/ATAPI-8 SATA 2.x
device model WDC WD2502ABYS-02B7A0
serial number WD-WCAT1E308323
firmware revision 02.03B03
cylinders 16383
heads 16
sectors/track 63
LBA supported 268435455 sectors
LBA48 supported 490350672 sectors
PIO supported PIO4
DMA supported WDMA2 UDMA6
overlap not supported
Feature Support Enable Value Vendor
write cache yes yes
read ahead yes yes
Native Command Queuing (NCQ) yes 31/0x1F
Tagged Command Queuing (TCQ) no no 31/0x1F
SMART yes yes
microcode download yes yes
security yes no
power management yes yes
advanced power management no no 0/0x00
automatic acoustic management yes yes 254/0xFE 128/0x80