Software RAID HOWTO (OpenBSD 3.4)


Bevor wir ans eingemachte gehen verschaffen wir uns einen kleinen 
Ueberblick ueber das was uns bevorsteht:

	* RAID Support in den Kernel kompilieren
	* Zusammenbauen eines RAID Install Sets
	* Installation und Konfiguration des RAID Systems
	* Durchführen verschiedener Tests mit RAID


---------------------------------------------------------------------------- 

Inhalt
  1.) Aktuelles Release besorgen
  2.) RAID Enabled Kernel bauen
  3.) Erstellen eines RAID Install Sets
  4.) Erstellen eines MINIMALEN RAID Install Sets
  5.) Installation eines minimalen Pre-RAID Systems
  6.) Erstellen des RAID Arrays
  7.) Partitionieren des RAID Arrays
  8.) OpenBSD auf dem RAID Array installieren
  9.) RAID Testing
 10.) RAID Installation Foto Gallery & Credits

---------------------------------------------------------------------------- 


 Wer sich die Schritte 1-4 sparen will und sich einfach ein ISO Image,
 welches das MINIMALE Raid Install Set und alle anderen Install Sets
 fuer OpenBSD 3.4 hat, herunterladen will, kann sich mein Image
 herunterladen: 

  * openbsd-3.4.raid.iso
  * openbsd-3.4.raid.iso.md5
  * openbsd-3.4.raid.iso.asc

 Das alles ist wie gewohnt auf eigene Gefahr zu benutzen. Ich
 uebernehme keine Verantwortung fuer entstandene Schaeden oder
 aehnliches.


************************************************************************
1.) Aktuelles Release besorgen
************************************************************************

  Seit OpenBSD 3.4 ist der RAID support endlich in der Release
  Distribution enthalten, man muss also nich -current verwenden. Man
  sollte sich also zu aller erst die neuesten Release Kernel Sourcen
  holen:       

  # export CVSROOT=anoncvs@anonvcs.pl.openbsd.org:/cvs
  # cd /usr
  # cvs co -rOPENBSD_3_4_BASE src/
  # cvs co -rOPENBSD_3_4_BASE XF4
  # cvs co -rOPENBSD_3_4_BASE ports/

  Am besten ist es wenn man eine offizielle CD gekauft hat denn da sind
  alle sources zum aktuellen Release drauf. 

************************************************************************
2.) RAID Support in den Kernel kompilieren:
************************************************************************
  # vi /usr/src/sys/arch/i386/conf/GENERIC 

  Folgende Optionen muessen unbedingt aktiviert werden:
  ---------------------------------------------------------------------
  | option     RAID_AUTOCONFIG     # RAID autoconfiguration  
  | ...                                                               
  | pseudo-device   raid        4       # RAIDframe disk driver   
  --------------------------------------------------------------------- 
  Somit hat man nun das RAID Device -> raid0, raid1, ... und das RAID
  auto config welches es ermoeglicht das auch das '/' root filesystem auf
  dem RAID device liegt. Nun lassen wir die Maschine wieder etwas
  werken und kompilieren das ganze: 

  # cd /usr/src/sys/arch/i386/conf
  # /usr/sbin/config GENERIC
  # cd /usr/src/sys/arch/i386/compile/GENERIC
  # make clean && make depend && make

  ...
  
  # cd /usr/src/sys/arch/i386/compile/GENERIC
  # cp /bsd /bsd.old          (aktuelle version des kernels speichern)
  # cp bsd /bsd               (neuen Kernel nach '/' spielen)
  # reboot                    (hoffen das die Kiste wieder hochkommt ;-))

************************************************************************ 
3.) Zusammenbauen eines RAID Installsets:
************************************************************************ 
  Am einfachsten ist es sich hierzu folgende Verzeichnisse anzulegen
  damit man mehr oder weniger copy and paste betreiben kann ;-> 

  # mkdir /usr/new-release
  # mkdir /usr/new-root

  Nun gibt es ein nettes Script(credits go out to jross) welches man
  ganz easy anstarten kann und welches das aktuelle Release zusammenbaut und
  zwar schon mit unserem RAID Kernel:

 make_release.sh
