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.
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 $