Forum Astuces.divers Comment changer un disque SATA à chaud sous Linux ?

Posté par  (site web personnel) .
Étiquettes : aucune
14
8
jan.
2010
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ème 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 ...)

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 chaine 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 pareil ...) directemenet.

echo "- - -" >/sys/class/scsi_host/host0/scan
Un peu d’explication : les 3 "-" sont en fait normalement les numéro 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 rescanne 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)

Note : 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


Recopié sans vergogne depuis mon site, mais je me suis dit que ça avait sa place ici (Comment changer un disque SATA à chaud sous Linux ?)
  • # Scan de la chaîne SCSI

    Posté par  (site web personnel) . Évalué à 3.

    Ainsi, on pouvait rescanner un seul canal ou un seul lun en faisant : (...)

    Je vais peut-être dire une bêtise, mais on ne peut pas arriver au même résultat avec la commande rescan-scsi-bus ?

    C'est une commande (un script) disponible sous Slackware et qui m'a permit de détecter des disques externes USB (donc émulé en SCSI également) récalcitrants.
    • [^] # Re: Scan de la chaîne SCSI

      Posté par  (site web personnel) . Évalué à 2.

      Probablement : j'utilisais, à une autre époque, le binaire "scsiadd" : -p pour "print" l'état des disques, et -s suivi de 4 nombres pour "scanner" un lun.

      J'imagine qu'il doit y avoir d'autres outils similaires.

      Là je propose la méthode "2.6" ;)
      • [^] # Re: Scan de la chaîne SCSI

        Posté par  (site web personnel) . Évalué à 4.

        Là je propose la méthode "2.6" ;)

        Ah mais grand-mère Slackware se tient au goût du jour avec son 2.6.29.6 (voir mieux en -current) et la commande mentionnée plus haut y est disponible.
  • # Utiliser le RAID pour faire les install...

    Posté par  . Évalué à 3.

    Mais c'est trop excellent ces infos !


    J'ai une petite question d'admin-novice-et-flemmard-qui-veut-pas-tout-réinstaller:

    Je viens d'installer un serveur A avec 2 disques en RAID 1 (A1 et A2).
    J'ai un serveur B identique à installer (avec 2 disques B1 et B2).

    Est-ce que je peux faire une sorte d'installation des disques B1 et B2 en les échangeant chacun leur tour avec un disque du serveur A ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.