-----------------------------------------------------------------------
| #!/bin/sh
| # Set up variables for configuration 
|
| MYRELEASEDIR=/usr/new-release
| MYDESTDIR=/usr/new-root
| SRCINSTALL=/usr/src
|
| export DESTDIR=$MYDESTDIR
| export RELEASEDIR=$MYRELEASEDIR
|
| # create crunch tools
| cd $SRCINSTALL/distrib/crunch
| make clean && make && make install 
|
| # clean out DESTDIR
| rm -rf $DESTDIR/* 
|
| # make release
| cd $SRCINSTALL/etc && nice make release
| if [ $? != 0 ]; then
|     echo Make release failed > /tmp/release_failed
| exit
| fi
|
| # check release
| cd $SRCINSTALL/distrib/sets && sh checkflist
-----------------------------------------------------------------------
 
 Nachdem man dieses script gestartet hat kann man mal gemuetlich einen
 Tee trinken gehen :-).

 Nun haben wir das STANDARD Release Install Set mit einem RAID
 faehigen Kernel, aber was wir wollen ist ein MINIMALES RAID Install 
 set welches wir uns aus dem STANDARD Install Set 'backen' werden.

************************************************************************
4.) Erstellen eines MINIMALEN RAID Installsets:
************************************************************************

 D.h. wir wollen uns ein site34.tgz basteln welches uns dann bei der
 Installation von unserem selbstgedrehten OpenBSD als Install Set
 dienen soll.

 Dazu brauchen wir zu allererst ein paar exports um die Sache etwas
 einfacher zu gestalten:

 # export MYRELEASEDIR=/usr/new-release
 # export MYBUILDDIR=/usr/new-minimal-package
 # export MYRAIDRELEASE=/usr/new-raid-release
 # export MYRAIDKERNEL=/usr/src/sys/arch/i386/compile/GENERIC/bsd

 - In MYRELEASEDIR befindet sich das Snapshot, CD-Release oder
   SRC-build Release. 

 - In MYBUILDDIR werden wir unser minimales Release basteln.

 - In MYRAIDRELEASE werden wir das tgz komprimiert build reingeben.

 - In MYRAIDKERNEL befindet sich unser RAID Kernel.

* Erstellen wir das Build Directory:

 # mkdir -p $MYBUILDDIR
 # cd $MYBUILDDIR

* Nun extrahieren wir die Files fuer den Build:

 # tar xvzfp $MYRELEASEDIR/etc34.tgz './etc/*'
 # tar xvzfp $MYRELEASEDIR/base34.tgz \
 './bin/*' '*/ex' '*/MAKEDEV' '*zoneinfo*' '*/vi' '*/raidc*' \
 '*/find' ./usr/bin/reset ./usr/bin/tset */ld.so */libcurses.so* \ 
 */libc.so* */libterm* */termcap* */terminfo* */chroot \
 *libexec/getty '*/mtree' */slog* *bin/ssh* \ */mdec/* './var/*' \
 '*/encrypt' '*/pwd_mkdb*' ./sbin/ancontrol ./sbin/chown \
 ./sbin/dhclient ./sbin/dhclient-script ./sbin/disklabel \ 
 ./sbin/dmesg ./sbin/fdisk ./sbin/fsck* ./sbin/halt \ 
 ./sbin/ifconfig ./sbin/init ./sbin/kbd ./sbin/mkfifo \
 ./sbin/mknod ./sbin/mount* ./sbin/newfs ./sbin/ping \
 */libcrypto.so* */libkrb5.so* */crontab */egrep */fgrep */compress \ 
 *bin/ftp */grep */gunzip */gzcat */gzip */less */more \ 
 */rsh */sed *bin/sysc* './sbin/route' './sbin/ttyflags' \
 './sbin/swapctl' 

  ... das ganze ist etwas aufgesplittet ...

 # tar xvzfp $MYRELEASEDIR/base34.tgz \
 './bin/*' '*/ex' '*/MAKEDEV' '*zoneinfo*' '*/vi' '*/raidc*' \ 
 '*/find' ./usr/bin/reset ./usr/bin/tset */ld.so */libcurses.so* \
 */libc.so* */libterm* */termcap* */terminfo* */chroot  \
 *libexec/getty '*/mtree' */slog* *bin/ssh* */mdec/* './var/*' \
 '*/encrypt' '*/pwd_mkdb*' ./sbin/ancontrol ./sbin/chown \
 ./sbin/dhclient ./sbin/dhclient-script ./sbin/disklabel \
 ./sbin/dmesg ./sbin/fdisk ./sbin/fsck*  ./sbin/halt ./sbin/ifconfig \ 
 ./sbin/init ./sbin/kbd ./sbin/mkfifo ./sbin/mknod ./sbin/mount* \
 ./sbin/newfs ./sbin/ping */libcrypto.so* */libkrb5.so* */crontab \ 
 */egrep */fgrep */compress *bin/ftp */grep */gunzip */gzcat */gzip \
 */less */more */rsh */sed *bin/sysc* './sbin/route' \
 './sbin/ttyflags' './sbin/swapctl'

 ...

 # tar xvzfp $MYRELEASEDIR/base34.tgz \
 './usr/sbin/kvm_mkdb' './usr/sbin/dev_mkdb' './usr/bin/mktemp' \ 
 './usr/bin/install' './usr/sbin/syslogd' './usr/bin/wc' \ 
 './sbin/savecore' './sbin/quotacheck' './usr/sbin/quotaoff' \
 './usr/sbin/quotaon' './usr/bin/cmp' './sbin/ccdconfig' \
 './usr/sbin/inetd' '*/libz.so*' './usr/sbin/cron' '*/libwrap.so*' \ 
 './usr/lib/libutil.so*' './usr/lib/libkrb5.so*' './usr/lib/libas*' \ 
 './usr/lib/libcom_err.so*' './usr/lib/libdes.so*' \ 
 './usr/libexec/auth/login_*' './usr/bin/login' '*/libedit.*' \
 './sbin/umount' 


 ... weiters wollen wir noch ssh, ftp und andere nuetzliche Sachen auf
 unserem MINIMALEN Release haben:

 # tar xvzfp $MYRELEASEDIR/base34.tgz \
 './usr/bin/scp' './usr/libexec/sftp-server' './usr/bin/ftp' \
 './usr/lib/libgssapi.so*'\ './usr/bin/which' './usr/bin/touch' \
 './usr/bin/logname' './usr/bin/whoami' './usr/bin/du' \
 './usr/bin/id' './usr/bin/whereis'  

 ...nun kopieren wir unseren RAID enabled Kernel an den richtigen
 Platz:

  # cp $MYRAIDKERNEL ./bsd

