Spiegeln der Boot Disk mit Solstice Disksuite (SDS)

Das folgende Dokument beruht im wesentlichen auf dem Artikel Mirroring A Boot Drive Using Solstice Disksuite   von John Richardson.
Solstice Disksuite ist ein Volumenmanager der mit Solaris ausgeliefert wird. Im Gegensatzt zum Vertitas Volumenmanager (VxVM) ist er einfach und übersichtlich zu konfigurieren. (hat natürlich auch nicht die Möglichkeiten von VxVM) Aber zum Spiegeln der Bootplatte ist es Das Tool meiner Wahl.
Unter Solaris 8 befinden sich die Pakte auf der zweiten CD "Solaris 8 Software 2 of 2" im Verzeichnis
/cdrom/cdrom0/Solaris_8/EA/products/DiskSuite_4.2.1/sparc/Packages
Unter Solaris 9 sind die Pakte auf der ersten CD "Solaris 9 Software 1 of 2"
Dort hinenwechseln und die Pakete mit pkgadd -d . einspielen. Aus Faulheitsgründen alle Pakete ausser die Japanese localization. Dringend braucht man nur die Kommandos SUNWmdu und die entsprechenden Treiber SUNWmdr, SUNWmdx

Wichtig  

Die Installationprozedur benötigt /usr/bin/bzcat. Kontrollieren ob es vorhanden ist, wenn nicht installieren (Paket SUNWbzip)

    root@mwt # pkgadd -d .        

The following packages are available:
  1  SUNWlvma     Solaris Volume Management API's
                  (sparc) 1.0,REV=2001.04.18.09.59
  2  SUNWlvmg     Solaris Volume Management Application
                  (sparc) 1.0,REV=2001.05.04.15.12
  3  SUNWlvmr     Solaris Volume Management (root)
                  (sparc) 1.0,REV=2001.04.18.09.59
  4  SUNWmdg      Solstice DiskSuite Tool
                  (sparc) 4.2.1,REV=1999.11.04.18.29
  5  SUNWmdja     Solstice DiskSuite Japanese localization
                  (sparc) 4.2.1,REV=1999.12.09.15.37
  6  SUNWmdnr     Solstice DiskSuite Log Daemon Configuration Files
                  (sparc) 4.2.1,REV=1999.11.04.18.29
  7  SUNWmdnu     Solstice DiskSuite Log Daemon
                  (sparc) 4.2.1,REV=1999.11.04.18.29
  8  SUNWmdr      Solstice DiskSuite Drivers
                  (sparc) 4.2.1,REV=1999.12.03.10.00
  9  SUNWmdu      Solstice DiskSuite Commands
                  (sparc) 4.2.1,REV=1999.11.04.18.29
 10  SUNWmdx      Solstice DiskSuite Drivers(64-bit)
                  (sparc) 4.2.1,REV=1999.11.04.18.29

Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: 1-4,6-10
    
Alle Fragen mit y beantworten und danach die Kiste booten. Bei Solaris 8 reicht ein "normaler" Reboot (shutdown -y -i6 -g0), bei Solaris 9 müssen neue Device einträge angelegt werden. reboot -- -r SDS benutzt die sogenannte "metadevice state database", die Informationen über die eigentliche Konfiguration und deren aktuellen Zustand enthält. Diese Datenbank sollte in einer eigenen Partition auf der Festplatte liegen. Deshalb lege ich bei Installation eines neuen Systems immer schon eine unbenutzte 10MB grosse Partition mit an. (Hier Slize 3).
Die Bootplatte sieht dann so aus:
Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm    3121 - 37429       16.49GB    (34309/0/0) 34583472
  1       swap    wu       0 -  3120        1.50GB    (3121/0/0)   3145968
  2     backup    wm       0 - 39532       19.00GB    (39533/0/0) 39849264
  3 unassigned    wm   37430 - 37450       10.34MB    (21/0/0)       21168
  4        var    wm   37451 - 39531        1.00GB    (2081/0/0)   2097648
  5 unassigned    wm       0                0         (0/0/0)            0
  6 unassigned    wm       0                0         (0/0/0)            0
  7 unassigned    wm       0                0         (0/0/0)            0
