ZFS/Root

From Segfault
< ZFS
Jump to: navigation, search

Da dieser Blogeintrag leider (seit gestern?) offline ist, hab ich das nur noch im Cache gefunden. Hab's probiert und es funktioniert:

UFS nach ZFS migrieren mit Live Upgrade

Seit Solaris 10 Update 6 ist es möglich, von ZFS zu booten und dieses für die Root Partition einzusetzen. In Verbindung mit Live Upgrade ist es möglich, eine relativ schmerzlose Migration von UFS nach ZFS zu bewerkstelligen. In folgendem Beispiel erkläre ich wie man ein mit SDS gespiegeltes System nach ZFS migriert.

Als Vorbereitung muss man, wie bei Live Upgrade üblich, zuerst die vorhandenen Pakete deinstalieren (falls vorhanden) und die aktuellste Version installieren.

pkgrm SUNWlucfg SUNWluu SUNWlur
pkgadd -d /path/to/Solaris SUNWlucfg SUNWluu SUNWlur

Anschliessend müssen die Patches gemäss OraID #1004881.1 installiert werden.

Nachdem alles Patches installiert wurden und das System neu gestartet wurde, kann mit der eigentlichen Migration begonnen werden. Da für die Migration der Spiegel aufgebrochen werden muss, empfiehlt sich folgender Eintrag in der /etc/system, da Solaris nicht bootet, wenn weniger als 50% der metadbs verfügbar sind.

set md:mirrored_root_flag=1

Anschliessend kann damit begonnen werden, den Mirror aufzubrechen.

$ metastat -c
d0               m   23GB d7 d8
    d7           s   23GB c1t0d0s0
    d8           s   23GB c1t1d0s0
d3               m  8.0GB d5 d6
    d5           s  8.0GB c1t0d0s3
    d6           s  8.0GB c1t1d0s3
d1               m  2.0GB d2 d4
    d2           s  2.0GB c1t0d0s1
    d4           s  2.0GB c1t1d0s1

$ metadetach d0 d8
d0: submirror d8 is detached

$ metadetach d3 d6
d3: submirror d6 is detached

$ metadetach d1 d4
d1: submirror d4 is detached

$ for d in d8 d6 d4; do metaclear $d; done
d8: Concat/Stripe is cleared
d6: Concat/Stripe is cleared
d4: Concat/Stripe is cleared

Auch die metadb darf nicht vergessen werden:

$ metadb
        flags           first blk       block count
     a m  p  luo        16              8192            /dev/dsk/c1t0d0s7
     a    p  luo        8208            8192            /dev/dsk/c1t0d0s7
     a    p  luo        16400           8192            /dev/dsk/c1t0d0s7
     a    p  luo        24592           8192            /dev/dsk/c1t0d0s7
     a    p  luo        16              8192            /dev/dsk/c1t1d0s7
     a    p  luo        8208            8192            /dev/dsk/c1t1d0s7
     a    p  luo        16400           8192            /dev/dsk/c1t1d0s7
     a    p  luo        24592           8192            /dev/dsk/c1t1d0s7

$ metadb -d c1t1d0s7

Jetzt mus die zweite Disk, die c1t1d0 neu partitioniert werden. Um von ZFS booten zu können, wird ein SMI label auf der Disk benötigt. In diesem Beispiel habe ich mich entschieden, den Slice 0 auf die grösse der Disk zu setzen. In diesen Slice wird jetzt das neue ZFS erstellt.

zpool create -f rpool c1t1d0s0

Im nächsten Schritt wird das Boot Environment erzeugt. Das alte Boot Environment wird hier s10su6 und das neue s10su7 benannt.

lucreate -c s10su6 -n s10su7 -p rpool

Wenn das neue Boot Environment erfolgreich erzeugt wurde und die aktuelle Solaris installation auf die Disk kopiert wurde, sollte man folgende Situation haben:

$ zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
rpool              8.29G  24.9G  92.5K  /rpool
rpool/ROOT         4.29G  24.9G    18K  /rpool/ROOT
rpool/ROOT/s10su7  4.29G  24.9G  4.29G  /
rpool/dump            2G  26.9G    16K  -
rpool/swap         2.00G  26.9G    16K  -

$ lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
s10su6                     yes      yes    yes       no     -
s10su7                     yes      no     no        yes    -

Jetzt kann mit dem Upgrade begonnen werden:

luupgrade -n s10su7 -u -s /path/to/solaris

Wenn dies ebenfalls erfolgreich abgeschlossen wurde, kann das neue Boot Environment aktiviert werden:

luactivate s10su7

Falls dies mit folgender Fehlermeldung abbrechen sollte, ist man Opfer des Bugs 6824589 geworden.

/usr/sbin/luactivate: /etc/lu/DelayUpdate/: cannot create

Als Workaround muss die Variable BOOT_MENU_FILE gesetzt werden und luactivate erneut ausgeführt werden.

export BOOT_MENU_FILE="menu.lst"
luactivate s10su7

Anschliessend kann das System neu gestartet werden.

init 6

Das System sollte jetzt mit dem aktualisierten Solaris auf ZFS booten. Sofern der Upgrade geglückt ist, kann das alte Boot Environment sowie die verbleibende Hälfte des Mirrors gelöscht werden. Wichtig ist dabei, dass die Reihenfolge eingehalten wird und das Boot Environment zuerst gelöscht wird.

ludelete s10su6

Und wie folgt den verbleibenden Mirror und die Metadbs entfernen:

$ metastat -c
d0               m   23GB d7
    d7           s   23GB c1t0d0s0
d3               m  8.0GB d5
    d5           s  8.0GB c1t0d0s3
d1               m  2.0GB d2
    d2           s  2.0GB c1t0d0s1

$ for d in d0 d3 d1 d7 d5 d2; do metaclear $d; done
d0: Mirror is cleared
d3: Mirror is cleared
d1: Mirror is cleared
d7: Concat/Stripe is cleared
d5: Concat/Stripe is cleared
d2: Concat/Stripe is cleared

$ metadb
        flags           first blk       block count
     a m  pc luo        16              8192            /dev/dsk/c1t0d0s7
     a    pc luo        8208            8192            /dev/dsk/c1t0d0s7
     a    pc luo        16400           8192            /dev/dsk/c1t0d0s7
     a    pc luo        24592           8192            /dev/dsk/c1t0d0s7

$ metadb -fd c1t0d0s7

Abschliessend wir die gerade vom SDS befreite Disk in den Zpool eingebunden. Beachten sollte man dabei, dass es sich hier um eine Boot Disk mit einem SMI Label handelt und diese von der bereits vorhandenen Disk kopiert werden sollte.

prtvtoc /dev/rdsk/c1t1d0s2 | fmthard -s – /dev/rdsk/c1t0d0s2
zpool attach rpool c1t1d0s0 c1t0d0s0

Jetzt sollte man folgenden Stand haben:

$ zpool status
  pool: rpool
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress for 0h0m, 0.33% done, 0h55m to go
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c1t1d0s0  ONLINE       0     0     0
            c1t0d0s0  ONLINE       0     0     0

errors: No known data errors

$ lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
s10su7                     yes      yes    yes       no     -