* Bevor wir weitermachen koennen brauchen wir einige Directories und
  Files damit das System problemlos und ohne etwaige Fehlermeldungen
  laeuft: 

 # mkdir ./usr/local
 # rm -rf ./var/www
 # mkdir ./tmp
 # mkdir ./root

 # touch ./var/log/messages \
   touch ./var/log/authlog \
   touch ./var/log/secure \
   touch ./var/cron/log \
   touch ./var/log/daemon \
   touch ./var/log/xferlog \
   touch ./var/log/lpd-errs \
   touch ./var/log/maillog

* Nun fehlen uns noch einige Config Files:

 Wir brauchen eine dummy ./etc/rc.conf.local...

-----------------------------------------------------------------------
| #!/bin/sh -
| #
| sendmail_flags=NO
| check_quotas=NO   # NO may be desirable in some YP environments
| ntpd=NO           # run ntpd if it exists
-----------------------------------------------------------------------


  Ein ./root/.profile wird ebenfalls benoetigt:
-----------------------------------------------------------------------
| # $OpenBSD: dot.profile,v 1.3 2003/03/20 01:43:31 david Exp $
| #
| # sh/ksh initialization
|
| PATH=/sbin:/usr/sbin:/bin:/usr/bin
| export PATH
| HOME=/root
| export HOME
| umask 022
|
| alias ll='ls -al'
| export TERM=vt220
|
| if [ -x /usr/bin/tset ]; then
|      eval `/usr/bin/tset -sQ \?$TERM`
| fi
-----------------------------------------------------------------------

 Das ./root/.login nicht vergessen:
