Archiv für den Monat: Dezember 2013

FreeBSD: Boot Environments on ZFS

Description:

Illumos/Solaris-like utility for FreeBSD to manage Boot Environments on ZFS filesystems.

Boot Environments sind eine schöne Errungenschaft von den Enterprise Betriebssystemen (Solaris/Illumos(OpenIndiana).

Man könnte es auch als „transaktionelle Betriebssystem-Upgrades mit Rollback-Funktion“ bezeichnen.

Je nach Umfang bzw. Feingranularität der Container im zroot lassen sich unterschiedlich komplexe Systemwiederherstellungspunkte erzeugen.

-> Auf einem System mit einer simplen zroot Stuktur läßt sich nach einem fehlgeschlagenen Software-Upgrade der vorherige, funktionstüchtige ZFS Snapshot booten
-> Auf komplexeren ZFS Systemen könnte man mit Hilfe der BE unterschiedliche Kernel-Versionen testen

Bei dem Oracle Solaris SPARC hauseigenen Boot Environments stehen noch zusätzliche Funktionen bereit, um beispielsweise bei systemkritischen Updates ein verkürzten Systemstart ohne OpenBootPROM/LOM DIAGNOSEN zu ermöglichen.

FreeBSD Beastie Installation der Boot Environments unter FreeBSD

Punkt 1: Beadm installieren

$
cd /usr/ports/sysutils/beadm/ && make install clean
$

Beim ersten ausführen kommt folgender Fehler:

$
this system is not configured for boot environments
$

Als Beispiel gehe ich von einem zroot mit folgender Container-Struktur aus:

$
NAME                         USED  AVAIL  REFER  MOUNTPOINT
zroot                       2,81G   110G   413M  legacy
zroot/tmp                     65K   110G    40K  /tmp
zroot/usr                   1,91G   110G  1010M  /usr
zroot/usr/home                31K   110G    31K  /usr/home
zroot/usr/ports              623M   110G   211M  /usr/ports
zroot/usr/ports/distfiles    324M   110G   324M  /usr/ports/distfiles
zroot/usr/ports/packages    88,4M   110G  88,4M  /usr/ports/packages
zroot/usr/src                322M   110G   322M  /usr/src
zroot/var                   91,2M   110G   136K  /var
zroot/var/crash             31,5K   110G  31,5K  /var/crash
zroot/var/db                90,6M   110G  87,9M  /var/db
zroot/var/db/pkg            2,67M   110G  2,67M  /var/db/pkg
zroot/var/empty               31K   110G    31K  /var/empty
zroot/var/log                111K   110G  78,5K  /var/log
zroot/var/mail                32K   110G    31K  /var/mail
zroot/var/run                184K   110G   100K  /var/run
zroot/var/tmp                 52K   110G    32K  /var/tmp
$

Punkt 2: zroot/BOOT/default Environment erstellen (ROOT snapshot erstellen, Container kopieren, bootfs setzen)

$
zfs snapshot zroot@beadm

zfs create -o compression=lz4 zroot/ROOT
zfs send zroot@beadm | zfs receive zroot/ROOT/default

mkdir /tmp/beadm_default
mount -t zfs zroot/ROOT/default /tmp/beadm_default
$

loader.conf für die zukünftige BE anpassen

$
vi /tmp/beadm_default/boot/loader.conf
$
$
vfs.root.mountfrom="zfs:zroot/ROOT/default"
$

neues bootfs definieren

$
zpool set bootfs=zroot/ROOT/default zroot

zfs get -r mountpoint zroot
$

Punkt 3: in die neue zroot/ROOT/default Umgebung starten

$
reboot
$

Hinweis: Sollte das System nicht mehr booten -> muss mit einer FreeBSD LiveCD Umgebung gestartet werden und der Mountpoint der ROOT System Datasets auf legacy gestellt werden!

Punkt 3.1: (optional) FreeBSD LiveCD booten und zpool importieren

$
zpool import -f -o altroot=/tmp/zroot zroot
$

Punkt 3.2: (optional) ZFS System Volumes in den legacy Modus versetzen und neustarten

$
zfs umount -a

zfs set mountpoint=legacy zroot
zfs set mountpoint=none zroot/ROOT
zfs set mountpoint=legacy zroot/ROOT/default

reboot
$

nach dem Systemstart:

$
beadm list
$

Punkt 4: alle alten ZFS Snapshots löschen

$
zfs list -H -o name -t snapshot | xargs -n1 zfs destroy
$

Der Umgang mit beadm besteht im wesentlichen aus 4 Befehlen:

beadm create -e = BE erstellen
beadm activate = BE aktivieren
beadm list = BE auflisten
beadm destroy = BE löschen

beadm create beNAME@snapshot verhält sich dabei wie ein: zfs snapshot -r pool/ROOT/beNAME@snapshot
beadm create -e beNAME@snapshot beNAME
entspricht dabei einem zfs clone …

als Beispiel wieder:

$
beadm create -e default system9.2p3
beadm list
beadm activate system9.2p3
beadm list
beadm create -e system9.2p3 upgrade10.0
beadm list
$

dann wahlweise:

beadm activate system9.2p3

… oder …

beadm activate upgrade10.0

booten. That’s FreeBSD.

beadm activate setzt dabei auch automatisch den passenden vfs.root Wert in die dazugehörige BE /boot/loader.conf

weiterführender Link: HOWTO: FreeBSD ZFS Madness

Hinweis: BE lohnen sich auf FreeBSD AMD64 Maschinen, wo der /boot/kernel direkt per zfs bootcode geladen wird, auf meinen SPARC64 Maschinen mit 4x gespiegeltem GEOM_Mirror (für /boot) fahre ich eine andere Backup-Strategie.

Mit „zpool history“ lassen sich die BE Vorgänge nachvollziehen, zum Beispiel:

$
2014-01-29.15:09:41 zfs snapshot -r zroot/ROOT/system9.2p3@upgrade10.0
2014-01-29.15:09:41 zfs clone -o canmount=off -o mountpoint=legacy zroot/ROOT/system9.2p3@upgrade10.0 zroot/ROOT/upgrade10.0
2014-01-29.15:09:42 zfs set canmount=noauto zroot/ROOT/upgrade10.0
2014-01-29.15:09:42 zfs set mountpoint=/tmp/BE-upgrade10.0.fRcS0OdG zroot/ROOT/upgrade10.0
2014-01-29.15:09:42 zfs set mountpoint=legacy zroot/ROOT/upgrade10.0
2014-01-29.15:09:42 zpool set bootfs=zroot/ROOT/upgrade10.0 zroot
2014-01-29.15:09:42 zfs set canmount=noauto zroot/ROOT
2014-01-29.15:09:43 zfs set canmount=noauto zroot/ROOT/default
2014-01-29.15:09:43 zfs set canmount=noauto zroot/ROOT/system9.2p3
2014-01-29.15:09:43 zfs set canmount=on zroot/ROOT/upgrade10.0
2014-01-29.15:09:48 zfs promote zroot/ROOT/upgrade10.0
$