Ah ! Le fameux « hotplug » ou « changement à chaud » !
Un des marronniers du monde des administrateurs système. Lorsque l’on achète une baie de disque toute faite ou des systèmes prévus pour (comme des cartes raid 3Ware ou Adaptec), on peut assez facilement changer un disque dur défectueux sans rebooter le serveur : le constructeur vous fournit les outils en ligne de commande ou en environnement graphique qui vous permettent de faire cela facilement.
Toutefois, sur de petits serveurs, on n’a pas toujours une carte raid sous la main, mais juste 2 à 4 disques SATA sur le bus interne de la machine.
La question du jour est donc :
Comment changer un disque dur SATA sur un serveur sans le redémarrer ?
Tout d’abord, il y a quelques prérequis :
- un noyau Linux récent (2.6.18 minimum, nous conseillons de toute manière d’être au moins au 2.6.26, qui n’a rien de vraiment récent par ailleurs ;) ) Pour savoir quel noyau vous avez, tapez uname -a
- une carte SATA configurée en mode AHCI, et pas en mode de compatibilité IDE : sans cela, le hotplug a de grande chances de ne pas marcher du tout. Cela se configure en général dans le BIOS de votre carte mère, puisque l’on parle ici de bus SATA intégré. Si vous avez une carte SATA PCI, elle dispose assurément d’un BIOS auquel vous pouvez généralement accéder via un autre raccourcis clavier affiché avant le boot et après le chargement du bios de la carte mère.
- TESTEZ : la procédure que je décris ici fonctionne sur 100 % de mes SATA Supermicro compatibles AHCI, mais pas du tout sur ma carte mère Asus au bureau, donc méfiance : testez votre carte mère pour savoir si cela fonctionne, il serait dommage, en voulant changer un disque sans rebooter, de planter totalement le serveur, au risque de perdre des données (d’autant que lorsque l’on change un disque, c’est en général que l’on a un RAID dégradé …).
- utilisez un rack ou un serveur tour avec des chariots de disque hotplug : ces chariots sont en général équipés d’un verrou ou d’une trappe pour bloquer le disque en place, et leur fabrication assure que les contacts se passeront dans le bon sens, sans court-circuit ni masse faible (SATA est bien fait pour ça d’ailleurs …)
Pas hotplug ! | Hotplug ! |
Enlever un disque dur à chaud
Tout d’abord, si votre ancien disque dur est encore reconnu, même partiellement, il faut idéalement signaler au système que vous allez l’enlever
Pour cela, rendez-vous en console, en tant que root, sur le serveur, dans /sys/class/scsi_host/host0 (ou un autre numéro en fonction de l’emplacement du disque dans votre chaîne SATA…)
ls -ahl /sys/class/scsi_host/host0/device/target0:0:0/0:0:0:0
on lit entre autre :
--w------- 1 root root 4,0K jan 8 19:05 delete
Ce fichier permet (en écrivant dedans, d’où le « w » laconique) de signaler la suppression d’un disque. On procède donc ainsi :
echo "1" >/sys/class/scsi_host/host0/device/target0:0:0/0:0:0:0/delete
En regardant vos messages noyaux (typiquement via tail -f /var/log/kern.log ) vous devez voir que Linux supprime le disque et ses partitions.
Insérer le nouveau disque
Pour insérer le nouveau disque, on s’adresse non plus au disque lui-même dans /sys, mais au bus SCSI (c’est un nom historique, en fait qu’il s’agisse de SCSI, SAS ou SATA, Linux se comporte de la même manière…) directement.
echo "- - -" >/sys/class/scsi_host/host0/scan
Quelques explications : les 3 « – » sont en fait normalement les numéros de bus de channel et de lun qui doivent être scannés. Ces numéros viennent du monde SCSI où l’on pouvait avoir plusieurs périphériques par canal. Ainsi, on pouvait rescanner un seul canal ou un seul lun en faisant :
echo "1 3 2" >/sys/class/scsi_host/host0/scan
pour rescanner le bus 1 channel 3 lun 2 de l’hôte 0…
En SATA c’est bien souvent inutilisé, donc nous utilisons « – – – » qui demande… de tout rescanner…
Si vous avez bien inséré un nouveau disque, le kernel log vous le détecte donc magiquement :
Jan 1 20:08:14 kepo kernel: [6705174.364356] ata1: hard resetting link Jan 1 20:08:14 kepo kernel: [6705174.850884] ata1: SATA link up 1.5 Gbps (SStatus 113 SControl 300) Jan 1 20:08:14 kepo kernel: [6705174.882894] ata1.00: configured for UDMA/133 Jan 1 20:08:14 kepo kernel: [6705174.882894] ata1: EH complete Jan 1 20:08:14 kepo kernel: [6705174.882894] sd 0:0:0:0: [sda] 976773168 512-byte hardware sectors (500108 MB)
N.B. : si vous ne signalez pas le retrait de l’ancien disque, le noyau pourra s’en rendre compte lorsque vous scannerez le nouveau, mais nous ne conseillons pas cela :
Jan 1 20:15:13 kepo kernel: [6705718.410939] ata2.00: model number mismatch 'ST3500320AS' != 'ST3500820AS' Jan 1 20:15:13 kepo kernel: [6705718.410971] ata2.00: revalidation failed (errno=-19) Jan 1 20:15:13 kepo kernel: [6705718.411001] ata2.00: disabled Jan 1 20:15:14 kepo kernel: [6705718.933458] ata2: hard resetting link