-----------------------------------------------------------------------
| # $OpenBSD: dot.login,v 1.9 2003/03/20 01:43:31 david Exp $
| #
| # csh login file
|
| set tterm='?'$TERM
| set noglob
| onintr finish
| eval `tset -s -Q $tterm`
| finish:
| unset noglob
| unset tterm
| onintr
|
| if ( `logname` == `whoami` ) then
|       echo "Don't login as root, use su"
| endif
-----------------------------------------------------------------------


 Nun erstellen wir ein ./root/raid0.conf file nach 'man 8 raidctl'. In 
 diesem Fall machen wir ein RAID 1 (Mirror):
-----------------------------------------------------------------------
| START array
| # numRow numCol numSpare
| 1 2 0
|
| START disks
| /dev/wd0d
| /dev/wd1d
|
| START layout
| # sectPerSU SUsPerParityUnit SUsPerReconUnit RAID_level_1
| 128 1 1 1
|
| START queue
| fifo 100
-----------------------------------------------------------------------

* Hoi ;->, nun koennen wir endlich unseren Release tarball packen:

 # tar -czf $MYRAIDRELEASE/site34.tgz *

 Nun schaufeln wir noch ein wenig hin und her ;->

 # cp $MYRELEASEDIR/* $MYRAIDRELEASE/

 Erstellen wir noch ganz flott ein ISO Image:

 # cd $MYRAIDRELEASE
 # mkisofs -l -L -v -r -T -V "OpenBSD-3.4" -A "OpenBSD 3.4-Raid \
 INSTALL SET" -b cdrom34.fs -c boot.catalog -o openbsd-3.4.raid.iso \
 -x openbsd-3.4.raid.iso *

 ...leere CD-R ins Brenner Laufwerk legen und los gehts:

 # cdrecord dev=/dev/cd1c  speed=8 openbsd-3.4.raid.iso

************************************************************************
5.)  Installation eines minimalen Pre-RAID Systems:
************************************************************************

  OK. Nun wirds spannend! In meiner Test Konfiguration habe ich 2 IDE
  Platten wd0 und wd1 zur Verguegung. Zuerst werden wir auf wd0 und
  wd1 unser minimal System installieren und sicherstellen dass dieses
  sowohl won wd0 als auch von wd1 bootet, dann werden wir unser RAID 1
  auf den Rest von wd0 und wd1, welches dann logisch als raid0
  erscheinen wird, spielen.

* Partitionieren wir also mal wd0:

 Wir werden eine 50m grosse 'a' Partition und eine kleine 32m [swap]
 Partition erstellen. Der Rest wird als RAID partitioniert:

--------------------------------------------------------------------
 Partition   FS-TYPE  Mount Point                  Size
 wd0a	    4.2BSD          /                            50M
 wd0b	    swap	    swap                       32M
 wd0c	    unused        [reserved]	
 wd0d	 --> RAID <--	  [none]                        *
--------------------------------------------------------------------
 ...nun noch schnell disklabeln....
--------------------------------------------------------------------
 > a a
offset: [63]
size: [ ... ] 50m
Rounding to nearest cylinder: xxxxx
FS type: [4.2BSD]
mount point: [none] /
> a b
offset: [ ... ]
size: [ ... ] 32m
Rounding to nearest cylinder: xxxxx
FS type: [swap]
> a d
offset: [ ... ]
size: [ ... ]
FS type: [4.2BSD] RAID
mount point: [none]
> w
> q
--------------------------------------------------------------------

 ...wenn die Installation so weit fortgeschritten ist dass man zum
 installieren der Sets kommt, dann sollte man '(c)drom' waehlen. Wenn 
 man dann nach dem 'mount point' fuer die Install Sets gefragt wir
 einfach '/' eingeben und man sollte folgendes zur auswahl haben:

