Voici le post de Bohumil Chalupa sur la liste Linux RAID concernant le contournement du problème de mdstop avec RAID 1 + 5. Sa solution ne considère pas la possibilité d'une corruption du périphérique RAID à l'extinction. J'ai donc ajouté une simple comparaison d'état avec un état de référence correct et connu au démarrage. Ceci permet à l'administrateur d'intervenir si quelque chose ne va pas bien avec un disque dans une matrice. La description de ceci est dans le corps principal de ce document.
(NdT : j'ai traduit le message parce qu'il est long et intéressant, celui en anglais se trouve bien évidemment dans la version d'origine de ce HOWTO.)
> From: Bohumil Chalupa <bochal@apollo.karlov.mff.cuni.cz>>> Je peux maintenant demarrer initrd et utiliser linuxrc pour demarrer> la matrice RAID 1, puis changer la racine en /dev/md0 avec succes.>> Je ne connais pas, cependant, de manière d'_arreter_ proprement la> matrice. Bon. Je dois repondre moi-meme :-)> Date: Mon, 29 Dec 1997 02:21:38 -0600 (CST)> From: Edward Welbon <welbon@bga.com>> Subject: Re: dismounting root raid device>> Pour les peripheriques md autres que RAID 0, il y a surement un etat> a sauvegarder qui n'est connu qu'une fois que toutes les ecritures> sont terminees. Un tel etat ne peut bien sur etre sauve a la racine> une fois qu'elle est montee en lecture seule. Dans ce cas, on> devrait pouvoir monter un systeme de fichiers "X" en ecriture sur la> racine en lecture seule et pouvoir ecrire sur "X" (je me rappelle> l'avoir fait pendant des operations de "secours", mais pas dans une> procedure automatisee).>> Le systeme de fichiers "X" serait je pense un peripherique de> demarrage a partir duquel le RAID (pendant l'execution de linuxrc à> travers initrd) irait prendre son etat initial. Heureusement RAID 0> ne demande pas d'ecrire un quelconque etat (bien qu'il serait utile> de pouvoir ecrire les sommes de vérification (checksums) dans mdtab> apres un mdstop). En fin de compte, je bricolerai ceci mais ca ne> parait pas difficile bien que le "diable" se trouve toujours dans> les "details". Oui, c'est ca. J'ai deja eu cette idee a l'esprit depuis quelques temps, mais je n'ai pas eu le temps de l'essayer. Je l'ai fait hier, et ca marche. Avec mon RAID 1 (miroir), je ne sauvegarde aucune somme de verification ni donnees de superblock RAID. Je ne sauvegarde une information que sur la partition de demarrage "reelle", celle sur laquelle le volume md racine etait remonte en lecture seule pendant l'extinction. Alors, pendant le demarrage, le script linuxrc lance mkraid --only-superblock quand il trouve cette information ; sinon, il lance ckraid. Ceci veut dire que l'information du superblock RAID n'est pas mise a jour pendant l'extinction ; elle est mise a jour au demarrage. Ce n'est pas tres propre, j'en ai peur, :-( mais ca fonctionne. J'utilise Slackware et initrd.md d'Edward Welbon pour demarrer le peripherique RAID a la racine. Autant que je puisse m'en souvenir, les seuls fichiers modifies sont mkdisk et linuxrc, et le script d'extinction /etc/rc.d/rc.6. Et lilo.conf, bien sur. J'annexe les parties importantes. Bohumil Chalupa --------------- mon.linuxrc suit ----------------- #!/bin/sh # nous avons besoin de /proc /bin/mount /proc # demarrer le périphérique md0. Laisser les scripts /etc/rc.d s'occuper du reste. Nous devrions en faire le moins possible ici. # ________________________________________ # test d'extinction du RAID 1 racine et recreation # /start doit etre cree sur l'image rd dans mon.mkdisk echo "preparation de md0: montage de /start" /bin/mount /dev/sda2 /start -t ext2 echo "lecture de l'etat sauvegarde de md0 dans /start" if [ -f /start/root.raid.ok ]; then echo "RAID ok, modification du superblock" rm /start/root.raid.ok /sbin/mkraid /etc/raid1.conf -f --only-superblock else echo "RAID pas propre, lancement de ckraid --fix" /sbin/ckraid --fix /etc/raid1.conf fi echo "demontage de /start" /bin/umount /start # _________________________________________ # echo "ajout de md0 pour le systeme de fichiers racine" /sbin/mdadd /dev/md0 /dev/sda1 /dev/sdb1 echo "lancement de md0" /sbin/mdrun -p1 /dev/md0 # dire au noyau que nous voulons passer /dev/md0 comme peripherique # racine, la valeur 0x900 vient de 256*numero_periph_majeur + # numero_periph_mineur. echo "mise en place du vrai-periph-racine (real-root-dev)" /bin/echo 0x900>/proc/sys/kernel/real-root-dev # demontage de /proc pour que le disque RAM puisse etre enleve de la # memoire echo "unmounting /proc" /bin/umount /proc /bin/echo "On peut normalement monter /dev/md0 (majeur 9, mineur 0) a la racine" exit --------------- fin de mon.linuxrc ---------------------------------- ----------- extrait de /etc/rc.d/rc.6 suit ----------------- # arreter la swap, puis demonter les systemes de fichiers locaux echo "Extinction de la swap." swapoff -a echo "Demontage des systemes de fichiers locaux." umount -a -tnonfs # Ne pas remonter les volumes UMSDOS racine : if [ ! "`mount | head -1 | cut -d ' ' -f 5`" = "umsdos" ]; then mount -n -o remount,ro / fi # Sauvegarder l'etat RAID echo "Sauvegarde de l'etat RAID" /bin/mount -n /dev/sda2 /start -t ext2 touch /start/root.raid.ok /bin/umount -n /start -------------- fin de l'extrait de rc.6 ------------------------ ------------------ une partie de mon.mkdisk suit ---------------------- # # maintenant que le systeme de fichiers est pret a etre rempli, nous # devons obtenir quelques repertoires importants. J'ai eu des # problemes sans fin jusqu'a ce que je cree un fichier mtab tout # neuf. Dans mon cas, il est pratique de recopier /etc/mdtab, de # cette maniere je peux activer md avec un simple "/sbin/mdadd -ar" # dans linuxrc. # cp -a $ROOT/etc $MOUNTPNT 2>cp.stderr 1>cp.stdout rm -rf $MOUNTPNT/etc/mtab rm -rf $MOUNTPNT/etc/ppp* rm -rf $MOUNTPNT/etc/termcap rm -rf $MOUNTPNT/etc/sendmail* rm -rf $MOUNTPNT/etc/rc.d rm -rf $MOUNTPNT/etc/dos* cp -a $ROOT/sbin $ROOT/dev $ROOT/lib $ROOT/bin $MOUNTPNT 2>>cp.stderr 1>>cp.stdout # _____________________________________________________________________ # RAID: aura besoin de mkraid et ckraid cp -a $ROOT/usr/sbin/mkraid $ROOT/usr/sbin/ckraid $MOUNTPNT/sbin 2>>cp.stderr 1>>cp.stdout # --------------------------------------------------------------------- # il semble qu'init ne voudra pas jouer sans utmp. on peut probablement # reduire ceci de beaucoup. aucune idee de ce que le vrai bug était 8-). # mkdir $MOUNTPNT/var $MOUNTPNT/var/log $MOUNTPNT/var/run $MOUNTPNT/initrd touch $MOUNTPNT/var/run/utmp $MOUNTPNT/etc/mtab chmod a+r $MOUNTPNT/var/run/utmp $MOUNTPNT/etc/mtab ln -s /var/run/utmp $MOUNTPNT/var/log/utmp ln -s /var/log/utmp $MOUNTPNT/etc/utmp ls -lstrd $MOUNTPNT/etc/utmp $MOUNTPNT/var/log/utmp $MOUNTPNT/var/run/utmp # # puisque je voulais changer le point de montage, j'avais besoin de # ceci bien que je suppose que j'aurais pu faire un "mkdir /proc" # dans linuxrc. # mkdir $MOUNTPNT/proc chmod 555 $MOUNTPNT/proc # # ------------------------------------------------------ # nous monterons le vrai peripherique de demarrage sur /start de # maniere temporaire pour verifier l'etat du RAID racine sauve au # moment de l'extinction # mkdir $MOUNTPNT/start # ------------------------------------------------------- # # besoin de linuxrc (c'est, apres tout, le but de l'exercice). # if [ -x ./my.linuxrc ]; then cp -a ./my.linuxrc $MOUNTPNT/linuxrc chmod 777 $MOUNTPNT/linuxrc else ln -s /bin/sh $MOUNTPNT/linuxrc fi # ----------------- fin de la partie de mon.mkdisk -----------------