Pourtant toutes mes partitions étaient mises en miroir

Linux Gazette n°93 - Août 2003

Graham Jenkins


Table des matières
1. Aucun problème, tout est mis en miroir !
2. Comment est-il possible de perdre les deux côtés d'un miroir à la fois ?
3. Au domicile
4. Un mécanisme simple de chien de garde
5. Le programme
6. Mise en route

1. Aucun problème, tout est mis en miroir !

Cette histoire a en fait commencé à la suite de l'appel d'un utilisateur. Il avait quelques problèmes pour consulter la base de données pour l'application ACME et souhaitait que j'y jette un coup d'œil. Comme la totalité de ce serveur était mise en miroir, le scénario le plus probable était que les fichiers journaux d'archivage n'avaient pas été déplacés vers le stockage secondaire. Je pensais résoudre ce problème en quelques minutes. Malheureusement, il fallut plusieurs heures : il semblait vraiment que les disques étaient perdus des deux côtés des miroirs.


2. Comment est-il possible de perdre les deux côtés d'un miroir à la fois ?

Quelle était l'erreur ? Les éléments du miroir étaient sur des disques séparés connectés à des contrôleurs séparés : il n'y avait aucun signe de coupure d'alimentation ou de tremblement de terre majeurs. Nous ne pouvions pas non plus accuser l'équipe de nettoyage de nuit d'avoir débranché des câbles d'alimentation pour brancher leur matériel.

La réponse est que nous n'avons pas perdu les deux côtés en même temps. Nous avions effectivement perdu un côté une semaine auparavant. Ma société dispose d'un excellent système de surveillance et d'alarme pour détecter de tels événement, mais nous avions oublié de prévenir l'équipe de surveillance que ce serveur était passé de l'état de «construction» à celui de «production». Voilà une situation qu'il vaut mieux ne pas reproduire !


3. Au domicile

Quelques semaines auparavant, mon ordinateur domestique avait fait connu sa seconde panne de disque en six mois. Heureusement, le disque put être remplacé encore sous garantie. Toutefois, je décidai de mettre en miroir tout son contenu sur un disque additionnel.

Je me demandai ensuite comment je saurais si une partition sur un disque devenait inacessible. Impossible de justifier la liaison de mon ordinateur personnel au système d'alarme de ma société.

D'aucuns m'auraient conseillé de contrôler le journal des messages, de lire les messages «root» Ce n'est que pure théorie. Pour mes proches, les «messages» ne sont rien de plus que des notes sur un Post-It et les messages électroniques ceux qu'on lit sur Hotmail. Et ils sont les principaux utilisateurs de ma machine en mon absence.


4. Un mécanisme simple de chien de garde

La solution ici s'est avérée être un mécanisme consistant faire clignoter la diode Arrêt défilement (Scroll Lock) pendant un intervalle d'une seconde tous les dix secondes. Si une partition n'est pas mise en miroir, la diode reste constamment allumée. Aucun matériel additionnel, très simple à comprendre. Ce que nous avons consiste en un chien de garde simple, qui «aboie» périodiquement pour indiquer qu'il est encore actif, et «aboie» sans interruption en cas d'incident.

Comment procéder pour faire clignoter la diode «Arrêt défilement» ? Si vous utilisez Xwindow, c'est facile :

Ces commandes fonctionnent même si Arrêt défilement est actif ou si votre écran est éteint - pourvu que vous soyez connecté.

Si personne n'est connecté si vous n'utilisez pas Xwindow, ce système n'aura aucune efficacité. Dans ce cas, vous devez installer un programme comme «blinker», qui fait partie de la suite «morse2led» disponible sur le site web http://node.to.


5. Le programme

Voici ce que pouvez voir en saisissant cat/proc/mdstat sur une machine dont le miroir est «brisé» :

  Personalities : [raid1]
  read_ahead 1024 sectors
  md2 : active raid1 hda6[0] hdb6[1](F)
        1959808 blocks [2/1] [U_]

  md1 : active raid1 hda5[0] hdb5[1]
        5863616 blocks [2/2] [UU]

  md0 : active raid1 hda3[1] hdb3[0]
        104320 blocks [2/2] [UU]

  unused devices: [none]