--------------------------------------------------------------------

  The following sets are available. Enter a filename, 'all' to select
  all the sets, or 'done'. You may de-select a set by prepending a '-'
  to its name.

          [X] bsd
          [ ] bsd.rd
          [ ] base34.tgz
          [ ] etc34.tgz
          [ ] misc34.tgz
          [ ] comp34.tgz
          [ ] man34.tgz
          [ ] game34.tgz
          [X] site34.tgz

--------------------------------------------------------------------
 
 ...OK, wir wollen in diesem Fall echt NUR 'bsd' und unser minimales
 Set 'site34.tgz' installieren.

 Nach der Installation sollte man den Rechner neu starten und
 probieren sich mit SSH einzuloggen. Wenn alles geklappt hat kann man 
 mal verschnaufen, einen Kaffee trinken und auf zu neuen taten
 schreiten  :-> 

 Bis jetzt haben wir das 2 Laufwerk wd1 noch nicht angeruehrt was wir
 nun aber schleunigst tun werden: 

 # disklabel wd0 > /root/disklabel.wd0
 # cp /root/disklabel.wd0 /root/disklabel.wd1
 # vi /root/disklabel.wd1

 In '/root/disklabel.wd1' muessen wir folgenden Eintrag noch
 abaendern:  

 # /dev/rwd0c:  
  wird zu ...
 # /dev/rwd1c:

 Jetzt koennen wir endlich das zweite Laufwerk gemuetlich mit fdisk
 und disklabel bearbeiten:

 # fdisk -i wd1
 # disklabel -R -r wd1 /root/disklabel.wd1

 Unser zweites Laufwerk ist nun partitioniert und braucht ein neues
 Filesystem: 

 # newfs /dev/wd1a

 Nun muessen wir dafuer sorgen dass 'wd1a' genauso aussieht wie 'wd0a' 
 damit im Fall der Faelle - z.B. Head Crash auf 'wd0' - das System von 
 der anderen Platte, in unserem Fall 'wd1', booten kann. Dazu kopieren
 wir '/' von 'wd0a' auf 'wd1a':

 # mkdir /mnt
 # mount /dev/wd1a /mnt

 # cd /
 # pax -r -w -p e -v bin boot bsd dev etc root sbin tmp usr var /mnt/

 Nun muessen wir nur mehr das zweite Laufwerk bootable machen:

 # cp /usr/mdec/boot /mnt/boot
 # /usr/mdec/installboot -v /mnt/boot /usr/mdec/biosboot wd1

 Man muss nun eigentlich nur mehr in '/mnt/etc/fstab' folgende Zeile
 aendern: 

 # /dev/wd0a / ffs rw 1 1
   wird zu ...
 # /dev/wd1a / ffs rw 1 1

 Das funktioniert ganz toll so lange das erste IDE Laufwerk wd0 vom
 System erkannt wird. Sollte 'wd0' aber total ausfallen wird das System
 'wd1' - obwohl es am zweiten Kontroller haengt - als 'wd0' starten.

 Nun sollte man testen ob man auch wirklich von der anderen Platte
 booten kann. Dazu gibt man am boot prompt z.B. folgende Zeile ein:

 boot > boot hd1a:/bsd

************************************************************************
6.) Erstellen des RAID Arrays
************************************************************************

 Bevor wir nun endlich mit dem erstellen des RAID Arrays beginnen
 sollte man sich noch einmal die man page zu 'raidctl(8)' durchlesen! 

 Wir haben in unserem minimalen RAID Install Set eine Konfigurations 
 Datei fuer RAID 1 beigefuegt - '/root/raid0.conf' - welche wir nun
 heranziehen werden:

 # raidctl -C /root/raid0.conf raid0

 Das RAID Array braucht auch eine ID, in unserem Beispiel '100':

 # raidctl -I 100 raid0

 Nun muss man das parity set initialisieren:

 # raidctl -iv raid0 

 Falls man einen Fehler gemacht haben sollte kann man das 'raid0'
 jederzeit mit ...

 # raidctl -u raid0

 ...deconfiguren.

