FreeBSD 15.0 reached end of life on September 30, 2026. A machine still running it no longer gets security fixes. A machine on 14.x has a choice to make: move to 15.1 now, or stay on the 14 branch with 14.5 and make the jump later.
This guide covers both, plus the pkgbase path that 15.x introduced. This site's own server runs FreeBSD 15.1 installed from distribution sets and takes its updates through freebsd-update — the classic path, and still the right default for production.
Which upgrade do you need?
| If you're on… | Do this | Supported until |
|---|---|---|
| 15.0-RELEASE | Upgrade to 15.1 now — 15.0 support ended September 30, 2026 | 15.1: March 31, 2027 |
| 14.4 or 14.5 | Stay on the 14 branch at 14.5, or make the major jump to 15.1 | 14.4: December 31, 2026 · 14.5: June 30, 2027 · 14 branch: November 30, 2028 |
| Anything older than 14.4 | Already unsupported — upgrade now | — |
| 13.x | Go to 14.x first — freebsd-update doesn't skip a major version |
— |
| 32-bit x86 (i386) | Stay on 14.x — FreeBSD 15 has no i386 release | 14 branch: November 30, 2028 |
Every date comes from the FreeBSD security page, which lists the supported releases and their end-of-life dates. Starting with FreeBSD 15, each major branch is supported for four years from its .0 release, so the 15 branch runs until December 31, 2029.
Before you start
Find out how your base system is installed. This decides which section of this guide applies:
pkg which /usr/bin/unameIf it says /usr/bin/uname was not found in the database, the base system came from distribution sets and you upgrade with freebsd-update (paths 1 and 2). If it names a FreeBSD-* package, you're on pkgbase (path 3).
Back up. Data, /etc, /usr/local/etc, and anything else you'd hate to recreate. Then skim the 15.1 release notes and the errata for anything that touches your hardware or services.
Know your safety net. On a ZFS root, freebsd-update creates a boot environment of the running system before it installs anything — CreateBootEnv defaults to yes, and you'll see Creating snapshot of existing boot environment... as it happens. It skips this inside jails and on systems that can't use boot environments, such as UFS roots. On UFS, your backup is the safety net. If you'd rather name your own, take one first:
bectl create pre-15.1Have console access. If the machine doesn't come back after a reboot, you'll want your provider's web console or out-of-band management, not SSH.
Two more from the Handbook: pause any cron job that runs freebsd-update, and if you run a custom kernel, make sure /boot/GENERIC exists and boot it once with nextboot -k GENERIC before relying on the upgrade.
Path 1: 14.x to 15.1 (major upgrade, distribution sets)
freebsd-update takes a supported 14.x system straight to 15.1 — you don't need to stop at 15.0 on the way.
# 1. Bring the current release fully up to date
freebsd-update fetch
freebsd-update install
# 2. Download the upgrade and merge your configuration changes
freebsd-update -r 15.1-RELEASE upgrade
# 3. Install the new kernel and reboot into it
freebsd-update install
shutdown -r now
# 4. Install the new userland
freebsd-update installStep 2 lists the components it will upgrade and asks you to confirm. It then walks through every configuration file you've modified that also changed upstream, and shows you each merge. Read them — this is where a customized sshd_config or rc.conf either survives or doesn't.
After step 4 on a major upgrade, freebsd-update stops and tells you exactly what comes next:
Completing this upgrade requires removing old shared object files.
Please upgrade or rebuild all installed 3rd party software (e.g.,
programs installed with pkg or from the ports tree) and then run
'freebsd-update [options] install' again to finish installing updates.Every package you have was built for the FreeBSD 14 ABI, so reinstall all of them before the old libraries go away:
# 5. Reinstall every package against the FreeBSD 15 ABI
pkg-static upgrade -f
# 6. Remove the old shared libraries, then reboot
freebsd-update install
shutdown -r nowpkg-static is the statically linked copy of pkg, so it keeps working while the libraries underneath it change. -f forces a reinstall even when a package's version number hasn't changed — which, across a major upgrade, is most of them. Software you built from ports needs rebuilding too; the Handbook uses portmaster -af.
Path 2: 15.0 to 15.1 (minor upgrade, distribution sets)
The same sequence, minus the forced package reinstall — packages built for FreeBSD 15 keep working across 15.x minor releases.
freebsd-update fetch
freebsd-update install
freebsd-update -r 15.1-RELEASE upgrade
freebsd-update install
shutdown -r now
freebsd-update installA minor upgrade may finish in two install passes instead of three, because no library versions change. Afterwards a normal pkg upgrade brings your packages current.
Path 3: pkgbase systems
On pkgbase, the base system is a set of FreeBSD-* packages from the FreeBSD-base repository, and pkg upgrades it — freebsd-update is out of the picture entirely.
15.0 to 15.1
The repository URL encodes the minor release: base_release_0 is 15.0, base_release_1 is 15.1. Point it at 15.1 and upgrade. Create a boot environment first if you're on ZFS:
bectl create pre-15.1Then, in the file that defines the FreeBSD-base repository — the Handbook keeps it at /usr/local/etc/pkg/repos/FreeBSD-base.conf — change the URL to end in base_release_1:
url: "pkg+https://pkg.freebsd.org/${ABI}/base_release_1",pkg update -r FreeBSD-base
pkg upgrade -r FreeBSD-base # review the list before accepting
shutdown -r now
pkg upgrade # then your other packages14.x on pkgbase to 15.x
pkgbase was experimental throughout 14.x, and so is its major upgrade. The Handbook documents a procedure that upgrades into a separate boot environment with pkg-static -c and an ABI=FreeBSD:15:amd64 override, and notes a known issue where the upgrade can uninstall pkg itself. If you're on this path, follow the Handbook's steps exactly rather than improvising.
freebsd-update and pkgbase don't mix
Run freebsd-update on a pkgbase system and it refuses:
freebsd-update is incompatible with the use of packaged base. Please see
https://wiki.freebsd.org/PkgBase for more information.It detects pkgbase the same way the check above does: by asking pkg whether /usr/bin/uname belongs to a package. If you see this message, you're on path 3.
Should you convert to pkgbase now?
Not yet, for most production servers. Per the 15.0 announcement, pkgbase is a technology preview throughout 15.x, distribution sets are planned for removal in FreeBSD 16, and freebsd-update stays supported for the life of the 15 branch. That gives you until December 31, 2029 on the classic path.
When you do convert, the FreeBSD Foundation's pkgbasify script does it in place on 14.0 or later. Its own README is blunt that both it and pkgbase are experimental and that a conversion can, in the worst case, leave a system that won't boot. It needs at least 5 GiB free, which it doesn't check for, and offers to create a pre-pkgbasify boot environment first. Run it as root:
fetch https://github.com/FreeBSDFoundation/pkgbasify/raw/refs/heads/main/pkgbasify.lua
chmod +x ./pkgbasify.lua
./pkgbasify.luaDo it on a machine you can afford to rebuild before you do it on one you can't.
After the upgrade
Confirm the installed kernel, the running kernel and the userland all agree:
freebsd-version -kruAll three lines should read 15.1-RELEASE (with a -pN patch level once patches land). Then check your services with service -e, which lists everything enabled in rc.conf, and read /var/log/messages from the boot.
On ZFS, zpool status may now mention features your pools can enable. Hold off on zpool upgrade until you're sure you won't boot the old 14.x environment again — an older OpenZFS can't import a pool with newer features enabled, so upgrading the pool quietly removes your rollback. Once you're confident, bectl list shows the old boot environment and bectl destroy removes it.
If something goes wrong
Roll back on ZFS. The boot environment freebsd-update created is named after the version you upgraded from plus a timestamp:
bectl list
bectl activate 14.5-RELEASE-p2_2026-10-07_101500 # use the name from bectl list
shutdown -r now"Shared object … not found" after a major upgrade means a package still links against a FreeBSD 14 library that the final install removed. Run pkg-static upgrade -f again.
freebsd-update says it's incompatible with packaged base — you're on pkgbase; use path 3.
For routine patching once you're on 15.1, see keeping a FreeBSD server up to date. For what changed between 14 and 15 in the first place, see what's new in FreeBSD 15.0, and for how FreeBSD's support windows compare with Linux distributions, see FreeBSD vs Linux in 2026.
Commands follow the FreeBSD Handbook's "Updating and Upgrading FreeBSD" chapter and the freebsd-update source shipped with 15.1; release and support dates are from the FreeBSD security page; the pkgbase repository names were checked against pkg.freebsd.org on October 7, 2026. I haven't replayed every path for this revision — the pkgbase steps in particular are documented here, not personally tested.