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 dem Infodoc 206844 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.
root@v240lu:~# 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
root@v240lu:~# metadetach d0 d8
d0: submirror d8 is detached
root@v240lu:~# metadetach d3 d6
d3: submirror d6 is detached
root@v240lu:~# metadetach d1 d4
d1: submirror d4 is detached
root@v240lu:~# metaclear d8
d8: Concat/Stripe is cleared
root@v240lu:~# metaclear d6
d6: Concat/Stripe is cleared
root@v240lu:~# metaclear d4
d4: Concat/Stripe is cleared
Auch die metadb darf nicht vergessen werden:
root@v240lu:~# 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
root@v240lu:~# 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.
root@v240lu:~# 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.
root@v240lu:~# 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:
root@v240lu:~# 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 -
root@v240lu:~# 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:
root@v240lu:~# luupgrade -n s10su7 -u -s /path/to/solaris
Wenn dies ebenfalls erfolgreich abgeschlossen wurde, kann das neue Boot Environment aktiviert werden:
root@v240lu:~# 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.
root@v240lu:~# export BOOT_MENU_FILE="menu.lst"
root@v240lu:~# luactivate s10su7
Anschliessend kann das System neu gestartet werden.
root@v240lu:~# 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.
root@v240lu:~# ludelete s10su6
Und wie folgt den verbleibenden Mirror und die Metadbs entfernen:
root@v240lu:~# 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
root@v240lu:~# metaclear d0
d0: Mirror is cleared
root@v240lu:~# metaclear d3
d3: Mirror is cleared
root@v240lu:~# metaclear d1
d1: Mirror is cleared
root@v240lu:~# metaclear d7
d7: Concat/Stripe is cleared
root@v240lu:~# metaclear d5
d5: Concat/Stripe is cleared
root@v240lu:~# metaclear d2
d2: Concat/Stripe is cleared
root@v240lu:~# 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
root@v240lu:~# 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.
root@v240lu:~# prtvtoc /dev/rdsk/c1t1d0s2 | fmthard -s – /dev/rdsk/c1t0d0s2
root@v240lu:~# zpool attach rpool c1t1d0s0 c1t0d0s0
Jetzt sollte man folgenden Stand haben:
root@v240lu:~# 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
root@v240lu:~# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
s10su7 yes yes yes no -