************************************************************************
7.) Partitionieren des RAID Arrays
************************************************************************

 Der Befehl 'raidctl -iv raid0' kann schon etwas Zeit in Anspruch
 nehmen und wenn alles gut gegangen ist koennen wir unser RAID Array 
 partitionieren: 

 # disklabel -E raid0

--------------------------------------------------------------------- 
   Partition         Mount Point	
    raid0a               /	
    raid0b		swap
    raid0c	      [reserved]	
    raid0d	        /tmp	
    raid0e	        /var	
    raid0f		/usr	
    raid0h		/home
--------------------------------------------------------------------- 

 Ein Filesystem wird noch benoetigt:
 
 # newfs raid0a; newfs raid0d; newfs raid0e; newfs raid0f; \ 
   newfs raid0h

 Nun muessen wir nur mehr 'auto-configuration' einschalten:

 # raidctl -A yes raid0

************************************************************************
8.) OpenBSD auf dem RAID Array installieren:
************************************************************************

 Auf unserer RAID enabled Installations CD haben wir alle Install Sets
 drauf welche nun nur mehr an die richtige Stelle entpackt werden
 muessen: 

 Mounten der RAID Partitions:

 # cd /mnt
 # mount /dev/raid0a /mnt

 In unserem 'root' Verzeichniss welches jetzt in '/mnt' liegt sollten
 folgende Ordner erstellt werden:

 # mkdir ./usr
 # mkdir ./tmp
 # mkdir ./var
 # mkdir ./home

 Endlich kann man alles mounten:

 # mount /dev/raid0d /mnt/tmp
 # mount /dev/raid0e /mnt/var
 # mount /dev/raid0f /mnt/usr
 # mount /dev/raid0h /mnt/home

 Jetzt werden noch die Release Files bzw. Install Sets an den
 richtigen Orten entpackt:

 # mkdir /cdrom
 # mount /dev/cd0a /cdrom
 # cd /mnt 
 # tar -zxvpf ./cdrom/etc34.tgz
 # tar -zxvpf ./cdrom/base34.tgz
 # tar -zxvpf ./cdrom/comp34.tgz
 # tar -zxvpf ./cdrom/man34.tgz 

 Einige Config files muessen noch auf unsere 'root' Partition von
 unserem RAID System:

 # cd /
 # pax -r -w -p e -v dev boot bsd* /mnt/
 # cd /etc
 # cp -p fstab my* hostname.* hosts kbdtype resolv.conf dhc* /mnt/etc/

 Die mount points in '/mnt/etc/fstab' muessen noch angepasst werden:

[/mnt/etc/fstab]
----------------------------------------------
 /dev/raid0a /     ffs rw 1 1
 /dev/raid0d /tmp  ffs rw 1 1
 /dev/raid0e /var  ffs rw 1 1
 /dev/raid0f /usr  ffs rw 1 1
 /dev/raid0h /home ffs rw 1 1
----------------------------------------------

 Ein root passwort wird noch benoetigt:

 # /mnt/usr/sbin/chroot /mnt
 # passwd
 # exit

 Endlich koennen wir unsere RAID Configuration abschliessen in dem wir
 mit dem Befehl:

 # raidctl -A root raid0

 ...dem System mitteilen dass 'raid0' nun unsere root Partition
 beinhaltet. 

 Um dies wieder rueckgaengig zu machen kann man folgenden Befehl
 verwenden: 

 # raidctl -A yes raid0

 Nun muessen wir dem System noch sagen dass 'raid0' ready for
 auto-configuration ist indem wir unser '/etc/raid0.conf' file nach
 /etc kopieren(dies muss man auf 'wd0a' und 'wd1a' machen!!):

 # cp /root/raid0.conf /etc/raid0.conf

 Dadurch wird das 'raid0' device automatisch von den rc scripts
 aktiviert. 

 SOOOO :-> nun endlich koennen wir das System neu starten und hoffen
 das alles geklappt hat.

