Vivian Voss

ZFS Snapshots: Same Commands, Different Experience

freebsd linux zfs

The Unix Way ■ Episode 03

You are about to upgrade your server. Packages, kernel, the lot. Something might break. You want a way back.

The question is not whether ZFS can help you. It can, brilliantly, on both platforms. The question is how much of the safety net you have to knit yourself.

FreeBSD: The Integrated Path

bectl create pre-upgrade
pkg upgrade

Done. If it breaks, reboot, select the old boot environment from the menu. You are back. Thirty seconds.

bectl ships in the base system since FreeBSD 12.0. No package to install. No configuration. The bootloader knows about boot environments natively. freebsd-update goes further: it creates a boot environment automatically before applying patches. You do not even have to ask.

bectl list
BE            Active Mountpoint Space  Created
pre-upgrade   -      -          906M   2026-02-09
default       NR     /          2.1G   2025-11-20

Select. Reboot. Done.

Linux: Assembly Required

Step 1: Install ZFS. It is not in the kernel. It is an out-of-tree module, built via DKMS against your kernel headers. If the kernel updates before OpenZFS supports it, the build fails. If your root is on ZFS, you do not boot.

Linus Torvalds, January 2020: "Don't use ZFS. It's that simple."

Step 2: Configure root-on-ZFS. The installer probably does not support it. Ubuntu had it, removed it in 23.04, partially restored it in 23.10 as "experimental."

Step 3: Install a boot environment manager. bectl does not exist on Linux. You need ZFSBootMenu (which replaces GRUB entirely), or zectl, or a Linux port of beadm. All third-party.

Step 4: Ubuntu tried to solve this with zsys. Automatic snapshots, boot environments, the works. Development ceased in 2021. The GitHub issue titled "Don't use ZSYS" tells the rest.

Step 5: Hope your next kernel update does not break the DKMS build. Documented failures: kernel 6.2.8 (2023), kernel 6.4 (2023), kernel 6.12 (2025). Each time, root-on-ZFS systems could not boot until the kernel was manually downgraded from a rescue environment.

ZFS Integration: FreeBSD vs Linux FreeBSD ZFS in kernel bectl in base system Bootloader-native BEs Auto snapshot on update Linux Out-of-tree DKMS Third-party boot mgr zsys abandoned (2021) DKMS kernel breakage OpenZFS (identical)

The Commands Are the Same

This is the part worth emphasising. The ZFS commands are identical. Both platforms run OpenZFS. The snapshots work the same way:

zfs snapshot zroot@before-upgrade
zfs rollback zroot@before-upgrade

Instant. Zero bytes at creation. Copy-on-write. Brilliant engineering, regardless of platform. ZFS never overwrites data. A snapshot pins the current block pointers. Sub-second, no performance impact.

Incremental backups are equally elegant:

zfs send -i @monday @tuesday | ssh backup zfs recv tank/backup

One pipe. Encrypted, deduplicated, compressed. The same command on both operating systems.

The Difference Is Not ZFS

The difference is what surrounds it.

On FreeBSD, ZFS is in the kernel. bectl is in the base system. The bootloader understands boot environments. freebsd-update creates safety nets automatically. It is one team, one operating system, one design.

On Linux, ZFS is a legal grey area bolted on from the outside. Every kernel update is a trust exercise.

The Btrfs Argument

Fair question, and credit where it is due. openSUSE with Btrfs and snapper is the closest Linux gets to the FreeBSD experience. Automatic snapshots before zypper upgrades, GRUB rollback support. It works.

The caveats: no equivalent to zfs send/receive for incremental backups. No native RAID (Btrfs RAID5/6 still carries a data loss warning). Production-ready since roughly 2015. ZFS: since 2005. LVM snapshots exist too. Nobody would call them elegant.

Linux has options. They are younger, less integrated, and come with their own trade-offs.

The Point

Same filesystem. Same commands. Rather different experience.

One platform treats ZFS as a first-class citizen. The other treats it as a guest who might overstay. The engineering is identical. The integration is not.