Jak udělat mirror systémových disků pod Solarisem

Každý server by měl mít systémové disky v mirroru, protože jestli něco v počítačích odchází rádo, tak jsou to disky. Pokud není server vybaven HW mirrorem, máte v Solarisu možnost použít mirror softwarový. Firma Sun dodává tento sw spolu se Solarisem. Je znám pod názvem Solstice Disk Suite, nebo Solaris Volume Manager.

Jak na to?
Nejdříve si zjistěte si které slice budete mirrorovat. Celý příklad, který je zde udělá mirror na slice 0,1,5 tj /(root), swap, /var. Vzhledem k tomu, že SDS využívá databázi, kterou nemá na filesystému, ale na zvláštní slice, je nutné tuto slice vytvořit. Většinou se pro tyto účely používá slice 7. Velikost s7 => 256 MB => dostatečně velká rezerva.

Jaké disky budeme mirrorovat

root@pokusnykralik # format

Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c1t1d0 
          /pci@8,600000/SUNW,qlc@4/fp@0,0/ssd@w2100002037f30f3b,0
       1. c1t2d0 
          /pci@8,600000/SUNW,qlc@4/fp@0,0/ssd@w2100002037f3f003,0

takže v tomto případě se jedná o disky c1t1d0 a c1t2d0.

Rozdělení mého disku c1t1d0.

Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm    2870 -  8609        7.91GB    (5740/0/0)  16582860
  1       swap    wu       0 -  2869        3.95GB    (2870/0/0)   8291430
  2     backup    wm       0 - 24619       33.92GB    (24620/0/0) 71127180
  3 unassigned    wm       0                0         (0/0/0)            0
  4 unassigned    wm       0                0         (0/0/0)            0
  5        var    wm    8610 - 10061        2.00GB    (1452/0/0)   4194828
  6 unassigned    wm       0                0         (0/0/0)            0
  7 unassigned    wm   10062 - 10243      256.74MB    (182/0/0)     525798

Celý proces mirroru je rozdělěn na 2 části

  • část 1 - vytvoření půlky zrcadla, úprava vfstat, reboot
  • část 2 - připojení druhé půlky zrcadla a synchnizace

ad část 1:

Vytvoříme malý script, který pomocí prtvtoc sejme rozdělení prvního disku, programem fmthard rozdělí druhý, pak vytvoří databáze, vytvoří první a druhou část zrcadla a připojí první část zrcadla do metazařízení.

BDISK=c1t1d0
MDISK=c1t2d0

set -x

prtvtoc /dev/rdsk/${BDISK}s2 > /tmp/firstdisk
fmthard -s /tmp/firstdisk /dev/rdsk/${MDISK}s2

metadb -a -c3 -f ${BDISK}s7
metadb -a -c3    ${MDISK}s7

metainit -f d10 1 1 ${BDISK}s0
metainit -f d11 1 1 ${BDISK}s1
metainit -f d15 1 1 ${BDISK}s5

metainit -f d20 1 1 ${MDISK}s0
metainit -f d21 1 1 ${MDISK}s1
metainit -f d25 1 1 ${MDISK}s5

metainit d0 -m d10
metainit d1 -m d11
metainit d5 -m d15
metaroot d0
set +x

Výpis spuštěného scriptu:

root@pokusnykralik # ./start.sh 
++ prtvtoc /dev/rdsk/c1t1d0s2
++ fmthard -s /tmp/firstdisk /dev/rdsk/c1t2d0s2
fmthard:  New volume table of contents now in place.
++ metadb -a -c3 -f c1t1d0s7
++ metadb -a -c3 c1t2d0s7
metadb: waiting on /etc/lvm/lock
++ metainit -f d10 1 1 c1t1d0s0
d10: Concat/Stripe is setup
++ metainit -f d11 1 1 c1t1d0s1
d11: Concat/Stripe is setup
++ metainit -f d15 1 1 c1t1d0s5
d15: Concat/Stripe is setup
++ metainit -f d20 1 1 c1t2d0s0
d20: Concat/Stripe is setup
++ metainit -f d21 1 1 c1t2d0s1
d21: Concat/Stripe is setup
++ metainit -f d25 1 1 c1t2d0s5
d25: Concat/Stripe is setup
++ metainit d0 -m d10
d0: Mirror is setup
++ metainit d1 -m d11
d1: Mirror is setup
++ metainit d5 -m d15
d5: Mirror is setup
++ metaroot d0
++ set +x

