Re: Good practices with bectl

From: Paul Mather <paul_at_gromit.dlib.vt.edu>
Date: Tue, 20 Sep 2022 23:17:13 UTC
On Sep 20, 2022, at 6:19 PM, Alan Somers <asomers@freebsd.org> wrote:

> On Tue, Sep 20, 2022 at 4:14 PM Nuno Teixeira <eduardo@freebsd.org> wrote:
>> 
>> Hello to all,
>> 
>> I will use becl for the first time for current upgrades.
>> Just to check that I'm thinking correctly:
>> 
>> Create a test environment for upgrade:
>>> bectl create -r test (should I use '-r'?)
>> Activate test:
>>> bectl activate test
>>> reboot
>> ...
>>> upgrade OS on test
>>> reboot
>> ...
>> if a problem happens, reboot default from BE loader
>> ---
>> if everything fine destroy default and rename test to default
>>> bectl destroy -o default
>>> bectl rename test default
>> repeat on next upgrade
>> 
>> Don't know if a faster way exists with chroot or bectl jail...
>> 
>> Any hints appreciated.
>> 
>> Thanks,
>> --
>> Nuno Teixeira
>> FreeBSD Committer (ports)
> 
> I don't think you need to use "-r".  Also, you're forgetting one of
> the best things about boot environments: you can upgrade them even
> when not booted into them.  That's faster than upgrading the running
> BE.  Here is the procedure I use:
> 
> RELEASE=Whatever
> sudo bectl create ${RELEASE}
> sudo bectl mount ${RELEASE}
> BASEDIR=/tmp/be_mount.XXXX    # Use mount point returned by bectl mount
> sudo freebsd-update -b ${BASEDIR} -d ${BASEDIR}/var/db/freebsd-update
> upgrade -r ${RELEASE}
> sudo freebsd-update -b ${BASEDIR} -d ${BASEDIR}/var/db/freebsd-update install
> # Ignore admonitions to reboot, since we're using a boot environment
> sudo freebsd-update -b ${BASEDIR} -d ${BASEDIR}/var/db/freebsd-update install
> sudo bectl activate ${RELEASE}
> sudo reboot
> 
> This general procedure works just as well if you're upgrading from source, too.
> 
> sudo make DESTDIR=${BASEDIR} installworld
> sudo mergemaster -m $PWD -D $BASEDIR -U


There's even a handy tool in /usr/src/tools/build that can be used as a wrapper to install a SRC build into a new boot environment.  It's /usr/src/tools/build/beinstall.sh (see man beinstall(8) for details).  It will create a new boot environment from a source build, run etcupdate and so forth, and even mark the new boot environment as the one to be active on reboot.  All you need to do is reboot.  I've been using it for source upgrades for a while now without problems.  The best thing, for me, is it cuts out all that time doing "make installworld" and etcupdate in single user mode, thus minimising downtime.

Cheers,

Paul.