************************************************************************
9.) Testen des RAID
************************************************************************

  Um herauszufinden ob wir uns nach dem Reboot echt am RAID device
  befinden muss man nur schnell mal 'dmesg' aufrufen. Dort sollten
  ungefaehr folgende Zeilen enthalten sein:
  ----------------------------------------------------------------
  [...]
  Kernelized RAIDframe activated
  [...]
  raid0 (root): (RAID Level 1) total number of sectors is 73400448 \ 
  (35840 MB) as root 
  dkcsum: wd0 matched BIOS disk 80
  dkcsum: wd1 matched BIOS disk 81
  rootdev=0x1300 rrootdev=0x3600 rawdev=0x3602  
  [...]
  ----------------------------------------------------------------
  Ein 'df -h' bestaetigt das ganze auch:
  ----------------------------------------------------------------
  # /home/igor $df -h
   Filesystem    Size   Used  Avail Capacity  Mounted on
   /dev/raid0a  1006M  34.3M   921M     4%    /
   /dev/raid0h  13.8G   332M  12.8G     2%    /home
   /dev/raid0d  1006M   5.9M   950M     1%    /tmp
   /dev/raid0f   3.9G   2.1G   1.6G    56%    /usr
   /dev/raid0e  13.8G   1.3G  11.8G    10%    /var
  ----------------------------------------------------------------

 * Nun koennen wir endlich einige RAID Szenarios testen:

 - Wir werden als erstes physisch 'wd1' entfernen und dan schauen ob
 immer noch das 'raid0' device gebootet wird:
----------------------------------------------------------------
 # raidctl -s raid0                                                                          
 raid0 Components:
           /dev/wd0d: optimal
          component1: failed  <---- wd1 Platte FAILED
 No spares.
 Parity status: clean
 Reconstruction is 100% complete.
 Parity Re-write is 100% complete.
 Copyback is 100% complete.
----------------------------------------------------------------
 
 Nun, sehen wir das man das 'raid0' device auch dann booten kann wenn
 eine Platte komplett ausgefallen ist. Haengen wir die Platte wieder
 an und schauen wir wie sich das System verhaelt:

----------------------------------------------------------------
 # halt -p

 [...shutdown des Systems...neustart...]


 # raidctl -s raid0 
 raid0 Components:
           /dev/wd0d: optimal
           /dev/wd1d: failed
 No spares.
 Parity status: clean
 Reconstruction is 100% complete.
 Parity Re-write is 100% complete.
 Copyback is 100% complete.
 # raidctl -P raid0                                                                          
 raid0: Parity status: clean
----------------------------------------------------------------
 Das System hat sich also genauso Verhalten wie es dies tun sollte
 aber da wir die 2. Platte nur disconnected haben und keine Schreib
 oder lese Operationen ausgefuehrt haben, hatte RAID in diesem Fall
 nicht viel zu tun. Waere nun wirklich etwas schief gegangen auf
 unserer zweiten Platte dann muesste man die zweite Platte quasi
 'rebuilden'. Folgende Kommandos waeren dazu noetig:

  # raidctl -R /dev/wd1d raid0

 - Probieren wir nun ein FORCED FAIL um die ganze Sache etwas
 spannender zu machen:

----------------------------------------------------------------
 # raidctl -F /dev/wd1d raid0  
 # Feb  9 05:20:05 backup /bsd: raid0: Failing disk r0 c1. 
 Feb  9 05:20:05 backup /bsd: raid0: Failing disk r0 c1.
 Feb  9 05:20:05 backup /bsd: Unable to reconstruct disk at row 0 / 
 col 1 because no spares are available. 
 Feb  9 05:20:05 backup /bsd: Unable to reconstruct disk at row 0 /
 col 1 because no spares are available. 