Tak po spuštění je třeba upravit /etc/vfstab a to z následujícího stavu:

...
/dev/dsk/c1t1d0s1	-       -       swap    -       no      -
/dev/dsk/c1t1d0s0	/dev/rdsk/c1t1d0s0 /       ufs     1       no      logging
/dev/dsk/c1t1d0s5	/dev/rdsk/c1t1d0s5      /var    ufs     1       no	logging
...

do stavu kdy se nesahá přímo na zařízení, ale jde se přes metazařízení, které má na starosti mirror:

...
/dev/md/dsk/d1  -       -       swap    -       no      -
/dev/md/dsk/d0  /dev/md/rdsk/d0 /       ufs     1       no      logging
/dev/md/dsk/d5  /dev/md/rdsk/d5 /var    ufs     1       no      logging
...

Pak následuje REBOOT!

ad část 2:

Nyní je třeba připojit druhou část zrcadla scriptem:

for slice in 0 1 5
do
    echo "attaching d2$slice to d$slice"
    metattach d$slice d2$slice
done

spustníme script:

root@pokusnykralik # ./finish.sh 
attaching d20 to d0
d0: submirror d20 is attached
attaching d21 to d1
d1: submirror d21 is attached
attaching d25 to d5
d5: submirror d25 is attached

Pomocí příkazu metastat se můžete podívat co se děje:

d5: Mirror
    Submirror 0: d15
      State: Okay         
    Submirror 1: d25
      State: Resyncing    
    Resync in progress: 4 % done
    Pass: 1
    Read option: roundrobin (default)
    Write option: parallel (default)
    Size: 4194828 blocks (2.0 GB)

d15: Submirror of d5
    State: Okay         
    Size: 4194828 blocks (2.0 GB)
    Stripe 0:
        Device     Start Block  Dbase        State Reloc Hot Spare
        c1t1d0s5          0     No            Okay   Yes 

d25: Submirror of d5
    State: Resyncing    
    Size: 4194828 blocks (2.0 GB)
    Stripe 0:
        Device     Start Block  Dbase        State Reloc Hot Spare
        c1t2d0s5          0     No            Okay   Yes 


d1: Mirror
    Submirror 0: d11
      State: Okay         
    Submirror 1: d21
      State: Resyncing    
    Resync in progress: 1 % done
    Pass: 1
    Read option: roundrobin (default)
    Write option: parallel (default)
    Size: 8291430 blocks (4.0 GB)

d11: Submirror of d1
    State: Okay         
    Size: 8291430 blocks (4.0 GB)
    Stripe 0:
        Device     Start Block  Dbase        State Reloc Hot Spare
        c1t1d0s1          0     No            Okay   Yes 

d21: Submirror of d1
    State: Resyncing    
    Size: 8291430 blocks (4.0 GB)
    Stripe 0:
        Device     Start Block  Dbase        State Reloc Hot Spare
        c1t2d0s1          0     No            Okay   Yes 


d0: Mirror
    Submirror 0: d10
      State: Okay         
    Submirror 1: d20
      State: Resyncing    
    Resync in progress: 0 % done
    Pass: 1
    Read option: roundrobin (default)
    Write option: parallel (default)
    Size: 16582860 blocks (7.9 GB)

d10: Submirror of d0
  Write option: parallel (default)
    Size: 16582860 blocks (7.9 GB)

d10: Submirror of d0
    State: Okay         
    Size: 16582860 blocks (7.9 GB)
    Stripe 0:
        Device     Start Block  Dbase        State Reloc Hot Spare
        c1t1d0s0          0     No            Okay   Yes 

d20: Submirror of d0
    State: Resyncing    
    Size: 16582860 blocks (7.9 GB)
    Stripe 0:
        Device     Start Block  Dbase        State Reloc Hot Spare
        c1t2d0s0          0     No            Okay   Yes 

Device Relocation Information:
Device   Reloc  Device ID
c1t2d0   Yes    id1,ssd@n2000002037f3f003
c1t1d0   Yes    id1,ssd@n2000002037f30f3b

Průběh resynchronizace můžete jednoduše sledovat:

root@pokusnykralik #  metastat  | grep %
    Resync in progress: 2 % done
    Resync in progress: 1 % done
    Resync in progress: 0 % done

Jakmile je synchnizace hotová, je dobré vyzkoušet, jestli stroj bootuje z jednoho i druhého disku.