Es ist klar, wenn man die Bootplatte spiegeln will, sollte die Partitionstabelle beider Platten identisch sein. Das funktioniert mit folgendem Kommando:
root@mwt # prtvtoc /dev/rdsk/c0t0d0s2 | fmthard -s - /dev/rdsk/c0t1d0s2
fmthard:  New volume table of contents now in place.
In diesem Fall ist c0t0d0 die Bootplatte und c0t1d0 soll der Spiegel werden. Das solltest du bei deiner Installation genau überprüfen. fmthard hat keinen Sicherheitsmechanismus. Wenn du hier die falsche Platte nimmst....
Nun fängt die eigentliche Konfiguration von SDS an. Zuerst werden auf der vorhin angesprochenen Partition (Slize 3) mindestens zwei Kopien (aka. replicas) der Datenbank (aka metadevice state database) angelegt. Mittels:
root@mwt # metadb -a -f -c2 /dev/dsk/c0t0d0s3 /dev/dsk/c0t1d0s3
Dabei steht Nun können wir mit dem eigentlichen Spiegeln anfangen. Zuerst, etws ausfühlicher mit dem / Filesystem. Dazu werden sogenannte "metadevice" definiert.
root@mwt # metainit -f d10 1 1 c0t0d0s0
d10: Concat/Stripe is setup
Dabei steht Um es also einfach auszudrücken: Das Metadevice mit dem Namen d10 besteht aus der physikalischen Partition c0t0d0s0. Das selbe mit der zweiten Platte. Die Rootpartition heisst hier d20, den Schalter -f brauchen wir hier nicht.
root@mwt # metainit d20 1 1 c0t1d0s0    
d20: Concat/Stripe is setup
Jetzt bauen wir einen Spiegel mit Namen d30 der erstmal nur aus d10 besteht
root@mwt # metainit d30 -m d10      
d30: Mirror is setup
Als nächtes wird das soeben erstellte Metadevice in die /etc/vfstab eingetragen. Dazu gibt es ein eigenes Tool namens metaroot. metaroot sorgt gleichzeitig auch für den richtigen Eintrag in der /etc/systems.
 
/etc/vfstab vorher:
root@mwt # more /etc/vfstab
#device         device          mount           FS      fsck    mount   mount
#to mount       to fsck         point           type    pass    at boot options
#
fd      -       /dev/fd fd      -       no      -
/proc   -       /proc   proc    -       no      -
/dev/dsk/c0t0d0s1       -       -       swap    -       no      -
/dev/dsk/c0t0d0s0       /dev/rdsk/c0t0d0s0      /       ufs     1       no      -
/dev/dsk/c0t0d0s4       /dev/rdsk/c0t0d0s4      /var    ufs     1       no      -
swap    -       /tmp    tmpfs   -       yes     -
Ändern der /etc/vfstab
root@mwt # metaroot d30
/etc/vfstab nachher:
root@mwt # more /etc/vfstab
#device         device          mount           FS      fsck    mount   mount
#to mount       to fsck         point           type    pass    at boot options
#
fd      -       /dev/fd fd      -       no      -
/proc   -       /proc   proc    -       no      -
/dev/dsk/c0t0d0s1       -       -       swap    -       no      -
/dev/md/dsk/d30 /dev/md/rdsk/d30        /       ufs     1       no      -
/dev/dsk/c0t0d0s4       /dev/rdsk/c0t0d0s4      /var    ufs     1       no      -
swap    -       /tmp    tmpfs   -       yes     -
Gut und jetzt die Metadevice für die anderen Partitionen auch anlegen:
Swap Filsystem
root@mwt # metainit -f d11 1 1 c0t0d0s1
d11: Concat/Stripe is setup
root@mwt # metainit d21 1 1 c0t1d0s1
d21: Concat/Stripe is setup
root@mwt # metainit d31 -m d11         
d31: Mirror is setup
/var Filsystem
root@mwt # metainit -f d14 1 1 c0t0d0s4 
d14: Concat/Stripe is setup
root@mwt # metainit d24 1 1 c0t1d0s4   
d24: Concat/Stripe is setup
root@mwt # metainit d34 -m d14         
d34: Mirror is setup
Nun werden von Hand (igitt :-) die neuen Metadevice in die /etc/vfstab geändert. Sie sollten dann so aussehen:
root@mwt # more /etc/vfstab
#device         device          mount           FS      fsck    mount   mount
#to mount       to fsck         point           type    pass    at boot options
#
fd      -       /dev/fd fd      -       no      -
/proc   -       /proc   proc    -       no      -
/dev/md/dsk/d31 -       -       swap    -       no      -
/dev/md/dsk/d30 /dev/md/rdsk/d30        /       ufs     1       no      -
/dev/md/dsk/d34 /dev/md/rdsk/d34        /var    ufs     1       no      -
swap    -       /tmp    tmpfs   -       yes     -
An der Stelle noch mal ein Wort warum ich zum Bootplattenspiegeln lieber SDS anstelle von VxVM nehme. Natürlich hast du dir vorher die /etc/vfstab gesichert.(= ohne SDS Einträge). Falls Du irgendwann später mal Probleme mit den SDS Treibern bekommen solltest, einfach diese Datei wieder einspielen, neu booten und schon hast Du ein normales System. Mach das mal mit VxVM :-)
 