Et voici notre programme qui détecte un dysfonctionnement (en recherchant un caractère de soulignement dans ces lignes contenant « blocks »), puis active le clignotement de la diode Arrêt défilement en conséquence. Il s'exécutera sous la plupart des interpréteurs de commande (shells de type Bourne et a été étendu à la détection de deux conditions d'alarme supplémentaires. Vous pouvez les ajouter si elles vous conviennent.

  #!/bin/sh
  # ledblink      System monitor. Scroll-lock light will remain on if any faults.
  #               Graham Jenkins, IBM GSA, July 2003.

PATH=/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin
On=1
while : ; do                                    		# Utilisez 'blinker' s'il fonctionne,
  blinker -d `expr $On \* 1000` s 2>/dev/null ||		# sinon utilisez 'xset' pour faire clignoter
      ( xset led 3 && sleep $On && xset -led 3 )  	# le témoin Arrêt-défilement.
  sleep `expr 10 - $On`
  On=10                                         		# Règle le temps d'allumage sur 10 secondes.
  #
  # Raid status
  grep blocks /proc/mdstat | grep _ >/dev/null 2>&1                && continue
  #
  # Filesystem capacity
  df -x iso9660 |tr -d '%'|awk '{if (NR > 1) if ($5 > 90) exit 1}' || continue
  #
  # Swap usage
  swapon -s | awk '{ if (NR > 1) { Size=Size+$3; Used=Used+$4 } }
               END { if (Used*100/Size > 70 ) exit 1            }' || continue
  #
  On=1                                          		# S'il n'y a pas de problèmes

done                                            		# réinitialisez le temps d'allumage à 1 seconde.

6. Mise en route

Si vous êtes satisfait du fonctionnement de ledblink uniquement lorsque quelqu'un a ouvert une session Xwindow, c'est facile. Si votre machine a un répertoire xinitrc.d, ajoutez-y le script suivant. Sinon, placez la ligne non commentée dans le fichier xinitrc.

#!/bin/sh
# ledblink      Placez ce fichier dans : /usr/X11R6/lib/X11/xinit/xinitrc.d
#               and rendez le lisible et executable pour tout un chacun.
[ -x /usr/local/bin/ledblink ] && /usr/local/bin/ledblink &

Si vous avez le programme blinker, vous pouvez démarrer ledblink au moment de l'amorçage avec le script suivant.

#!/bin/sh
# ledblink      Start/stop the 'ledblink' system monitor program.
#               Graham Jenkins, IBM GSA, July 2003.
#
# chkconfig: 2345 98 7
# description :: démarre/arrête le programme 'ledblink' de surveillance système.

case "$1" in
start) if [ -x /usr/local/bin/ledblink ] ; then
         [ -s /var/run/ledblink.pid ] && exit 0
         echo "Demarrage du programme 'ledblink' de surveillance système .."
         /usr/local/bin/ledblink &          echo $! >/var/run/ledblink.pid
       fi ;;
stop)  if [ -n "`cat /var/run/ledblink.pid`" ] ; then
         echo "Arrêt du programme 'ledblink' de surveilllance système .."
         kill `cat /var/run/ledblink.pid`
         rm        /var/run/ledblink.pid
       fi ;;
esac

Graham est un spécialiste d'Unix chez IBM Global Services, en Australie. Il vit à Melbourne, et a construit et administré un grand nombre de variantes de systèmes libres et propriétaires sur différentes plates-formes matérielles.

Copyright © 2003, Graham Jenkins.

Copying license http://www.linuxgazette.com/copying.html

Paru dans le n°93 de la Linux Gazette d'août 2003.

Traduction française par Régis Perdreau .

Relecture de la traduction française par Joëlle Cornavin .