About a month ago I was honored to give talk about ZFS Boot Environments on PBUG. At the end of the presentation I mentioned the history of tools to manage ZFS Boot Environments on FreeBSD.

Pawel Jakub Dawidek – which also was on this PBUG #3 meeting – suggested that I should try to add beadm into the FreeBSD base system. I also heard that idea from many beadm users which repetitively asked why beadm is not in the FreeBSD base system. So after finished PBUG #3 that is exactly what I did. I created new PR – Bug 230323 – Idea/Feature Request – include beadm in the base – and to my (positive) surprise they included new bectl tool into the FreeBSD base! We now have new member of that ZFS Boot Environment tools family – the bectl tool.

I will of course maintain and update beadm tool and it will still be available in the FreeBSD Ports under sysutils/beadm category as having such tool written in POSIX /bin/sh allows fast debugging and easy changes to such tool. In short (TLDR) the bectl tool is beadm implemented in C language and as it has just been imported into FreeBSD base which means that it will be part of the FreeBSD 12.0-RELEASE. Currently bectl is already available in the 12.0-ALPHA2 image.

Comparison

The new bectl tool is at very early stage and does not (yet) offer full replacement for the beadm tool. Here is quick comparision of the usage information between bectl and beadm tools.

root@fbsd12:~ # beadm usage: beadm activate beadm create [-e nonActiveBe | -e beName@snapshot] beadm create beadm destroy [-F] beadm list [-a] [-s] [-D] [-H] beadm rename beadm mount [mountpoint] beadm { umount | unmount } [-f] beadm version

… and new bectl tool.

root@fbsd12:~ # bectl missing command usage: bectl ( -h | -? | subcommand [args...] ) bectl activate [-t] beName bectl create [-e nonActiveBe | -e beName@snapshot] beName bectl create beName@snapshot bectl destroy [-F] beName | beName@snapshot⟩ bectl export sourceBe bectl import targetBe bectl jail [ -o key=value | -u key ]... bootenv bectl list [-a] [-D] [-H] [-s] bectl mount beName [mountpoint] bectl rename origBeName newBeName bectl { ujail | unjail } ⟨jailID | jailName | bootenv) bectl { umount | unmount } [-f] beName

For example bectl is not able to rename currently used/mounted boot environment while beadm can.

root@fbsd12:~ # bectl rename safe new boot environment is already mounted failed to rename bootenv safe to new

Its possible to rename such ZFS dataset mounted as / with zfs rename -u ... command (this is exactly what beadm does under the hood) as a workaround for bectl tool.

root@fbsd12:~ # bectl list BE Active Mountpoint Space Created safe NR / 188K 2018-08-18 02:32 default - - 427M 2018-08-18 02:26 root@fbsd12:~ # zfs list | grep safe zroot/ROOT/safe 108K 6.85G 427M / root@fbsd12:~ # zfs rename -u zroot/ROOT/safe zroot/ROOT/new

Its then listed as usual under new name in bectl as shown below:

root@fbsd12:~ # bectl list BE Active Mountpoint Space Created new NR / 188K 2018-08-18 02:32 default - - 427M 2018-08-18 02:26

One nice addition that bectl has that beadm lacks is dynamic FreeBSD Jail creation in specified boot environment.

Here is bectl FreeBSD Jail creation in action.

root@fbsd12:~ # bectl list BE Active Mountpoint Space Created new NR / 188K 2018-08-18 02:32 default - - 427M 2018-08-18 02:26 root@fbsd12:~ # bectl jail default # pwd / # ls / .cshrc bin entropy libexec net root usr .profile boot etc media proc sbin var COPYRIGHT dev lib mnt rescue tmp zroot # exit root@fbsd12:~ # jls JID IP Address Hostname Path 1 default /tmp/be_mount.OnRc root@fbsd12:~ # mount | grep default zroot/ROOT/default on /tmp/be_mount.OnRc (zfs, local, noatime, nfsv4acls) root@fbsd12:~ # bectl unjail default root@fbsd12:~ # jls JID IP Address Hostname Path

If you move/migrate to bectl from beadm you will also have to be more careful as bectl does not ask questions 🙂

For example beadm tool asks if you are sure that you want to destroy specified boot environment. The bectl tool will just remove it without even writing anything on the screen.

root@fbsd12:~ # bectl list BE Active Mountpoint Space Created new NR / 188K 2018-08-18 02:32 default - - 427M 2018-08-18 02:26 root@fbsd12:~ # beadm destroy safe Are you sure you want to destroy 'safe'? This action cannot be undone (y/[n]): n root@fbsd12:~ # bectl destroy safe root@fbsd12:~ # bectl list BE Active Mountpoint Space Created new NR / 188K 2018-08-18 02:32

One of the things that bectl lacks is also the Ansible plugin, beadm is supported by the Ansible plugin so if you prefer to use that configuration management tool, then bectl will ‘backport’ you to raw Ansible module 🙂

The good information is that beadm and bectl can work together on the same host, so you do not have to choose. You may still use beadm tool for daily tasks (or for Ansible module) and bectl for the jail / unjail options for example.

But I think in time bectl will have needed features added and having such tool in FreeBSD base system is a welcome addition.

UPDATE 1

The New ZFS Boot Environments Tool article was featured in the BSD Now 262 – OpenBSD Surfacing episode.

Thanks for mentioning!

UPDATE 2

Finally I had time to check new bectl command again in the newer FreeBSD-12.0-ALPHA6 release for possible improvements.

Now bectl does not display missing command when invoked without arguments.

It is now possible to rename currently used Boot Environment with bectl command.

The last thing I noticed is that bectl jail command does not leave enabled/running Jail after you exit from it, cosmetic but important.

… and last but not least, the easiest path of migration is to create simple alias.

# alias beadm=bectl

… or for (T)CSH shell.

# alias beadm bectl

EOF