Jails upgraden mit freebsd-update

Aus UUGRN

freebsd-update[Bearbeiten]

freebsd-update ist offiziell nicht dazu geeignet um Jails upzudaten/upzugraden. Beim Upgrade von zum Beispiel 10.3-RELEASE-p10 auf 11.0-RELEASE-p1 muss zuvor das darunter liegende Betriebssystem und Kernel auf 11.0-RELEASE-p1 upgegraded werden (das geht regulär mit freebsd-update upgrade -r 11.0-RELEASE).

aktuelles Release ermitteln[Bearbeiten]

Das Problem von freebsd-update upgrade -r 11.0-RELEASE im Jail ist, dass das Userland im Jail auf 10.3-RELEASE-p10 steht, der Kernel aber schon auf 11.0-RELEASE-p1 läuft. freebsd-update nutzt zur Ermittlung der aktuellen Version allerdings uname -r was immer des Release-String des bereits laufenden Kernels meldet, also 11.0-RELEASE-p1 statt der Version des Userlands im Jail (wäre 10.3-RELEASE-p10).

Glücklicherweise kann man die Ausgabe von uname -r beeinflussen und zwar durch setzen der Umgebungsvariable UNAME_r zum Beispiel auf den String 10.3-RELEASE-p10. Damit erhält dann freebsd-update wenn es uname -r ausführt eben diesen String aus dem Environment und nicht den Wert von kern.osrelease:

# sysctl -n kern.osrelease
11.0-RELEASE-p1
ENVIRONMENT
     An environment variable composed of the string UNAME_ followed by any
     flag to the uname utility (except for -a) will allow the corresponding
     data to be set to the contents of the environment variable.

Seit 10.x-RELEASE gibt es das hilfreiche Tool "freebsd-version", welches mit "-u" den Release-Stand des Userlands zurückgibt.

     The following options are available:

     -k          Print the version and patch level of the installed kernel.
                 Unlike uname(1), if a new kernel has been installed but the
                 system has not yet rebooted, freebsd-version will print the
                 version and patch level of the new kernel.

     -u          Print the version and patch level of the installed userland.
                 These are hardcoded into freebsd-version during the build.

freebsd-update für upgrade auf 11.0-RELEASE[Bearbeiten]

Alles zusammmen genommen ergibt dann folgenden Ablauf für ein Userland-Update im Jail mittels freebsd-update:

#### fetch 10.3 und 11.0 delta
# export UNAME_r="$(freebsd-version -u)"
# freebsd-update upgrade -r 11.0-RELEASE

### to be sure
# export UNAME_r="$(freebsd-version -u)"

### install kernel (not needed in jail but freebsd-update does this on upgrade)
# freebsd-update install

### no need to reboot/restart a jail here!

### install userland, new libraries and binaries
# freebsd-update install

### use pkg-static to upgrade pkg to new ABI (freebsd:11:x86:64)
# pkg-static install -f pkg

### Update repositories
# pkg update -f

### Upgrade all packages
# pkg upgrade -f

### Check for any leftovers, packages not freebsd:11: ABI, missing packages cannot be upgraded
# pkg query '%n|%q' | grep -Fv "freebsd:11:"

### last step: remove any stale shared libraries and files
# freebsd-update install

3rd party packages prüfen nach upgrade[Bearbeiten]

Beispiel, wenn keine neuen Packages verfügbar sind und stattdessen die alten Packages im System verbleiben:

# pkg query '%n|%q' | grep -Fv freebsd:11
openntpd|freebsd:10:x86:64
throttle|freebsd:10:x86:64

# pkg upgrade openntpd
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01    
Fetching packagesite.txz: 100%    6 MiB   5.8MB/s    00:01    
Processing entries: 100%
FreeBSD repository update completed. 25480 packages processed.
pkg: No packages available to upgrade matching 'openntpd' have been found in the repositories

# pkg info openntpd
openntpd-6.0p1_1,2
Name           : openntpd
Version        : 6.0p1_1,2
Installed on   : Mon Oct  3 00:32:15 2016 CEST
Origin         : net/openntpd
Architecture   : freebsd:10:x86:64
[…]

Würde man hier mit dem abschließenden (dritten) freebsd-update install die shared libraries von freebsd:10:* löschen, könnte man diese nicht mehr ausführen! (BTW: Hier nur als Beispiel openntpd genannt, was selbst jedoch ein eher untypischer Kandidat für Software im Jail ist)