Mirror, mirror on the… Harddisk

Once uppon a time… Erm, falsche Abteilung.

Plattenspiegeln (raid 1) unter Solaris in 12 einfachen Schritten:


Gegeben ist ein Solaris 8 oder 9 und zwei baugleiche Platten.
Ggf. setzt man vorher noch „eeprom auto-boot?=false“. (Nicht vergessen das
hinterher wieder rückgängig zu machen!)

1. Platenlayout.

$ df -h
Filesystem             size   used  avail capacity  Mounted on
/dev/md/dsk/d0         995M   194M   741M    21%    /
/dev/md/dsk/d6         3.8G   1.8G   2.0G    48%    /usr
/proc                    0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
fd                       0K     0K     0K     0%    /dev/fd
/dev/md/dsk/d3         2.0G   196M   1.7G    11%    /var
swap                   1.2G    40K   1.2G     1%    /var/run
swap                   1.2G    32K   1.2G     1%    /tmp
/dev/md/dsk/d5         482M   1.1M   433M     1%    /usr/home

Format:
Part      Tag    Flag     Cylinders        Size            Blocks
0       root    wm       0 -  584        1.00GB    (585/0/0)   2100735
1       swap    wu     585 - 1169        1.00GB    (585/0/0)   2100735
2     backup    wm       0 - 4923        8.43GB    (4924/0/0) 17682084
3        var    wm    1170 - 2338        2.00GB    (1169/0/0)  4197879
4 unassigned    wu       0               0         (0/0/0)           0
5        usr    wm    2339 - 2631      513.75MB    (293/0/0)   1052163
6        usr    wm    2632 - 4905        3.89GB    (2274/0/0)  8165934
7 unassigned    wm    4906 - 4923       31.56MB    (18/0/0)      64638

Slice 7 wird die MetaDB enthalten.
Sollte „format“ hängen und nicht wieder zurückkommen kann ein beherztes „devfsadm -Cv“ helfen.

2. Backup aller Configfiles die verändert werden.
# cp /etc/lvm/md.tab /etc/lvm/md.tab.bak
# cp /etc/vfstab /etc/vfstab.bak
# cp /etc/system /etc/system.bak

3. Dumpen des Plattenlayouts.
# prtvtoc /dev/rdsk/c0t0d0s2 > ~/vtoc.dmp

4. Eintrge in der md.tab, vfstab und system.
# vi /etc/lvm/md.tab

#root mirror
d0 -m d10
d10 1 1 c0t0d0s0
d20 1 1 c0t1d0s0

#swap mirror
d1 -m d11
d11 1 1 c0t0d0s1
d21 1 1 c0t1d0s1

#/var mirror
d3 -m d13
d13 1 1 c0t0d0s3
d23 1 1 c0t1d0s3

#/usr/home mirror
d5 -m d15
d15 1 1 c0t0d0s5
d25 1 1 c0t1d0s5

#/usr mirror
d6 -m d16
d16 1 1 c0t0d0s6
d26 1 1 c0t1d0s6

# vi /etc/vfstab

#/dev/dsk/c0t0d0s1 – – swap – no –
/dev/md/dsk/d1 – – swap – no –
#/dev/dsk/c0t0d0s0 /dev/rdsk/c0t0d0s0 / ufs 1 no –
/dev/md/dsk/d0 /dev/md/rdsk/d0 / ufs 1 no logging
#/dev/dsk/c0t0d0s6 /dev/rdsk/c0t0d0s6 /usr ufs 1 no –
/dev/md/dsk/d6 /dev/md/rdsk/d6 /usr ufs 1 no logging
#/dev/dsk/c0t0d0s3 /dev/rdsk/c0t0d0s3 /var ufs 1 no –
/dev/md/dsk/d3 /dev/md/rdsk/d3 /var ufs 1 no logging
#/dev/dsk/c0t0d0s5 /dev/rdsk/c0t0d0s5 /usr/home ufs 2 yes –
/dev/md/dsk/d5 /dev/md/rdsk/d5 /usr/home ufs 2 yes logging

# vi /etc/system

set md:mirrored_root_flag=1

5. Bau der MetaDB auf Slice 7.
# /usr/sbin/metadb -a -c 3 -f c0t0d0s7

6. Zweite Platte wie erste Platte formatieren.
(Dafür muss die Platte SUN-Gelabled sein. Wenn nicht (Fehlermeldung: „must be a raw device“) einmal format aufrufen und labeln bestätigen.)
# fmthard -s ~/vtoc.dmp /dev/rdsk/c0t1d0s2

7. Metainit.
# metainit -f -a

8. MetaRoot.
# metaroot d0

9. REBOOT! (Ja der muss sein!)
Sonst mag Solaris nicht recht die zweiten Metadevices attachen.

10. Attach zweite Metadevices.
# metattach d0 d20
# metattach d1 d21
# metattach d3 d23
# metattach d5 d25
# metattach d6 d26

Das tut man am besten sequentiell. Sprich man wartet bis der jeweilige sync
fertig ist. Sehen kann man das mit:
# metastat -t d0 | grep ‚%‘
Wenn da nix mehr kommt kann der nächste attach gemacht werden.

11. Bau der MetaDB auf Slice 7 der zweiten Disk.
# /usr/sbin/metadb -a -c 3 -f c0t1d0s7

12. (Mehrere) Reeboot
– um zu sehen ob alles gut geht
– um zu sehen ob er von der zweiten Platte (dem Spiegel) bootet

Und schon Fertig!

Nachtrag:
Spiegel wieder in gang bringen nach Plattentausch:
(Defekte Platte war c0t0d0)
# metadb -d c0t0d0s7
# metadb -a -c 3 -f c0t0d0s7
# metadb -i
# metareplace -e d1 c0t0d0s1
:
:
# metareplace -e d6 c0t0d0s6

Mit
# metastat | grep ‚%‘
schauen wie weit der resync ist.

Ggf., wenn die Platte keine von Sun gelabelte ist muss man etwas mogeln und
es selbst tuen. Man sollte nur darauf achten das die Ersatzplatte mindestens
genauso gross wie die Originalplatte ist (wenn sie größer ist macht das nix auch
wenn es vielleicht Verschwendung ist 😉 ). Hier am Beispiel einer 9GB Platte.
(Typ 18 ist SUN9.0G)
Wie geht dem:
# format
Specify disk (enter its number): 0
format> type
Specify disk type (enter its number)[0]:18
format> label
Ready to label disk, continue? yes
format>
format> q
#

Done.