Weiter mit der Installation. Es gibt noch einen Schönheitsfehler. Wenn du die Kiste jetzt bootest dann erscheint während des bootens folgende Fehlermeldung
WARNING: forceload of misc/md_hotspares failed"
Das kann man ignorieren oder einfach einen leeren Hotsparepool einrichten
root@mwt # metainit hsp001
hsp001: Hotspare pool is setup
Jetzt musst kannst du die Kiste rebooten, und wenn du keinen Fehler gemacht hast dann kommt Sie auch wieder hoch. Leider kommen immer noch zwei Fehlermeldungen, die man aber ignorieren kann. Hat jemand eine Idee wie man die wegbekommt ?
WARNING: forceload of misc/md_trans failed
WARNING: forceload of misc/md_raid failed
Nun wird die zweite Platte zu dem Spiegel hinzugefügt.
root@mwt # metattach d34 d24
d34: submirror d24 is attached
root@mwt # metattach d31 d21
d31: submirror d21 is attached
root@mwt # metattach d30 d20
d30: submirror d20 is attached
Mit dem Kommando metastat kann man sich den Status aller Metadevice anschauen.
root@mwt # metastat
d30: Mirror
    Submirror 0: d10
      State: Okay         
    Submirror 1: d20
      State: Resyncing    
    Resync in progress: 12 % done
    Pass: 1
    Read option: roundrobin (default)
    Write option: parallel (default)
    Size: 34583472 blocks
    [..snip..]
Interessant ist aber im Moment nur die Resync Zeile. Um weiterzumachen wartet man am besten bis SDS fertig ist mit dem Datenabgleich. Also metastat |grep done in eine Schleife legen, und in der Zeit was anderes machen.
 
Zum Schluss sollten wir noch die zweite Platte so konfigurieren, das man im Notefall auch von Ihr booten kann.
root@mwt # installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c0t1d0s0
Jetzt sollte man im Fehlerfall von der zweiten Platte mit ok boot diskl booten können. Normalerweise ist im ok promt schon ein alias vorhanden. Das sollte man mit ok devalias überprüfen. Wenn nicht muss man halt einen anlegen. Dazu braucht man zuerst den Pfad der Zweiten Platte.
root@mwt # ls -l /dev/rdsk/c0t1d0s0
lrwxrwxrwx   1 root     root          50 Jun 28  2001 /dev/rdsk/c0t1d0s0 -> ../../devices/pci@1f,0/pci@1,1/ide@d/dad@1,0:a,raw
Der zweite boot Pfad wird dann im ok prompt wie folgt angelegt. Siehe obrige Ausgabe von ls, dad wird gegen disk ausgetauscht.
eeprom nvalias="disk1 /pci@1f,0/pci@1,1/ide@d/disk@1,0"
Mit ok boot disk1 kann man dann von der zweiten Platte booten. Das kann aber von Maschinentyp zu Maschinentyp varieren. Sinnvoll ist auch noch der Eintrag
eeprom boot-device="disk disk1"
Falls die erste Platte (disk) nicht zu Verfügung steht, versucht die SUN automatisch von der zweiten Platte zu booten.
 
So, das war´s. Der Spiegel funtioniert, und wenn im laufenden Betrieb eine Platte stirbt, dann läuft unser system auch weiter. ABER leider überlebt das System bei einer defekten Platte keinen Reboot. Schuld daran ist die Statusdatenbank. Wir haben ja auf jeder(!) der beiden Platten je zwei Kopien dieser Datenbank. Wenn nun bei Booten eine Platte fehlt, stehen der Statusdatenbank nur noch genau die Hälfte der Kopien zur Verfügung. Sie bootet jetzt nur noch Read-only, mit dem Verweis auf Inkonsistenzen der Datenbank. Theoretisch könnten man die Kopien der Datenbanken ungleich auf die Platten verteilen, aber welche Platte wird denn sterben ??
Um das zu vermeiden kann man folgende Zeile in die Datei /etc/system eintragen:
set md:mirrored_root_flag=1
Wenn es doch mal Probleme mit den Replicas geben sollte kann man sich den Status mit metadb ansehen.
Löschen kann man Replicas mittels metadb -f -d c0t0d0s3