Avanti Indietro Indice

8. Appendice A. - Lo shutdown per md0 di Bohumil Chalupa

Il post di Bohumil Chalupa sulla lista linux raid a proposito della soluzione del problema di mdstop per raid1 e 5. La sua soluzione non tiene conto della possibilità che il dispositivo raid venga corrotto allo shutdown. Così ho aggiunto un semplice confronto di stato effettuato al boot con un buono stato di riferimento. Questo permette all'operatore di intervenire se un disco nell'array ha dei problemi. Una descrizione di tutto ciò si trova nella parte principale di questo stesso documento.

> From: Bohumil Chalupa <bochal@apollo.karlov.mff.cuni.cz>
> Sono riuscito ad eseguire il boot di initrd e ad usare linuxrc per far
> partire l'array RAID1, per poi far diventare root /dev/md0.
>
> Non conosco, però, un modo per _fermare_ in modo pulito l'array.

Beh, dovrò rispondermi da solo :-)
 
> Date: Mon, 29 Dec 1997 02:21:38 -0600 (CST)
> From: Edward Welbon <welbon@bga.com>
> Subject: Re: smontare il dispositivo raid di root
> 
> Per dispositivi md diversi da raid0, lo stato che deve essere salvato
> è noto probabilmente solo una volta che tutte le operazioni di scrittura
> sono state completate. Un tale stato non può essere naturalmente salvato
> sulla directory root una volta montata in sola lettura. In tal caso, 
> dovresti poter montare un filesystem scrivibile "X" sul root in sola
> lettura e poter scrivere su "X" (ricordo di aver fatto una cosa del
> genere durante le operazioni di "recupero", ma non come procedura
> automatica) 
>
> Il filesystem "X" sarà presumibilmente un dispositivo di boot da cui
> il raid (durante l'esecuzione di linuxrc via initrd) prenderà il suo
> stato iniziale. Fortunatamente raid0 non deve scrivere nessuno stato
> (anche se sarebbe piacevole poter scrivere i checksum su mdtab dopo
> un mdstop). Giocherò un po' con queste cose che non sembrano troppo
> difficili, anche se il "diavolo" è sempre nei "dettagli".

Già, è così.
Ho già avuto questa idea, ma non ho avuto tempo per provare. L'ho
fatto ieri, e funziona.

Con il mio RAID1 (mirror), non salvo nessun dato di checksum o
superblock raid.  Salvo solo un'informazione sulla "vera" partizione
di boot, che il volume di root md è stato rimontato in sola lettura
durante lo shutdown. Poi, durante il boot, lo script linuxrc esegue
mkraid --only-superblock se trova questa informazione, altrimenti
esegue ckraid.  
Questo significa che le informazioni del superblock raid non vengono
aggiornate durante lo shutdown; sono aggiornate a tempo di boot.  Non
è una cosa molto pulita, temo, :-( ma funziona.

Uso Slackware e initrd.md di Edward Welbon per eseguire il boot del
dispositivo raid di root.  
Per quanto mi ricordo ora, gli unici file modificati sono mkdisk e
linuxrc, e lo script di shutdown /etc/rc.d/rc.6 E lilo.conf,
naturalmente.

Seguono le parti più importanti.

Bohumil Chalupa

--------------- segue mio.linuxrc  -----------------
#!/bin/sh
# ci serve /proc
/bin/mount /proc 
# avvia il dispositivo md0. Lascia fare il resto agli script /etc/rc.d
# Si dovrebbe fare il meno possibile qui
# ________________________________________
# shutdown test e ricreazione di root raid1 
# /start deve essere creato sull'immagine rd in my.mkdisk
echo "preparing md0: mounting /start"
/bin/mount /dev/sda2 /start -t ext2
echo "reading saved md0 state from /start"
if [ -f /start/root.raid.ok ]; then
 echo "raid ok, modyfying superblock"
 rm /start/root.raid.ok
 /sbin/mkraid /etc/raid1.conf -f --only-superblock
else
 echo "raid not clean, runing ckraid --fix"
 /sbin/ckraid --fix /etc/raid1.conf
fi
echo "unmounting /start"
/bin/umount /start
# _________________________________________
#
echo "adding md0 for root file system"
/sbin/mdadd /dev/md0 /dev/sda1 /dev/sdb1 
echo "starting md0"
/sbin/mdrun -p1 /dev/md0
# dì al kernel che vogliamo far diventare /dev/md0 il dispositivo di root
# arriviamo al valore 0x900 come 256*numero_di_dispositivo_major + numero_minor
echo "setting real-root-dev"
/bin/echo 0x900>/proc/sys/kernel/real-root-dev
#  smonta /proc in modo da poter deallocare il ram disk
echo "unmounting /proc"
/bin/umount /proc
/bin/echo "We are hopefully ready to mount /dev/md0 (major 9, minor 0) as
root"
exit
--------------- fine di mio.linuxrc ----------------------------------


----------- segue un estratto da /etc/rc.d/rc.6  -----------------
  # Disattiva lo swap poi smonta i file system locali.
  echo "Turning off swap."
  swapoff -a
  echo "Unmounting local file systems."
  umount -a -tnonfs
  # Non rimontare i volumi root UMSDOS:
  if [ ! "`mount | head -1 | cut -d ' ' -f 5`" = "umsdos" ]; then
    mount -n -o remount,ro /
  fi

  # Salva lo stato raid
  echo "Saving RAID state"
  /bin/mount -n /dev/sda2 /start -t ext2
  touch /start/root.raid.ok
  /bin/umount -n /start

-------------- fine dell'estratto da rc.6 ------------------------


------------------ segue una parte di mio.mkdisk ----------------------
#
#  adesso abbiamo un filesystem pronto da riempire, e dobbiamo metterci
#  alcune directory importanti. Ho avuto tantissimi guai finché non ho
#  creato un mtab intatto.  Nel mio caso, è conveniente sovrascrivere 
#  /etc/mdtab, in questo modo posso attivare md con un semplice
#  "/sbin/mdadd -ar" in 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: servono mkraid e ckraid
cp -a $ROOT/usr/sbin/mkraid $ROOT/usr/sbin/ckraid $MOUNTPNT/sbin
2>>cp.stderr 1>>cp.stdout
# ---------------------------------------------------------------------
#  sembra che init non funzioni se non ha utmp. Forse ci si può lavorare
#  molto. Non dirò qual è il vero problema 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
#
#  poiché voglio cambiare il punto di mount, ho bisogno di questo
#  nonostante avessi potuto fare un "mkdir /proc" in linuxrc.
#
mkdir $MOUNTPNT/proc
chmod 555 $MOUNTPNT/proc
#
#  ------------------------------------------------------
#  monteremo il vero dispositivo di boot in /start temporaneamente
#  per verificare lo stato del root raid salvato durante lo shutdown
#
mkdir $MOUNTPNT/start
#  -------------------------------------------------------
#
#  ci serve linuxrc  (dopo tutto, è il punto focale di questo esercizio).
#
if [ -x ./my.linuxrc ]; then
  cp -a ./my.linuxrc $MOUNTPNT/linuxrc
  chmod 777 $MOUNTPNT/linuxrc
else
   ln -s /bin/sh $MOUNTPNT/linuxrc
fi
#
----------------- fine di parte di mio.mkdisk -----------------


Avanti Indietro Indice