----------------------------------------------------------------
 
 Hmmm, das ist zwar etwas unerwartet aber eigentlich auch korrekt so,
 da wir kein HOT SPARE in userer 'raid0.conf' definiert haben. Damit
 dieses Commando werkt brauchen wir also wirklich ein SPARE damit das
 FORCED FAIL und der RECONSTRUCT Prozess funkt. 


 - FORCED RECONSTRUCTION 

 Schauen wir mal ob dieser Befehl in einer ECHT Umgebung auch funken
 wuerde. Rekonstruieren wir also '/dev/wd1d':


 # raidctl -R /dev/wd1d raid0

 Nachdem man diesen Befehl abgesetzt hat kann man sich auf einer
 weiteren Konsole davon uberzeugen dass ein Reconstruction run laeuft: 

----------------------------------------------------------------

 # raidctl -s raid0                                                             
 raid0 Components:
           /dev/wd0d: optimal
           /dev/wd1d: reconstructing  <---
 No spares.
 Parity status: clean
 Reconstruction is 5% complete.
 Parity Re-write is 100% complete.
 Copyback is 100% complete.
----------------------------------------------------------------

 ...und hier nochmal mit allen Meldungen...

----------------------------------------------------------------
# raidctl -R /dev/wd1d raid0
Feb  9 05:23:55 backup /bsd: RECON: Initiating in-place reconstruction on
Feb  9 05:23:55 backup /bsd:        row 0 col 1 -> spare at row 0 col 1.
Feb  9 05:23:55 backup /bsd: Quiescence reached...
Feb  9 05:44:42 backup /bsd: Quiescence reached...
Feb  9 05:44:42 backup /bsd: Number of I/Os:             55
Feb  9 05:44:42 backup /bsd: Elapsed time (us):          1247403180
Feb  9 05:44:42 backup /bsd: User I/Os per second:       0
Feb  9 05:44:42 backup /bsd: Average user response time: 0 us
Feb  9 05:44:42 backup /bsd: Total sectors moved:        1504
Feb  9 05:44:42 backup /bsd: Average access size (sect): 27
Feb  9 05:44:42 backup /bsd: Achieved data rate:         0.0 MB/sec
Feb  9 05:44:42 backup /bsd: Reconstruction of disk at row 0 col 1 \ 
                        completed. 
Feb  9 05:44:42 backup /bsd: Recon time was 1247.393404 seconds, \
                        accumulated XOR time was 0 us (0.f4f4f4). 
Feb  9 05:44:42 backup /bsd:   (start time 1076329435 sec 63067 usec,\
                        end time 1076330682 sec 456471 usec) 
Feb  9 05:44:42 backup /bsd: Total head-sep stall count was 0. 
Feb  9 05:44:42 backup /bsd: RAIDframe: 939473 recon event waits, 0 \ 
                        recon delays. 
Feb  9 05:44:42 backup /bsd: RAIDframe: 939473 recon event wait
----------------------------------------------------------------

 Nach der Reconstruction sieht die Situation dann wieder wie gewohnt
 aus :-> 

----------------------------------------------------------------
 # raidctl -s raid0           
 raid0 Components:
           /dev/wd0d: optimal
           /dev/wd1d: optimal
 No spares.
 Parity status: clean
 Reconstruction is 100% complete.
 Parity Re-write is 100% complete.
 Copyback is 100% complete.
----------------------------------------------------------------

************************************************************************
10.)  RAID Installation Foto Gallery & Credits
************************************************************************
 
 Ich habe auch eine kleine Foto Doku waehrend der RAID Installation
 geschossen, viel spass beim anschauen :-> : 
 
  * RAID install Gallery

  Hier sind die Quellen die ich fuer das Schreiben dieses HOWTOs
  benuetzt habe:
 
  * http://www.nomoa.com/bsd/raid_ide.htm
  * http://www.abstrakt.ch/unix/MINI-HOWTO-openbsd-raid.html
  * man 8 raidctl
  * man 4 raid

--
 Igor