Sorry, gonna get wordy/long again.
NOTE: this is all based on my understanding of using freebsd-update and ZFS, the workflow works for and makes sense to me (kind of KISS principle), is based on default behavior and does not include operations on GELI systems.
It looks like each BE creates a dataset... that's cool, but I would have thought it'd also create a snapshot (see next):
The initial BE is a distinct dataset, every BE created after that is technically a "ZFS Clone" of that dataset. A ZFS snapshot is readonly, a ZFS clone is semantically "A writeable snapshot of a snapshot", so by definition a BE contains/utilizes a snapshot.
* What does `bectl` backup? How can I see what it's backing up?
*
A BE is a structured set of directories/datasets that live under root directory, aka "/" that do NOT have a separate dataset. Roughly (I may be missing things) it includes the directories:
/, /etc, /sbin, /bin, /usr/bin, /usr/sbin, /usr/local/..., /var/db plus subdirectories. zfs list shows you datasets and mount points. How can you see? Not sure, but "backing up" is not really what's going on.
* How do I backup my BE's? Instructions say to backup /var/backups... is that sufficient?
* How would I restore a BE from backup? Is that a thing one would want/need to do?
I've never "backed up my BEs" by definition a BE is a clone of a dataset that contains deltas from it's parent. So, to me backing up and restoring is kind of nonsensical.
* I just re-installed my OS several times in the last 2 days and I don't remember whether I used the traditional method or the newer method...how can I tell?
If you were reinstalling 15.x and accepted the defaults, I believe it defaults to "not pkgbase". As for how to tell? I think "pkg info | grep -i freebsd" may give a clue.
* Vermadden (link below) has instructions about dealing with boot loaders... Is this b/c of version upgrades, from say 15.0 to 15.1, or is this because of geli encrypted drives and zfs? How does bectl (and BEs) interact with boot loaders?
Bootloaders: Updating bootloader is tied to doing "zpool upgrade" on your root pool. If you do not do that, it is optional. Has nothing to do with versions/geli, but rather "what version is your zpool". Think compatibility. A bootloader from a year ago has knowledge of zfs pool features at that time, but not today. If you do updates and then zpool upgrade your zpool is now "today". If you do not update your bootloader to "today" before a reboot, the old boot loader does not understand today zpool features and will not boot. A "today" bootloader understands "yesterdays" features so updating bootloaders is usually safe.
Your Primary Question:
Yes, changes you make in your current BE are persistant across reboots.
gpt disk labeling is an interesting case.
Swap: if you do swapoff, then update /etc/fstab to use a gpt label, then swapon that should work and should be persisted.
Changing the name/label of the vdev used for a boot pool is different/harder and not something you can easily do on a live system unless you are at least mirrored.
GELI: that adds a layer of complexity I'm not 100% familiar with. My limited understanding is you create the GELI top level device, then gpart is applied to that, not the raw device.
So I really can't answer.
I'm confused as to why there are only zroot/ROOT/default snapshots here...
Because you were booted into the BE named "default" when freebsd-update install created the new BE.
My post back up at #4, the "key points about freebsd-update" describes the
default behavior.
Honestly, walk through the steps in a VM, paying attention to names and the flags in the Active column for the bectl commands. For all the bectl commands the NR commands should be staying with the same BE.
Install 15.0-RELEASE, this should give you I think 15.0-RELEASE-p10
bectl list should show a single BE named "default"
freebsd-update upgrade -r 15.1-RELEASE
bectl list should show a single BE named "default"
freebsd-update install this installs the 15.1 kerne
bectl list should show 2 BEs, one named "default" the other "default" plus timestamp
freebsd-version -kru should show current kernel as 15.0, next kernel 15.1, userland 15.0
reboot
freebsd-version -kru should show current kernel as 15.1, next kernel as 15.1, userland as 15.0
bectl list should show 2 BEs, one named "default" the other "default" plus timestamp
freebsd-update install update userland
bectl list should show 2 BEs
freebsd-version -kru current kernel 15.1, next kernel 15.1, userland 15.1
freebsd-update install may not do anything but should clean out old libraries
bectl list should show 2 BEs one name default with NR flags one timestamped.
I can't see any point in creating a BE after installing the kernel.
IMO there a two reasonable approaches:
1) Make a backup BE and update the running system as you would on UFS. I understand freebsd-update does this by default on ZFS.
2) Create a new BE, mount it with "bectl mount", and then update that.
I've been using freebsd-update for a while (got tired of building from source) and as long as one understands and accepts the
default behavior, it works just fine with ZFS.
freebsd-update install creates a new BE which is "the currently running BE before any updates are applied" so "my current BE will be updated".
As for these 2 specific points:
If I am updating within a release like 15.0-RELEASE-p5 to 15.0-RELEASE-p10 I let the tool do it's thing.
If I am doing a quarterly package upgrade for my applications, I typically create a new BE before upgrade so I can roll back quickly if something is broken.
Item 2: When I am upgrading across releases like 14.x-RELEASE to 15.x-RELEASE or 15.0-RELEASE to 15.1-RELEASE I manually create a new BE and do freebsd-update into it (freebsd-update and pkg commands have chroot options to enable this). Why? That means I can do all needed upgrad operations into the new BE, make sure it's consistent (base and packages) and reboot once into to.
bectl mount is powerful: you can use it to fix broken BEs (comment out things in kldlist) pretty easily.
bectl rename is another powerful command. I always rename my current BE to reflect what it actually contains (example from one of my systems, my current/default BE is running 15.0-RELEASE-p10, I have a 15.1-RELEASE-p0 created and marked as "use this next boot" (the T) flag.
bectl list
BE Active Mountpoint Space Created
15.0-RELEASE-p10 NR / 15.0G 2025-12-05 17:04
15.0-RELEASE-p9 - - 176M 2026-06-16 09:29
15.1-RELEASE-p0 T - 9.89G 2026-06-16 10:22