Skip to content

Commit

Permalink
freebsd-update: create a ZFS boot environment on install
Browse files Browse the repository at this point in the history
Updated freebsd-update to allow it to create boot environments using
bectl should the system support it. The bectl utility was updated in
r352211 (490e13c) to support a 'check' to determine if the system
supports boot environments.  If UFS is used, the bectl check will fail
then no attempt will be made to create the boot environment.

If freebsd-update is run inside a jail, no attempt will be made to
create a boot environment.

The boot environment function will create a new environment using the
format: current FreeBSD kernel version and date/timestamp, example:

12.0-RELEASE-p10_2019-10-03_185233

This functionality can be disabled by setting 'CreateBootEnv' in
freebsd-update.conf to 'no'.

(cherry picked from commit f28f138)
  • Loading branch information
davefullard authored and kevans91 committed Aug 29, 2021
1 parent c53f239 commit 1420778
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
3 changes: 3 additions & 0 deletions usr.sbin/freebsd-update/freebsd-update.conf
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,6 @@ MergeChanges /etc/ /boot/device.hints

# When backing up a kernel also back up debug symbol files?
# BackupKernelSymbolFiles no

# Create a new boot environment when installing patches
# CreateBootEnv yes
57 changes: 57 additions & 0 deletions usr.sbin/freebsd-update/freebsd-update.sh
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,23 @@ config_BackupKernelSymbolFiles () {
fi
}

config_CreateBootEnv () {
if [ -z ${BOOTENV} ]; then
case $1 in
[Yy][Ee][Ss])
BOOTENV=yes
;;
[Nn][Oo])
BOOTENV=no
;;
*)
return 1
;;
esac
else
return 1
fi
}
# Handle one line of configuration
configline () {
if [ $# -eq 0 ]; then
Expand Down Expand Up @@ -586,6 +603,7 @@ default_params () {
config_BackupKernel yes
config_BackupKernelDir /boot/kernel.old
config_BackupKernelSymbolFiles no
config_CreateBootEnv yes

# Merge these defaults into the earlier-configured settings
mergeconfig
Expand Down Expand Up @@ -850,6 +868,44 @@ install_check_params () {
fi
}

# Creates a new boot environment
install_create_be () {
# Figure out if we're running in a jail and return if we are
if [ `sysctl -n security.jail.jailed` = 1 ]; then
return 1
fi
# Create a boot environment if enabled
if [ ${BOOTENV} = yes ]; then
bectl check 2>/dev/null
case $? in
0)
# Boot environment are supported
CREATEBE=yes
;;
255)
# Boot environments are not supported
CREATEBE=no
;;
*)
# If bectl returns an unexpected exit code, don't create a BE
CREATEBE=no
;;
esac
if [ ${CREATEBE} = yes ]; then
echo -n "Creating snapshot of existing boot environment... "
VERSION=`freebsd-version -k`
TIMESTAMP=`date +"%Y-%m-%d_%H%M%S"`
bectl create ${VERSION}_${TIMESTAMP}
if [ $? -eq 0 ]; then
echo "done.";
else
echo "failed."
exit 1
fi
fi
fi
}

# Perform sanity checks and set some final parameters in
# preparation for UNinstalling updates.
rollback_check_params () {
Expand Down Expand Up @@ -3366,6 +3422,7 @@ cmd_updatesready () {
cmd_install () {
finalize_components_config ${COMPONENTS}
install_check_params
install_create_be
install_run || exit 1
}

Expand Down

0 comments on commit 1420778

Please sign in to comment.