|
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 -----------------
Hosting by: hurra.com
Generated: 2007-01-26 17:56:22