{"id":164434,"date":"2026-03-25T12:16:56","date_gmt":"2026-03-25T09:16:56","guid":{"rendered":"https:\/\/computingforgeeks.com\/freebsd-15-new-features\/"},"modified":"2026-03-25T12:16:57","modified_gmt":"2026-03-25T09:16:57","slug":"freebsd-15-new-features","status":"publish","type":"post","link":"https:\/\/computingforgeeks.com\/freebsd-15-new-features\/","title":{"rendered":"FreeBSD 15.0 New Features: pkgbase, Post-Quantum Crypto, ZFS 2.4"},"content":{"rendered":"\n<p>FreeBSD 15.0 landed on December 2, 2025, and it changes how you manage the entire operating system. The base system is now a collection of 310 individual packages managed through <code>pkg<\/code>, the same tool you already use for ports. No more <code>freebsd-update<\/code>. Alongside that, OpenSSL 3.5 ships with quantum-resistant cryptography, and OpenSSH 10 defaults to post-quantum key exchange on every connection.<\/p>\n\n\n\n<p>We tested every feature shown here on a real FreeBSD 15.0-RELEASE amd64 machine running on Proxmox VE with ZFS 2.4.0. The commands, output, and version numbers are all captured from that system. For features that are architectural (like 32-bit platform retirement), we focus on what it means for your existing workloads rather than just listing the changelog. If you need to <a href=\"https:\/\/computingforgeeks.com\/install-freebsd-15-proxmox-kvm\/\" target=\"_blank\" rel=\"noreferrer noopener\">install FreeBSD 15 on KVM or Proxmox<\/a> first, that guide covers the full installer walkthrough.<\/p>\n\n\n\n<p><em>Tested <strong>March 2026<\/strong> | FreeBSD 15.0-RELEASE amd64, OpenSSL 3.5.4, OpenSSH 10.0p2, ZFS 2.4.0-rc4<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Changed in FreeBSD 15.0<\/h2>\n\n\n\n<p>Here is the full picture before we get into the demos:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>What&#8217;s New<\/th><th>Impact<\/th><\/tr><\/thead><tbody><tr><td>pkgbase<\/td><td>310 base system packages manageable via <code>pkg<\/code><\/td><td>No more <code>freebsd-update<\/code>, granular base management<\/td><\/tr><tr><td>OpenSSL 3.5.4<\/td><td>ML-KEM and ML-DSA post-quantum algorithms<\/td><td>Quantum-resistant TLS available now<\/td><\/tr><tr><td>OpenSSH 10.0p2<\/td><td>mlkem768x25519-sha256 default key exchange<\/td><td>SSH connections are quantum-safe by default<\/td><\/tr><tr><td>ZFS 2.4.0<\/td><td>Block cloning, improved performance<\/td><td>Instant file copies on ZFS, lower I\/O<\/td><\/tr><tr><td>Jails<\/td><td>File descriptor-based jail operations, service jails<\/td><td>Race-free jail management, easy daemon isolation<\/td><\/tr><tr><td>Linux inotify<\/td><td>Native inotify implementation<\/td><td>Better Linux binary compatibility<\/td><\/tr><tr><td>32-bit retirement<\/td><td>i386, armv6, 32-bit PowerPC dropped<\/td><td>Cleaner codebase, 32-bit apps still run on amd64<\/td><\/tr><tr><td>Nanosecond timestamps<\/td><td><code>date<\/code> supports <code>%N<\/code> format<\/td><td>Precise timing in scripts<\/td><\/tr><tr><td>USB HID<\/td><td><code>usbhid<\/code> replaces <code>ukbd<\/code>\/<code>ums<\/code> as default<\/td><td>Better device support out of the box<\/td><\/tr><tr><td>MIT Kerberos<\/td><td>Replaces Heimdal<\/td><td>Better interoperability with Linux\/AD environments<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Full details are in the <a href=\"https:\/\/www.freebsd.org\/releases\/15.0R\/announce\/\" target=\"_blank\" rel=\"noreferrer noopener\">official FreeBSD 15.0 release announcement<\/a> and <a href=\"https:\/\/www.freebsd.org\/releases\/15.0R\/relnotes\/\" target=\"_blank\" rel=\"noreferrer noopener\">release notes<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">pkgbase: Manage the Entire Base System with pkg<\/h2>\n\n\n\n<p>This is the headline feature. The entire base system (kernel, libraries, utilities, everything that ships with FreeBSD) is now split into approximately 310 individual packages. You manage them with the same <code>pkg<\/code> tool used for third-party software. No more running <code>freebsd-update fetch install<\/code> and hoping nothing breaks.<\/p>\n\n\n\n<p>Query the installed base packages:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pkg query -a '%n %v' | grep '^FreeBSD-' | head -20<\/code><\/pre>\n\n\n\n<p>Every base component shows up as an individual package with its own version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FreeBSD-acct 15.0\nFreeBSD-acpi 15.0\nFreeBSD-at 15.0\nFreeBSD-atf 15.0\nFreeBSD-audit 15.0\nFreeBSD-autofs 15.0\nFreeBSD-bhyve 15.0\nFreeBSD-blocklist 15.0\nFreeBSD-bluetooth 15.0\nFreeBSD-bmake 15.0\nFreeBSD-bootloader 15.0\nFreeBSD-bsdconfig 15.0\nFreeBSD-bsdinstall 15.0\nFreeBSD-bsnmp 15.0\nFreeBSD-caroot 15.0\nFreeBSD-certctl 15.0\nFreeBSD-clibs 15.0\nFreeBSD-csh 15.0\nFreeBSD-devd 15.0\nFreeBSD-devmatch 15.0<\/code><\/pre>\n\n\n\n<p>The total count on a fresh 15.0 install:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pkg query -a '%n' | grep '^FreeBSD-' | wc -l<\/code><\/pre>\n\n\n\n<p>310 base packages. You can inspect any of them like you would a ports package:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pkg info FreeBSD-ssh<\/code><\/pre>\n\n\n\n<p>The SSH package metadata shows origin, license, and install date:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FreeBSD-ssh-15.0\nName           : FreeBSD-ssh\nVersion        : 15.0\nInstalled on   : Tue Mar 24 11:18:11 2026 UTC\nOrigin         : base\/FreeBSD-ssh\nArchitecture   : FreeBSD:15:amd64\nPrefix         : \/\nCategories     : base\nLicenses       : ISCL\nMaintainer     : re@FreeBSD.org<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Enable pkgbase Updates<\/h3>\n\n\n\n<p>The base package repository is disabled by default. Enable it with a one-liner:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/usr\/local\/etc\/pkg\/repos\necho 'FreeBSD-base: { enabled: yes }' > \/usr\/local\/etc\/pkg\/repos\/FreeBSD-base.conf<\/code><\/pre>\n\n\n\n<p>Now check for base system updates:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pkg update -r FreeBSD-base<\/code><\/pre>\n\n\n\n<p>On our freshly installed system, everything is current:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Updating FreeBSD-base repository catalogue...\nFreeBSD-base repository is up to date.\nFreeBSD-base is up to date.<\/code><\/pre>\n\n\n\n<p>When security patches land, updating the base is just <code>pkg upgrade<\/code>. You can even lock specific base packages with <code>pkg lock FreeBSD-kernel<\/code> if you need to hold back a kernel update while patching userland.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Post-Quantum Cryptography with OpenSSL 3.5<\/h2>\n\n\n\n<p>FreeBSD 15.0 ships OpenSSL 3.5.4 LTS with full support for the NIST post-quantum cryptographic standards: ML-KEM (formerly CRYSTALS-Kyber) for key encapsulation and ML-DSA (formerly CRYSTALS-Dilithium) for digital signatures. These algorithms resist attacks from quantum computers, and they are not behind a feature flag. They are compiled in and ready to use.<\/p>\n\n\n\n<p>Verify the version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl version<\/code><\/pre>\n\n\n\n<p>Confirmed as 3.5.4 LTS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OpenSSL 3.5.4 30 Sep 2025 (Library: OpenSSL 3.5.4 30 Sep 2025)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">What post-quantum algorithms are available?<\/h3>\n\n\n\n<p>Three security levels of ML-KEM and ML-DSA ship out of the box, plus hybrid algorithms that combine classical and post-quantum key exchange. List the KEM algorithms:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl list -kem-algorithms<\/code><\/pre>\n\n\n\n<p>The output shows pure ML-KEM at three security levels and several hybrid options:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  SecP384r1MLKEM1024 @ default\n  { 1.3.101.110, X25519 } @ default\n  { 1.3.101.111, X448 } @ default\n  { 2.16.840.1.101.3.4.4.1, id-alg-ml-kem-512, ML-KEM-512, MLKEM512 } @ default\n  { 2.16.840.1.101.3.4.4.2, id-alg-ml-kem-768, ML-KEM-768, MLKEM768 } @ default\n  { 2.16.840.1.101.3.4.4.3, id-alg-ml-kem-1024, ML-KEM-1024, MLKEM1024 } @ default\n  X25519MLKEM768 @ default\n  X448MLKEM1024 @ default\n  SecP256r1MLKEM768 @ default<\/code><\/pre>\n\n\n\n<p>The hybrid algorithms (like <code>X25519MLKEM768<\/code>) combine classical and post-quantum key exchange. Even if ML-KEM turns out to have a weakness, the X25519 component still provides security. This is the belt-and-suspenders approach NIST recommends for the transition period.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Demo: Sign and Verify with ML-DSA-65<\/h3>\n\n\n\n<p>Generate a quantum-resistant ML-DSA-65 key pair:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl genpkey -algorithm ML-DSA-65 -out \/tmp\/mldsa65.key\nopenssl pkey -in \/tmp\/mldsa65.key -pubout -out \/tmp\/mldsa65.pub<\/code><\/pre>\n\n\n\n<p>Lattice-based algorithms need bigger keys to achieve quantum resistance. Compare these sizes to an Ed25519 key (which is 64 bytes):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls -la \/tmp\/mldsa65.*<\/code><\/pre>\n\n\n\n<p>The private key is 5.6 KB, the public key 2.7 KB:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-rw-------  1 root wheel 5604 Mar 25 01:21 \/tmp\/mldsa65.key\n-rw-r--r--  1 root wheel 2726 Mar 25 01:21 \/tmp\/mldsa65.pub<\/code><\/pre>\n\n\n\n<p>Now sign a message and verify the signature:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo 'Hello FreeBSD 15 with post-quantum crypto' > \/tmp\/message.txt\nopenssl pkeyutl -sign -inkey \/tmp\/mldsa65.key -in \/tmp\/message.txt -out \/tmp\/message.sig\nopenssl pkeyutl -verify -pubin -inkey \/tmp\/mldsa65.pub -in \/tmp\/message.txt -sigfile \/tmp\/message.sig<\/code><\/pre>\n\n\n\n<p>Verification passes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Signature Verified Successfully<\/code><\/pre>\n\n\n\n<p>ML-KEM key generation works the same way:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl genpkey -algorithm ML-KEM-768 -out \/tmp\/mlkem768.key\nopenssl pkey -in \/tmp\/mlkem768.key -pubout -out \/tmp\/mlkem768.pub\nopenssl pkey -in \/tmp\/mlkem768.key -text -noout | head -3<\/code><\/pre>\n\n\n\n<p>The seed is the secret from which the full ML-KEM keypair is derived:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ML-KEM-768 Private-Key:\nseed:\n    a1:4a:bb:13:9f:f0:1f:57:cf:42:63:ea:28:a0:d4:<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">OpenSSH 10: Quantum-Safe by Default<\/h2>\n\n\n\n<p>This one caught our attention. OpenSSH 10.0p2 in FreeBSD 15.0 changed the default key exchange algorithm to <code>mlkem768x25519-sha256<\/code>, a hybrid post-quantum algorithm. Every SSH connection on a fresh FreeBSD 15 install uses quantum-resistant key exchange without any configuration changes. You do not have to opt in.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -V<\/code><\/pre>\n\n\n\n<p>OpenSSH 10 with OpenSSL 3.5.4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OpenSSH_10.0p2, OpenSSL 3.5.4 30 Sep 2025<\/code><\/pre>\n\n\n\n<p>Check the key exchange algorithms sshd will negotiate, in preference order:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sshd -T | grep kexalgorithms<\/code><\/pre>\n\n\n\n<p><code>mlkem768x25519-sha256<\/code> sits at the top of the list, meaning it is the first choice for every new connection:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kexalgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521<\/code><\/pre>\n\n\n\n<p>The fallback chain still includes classical algorithms for compatibility with older clients. If the remote end does not support ML-KEM, the connection gracefully falls back to <code>curve25519-sha256<\/code>.<\/p>\n\n\n\n<p>OpenSSH 10 also adds automatic keystroke timing obfuscation. When you type in an SSH terminal, the timing between keystrokes can leak information about what you are typing. OpenSSH 10 inserts random padding, making keystroke analysis impractical. Enabled by default, no configuration required.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ZFS 2.4: Block Cloning and Performance<\/h2>\n\n\n\n<p>FreeBSD 15.0 ships ZFS 2.4.0 with block cloning enabled by default. When you copy a file on ZFS, the filesystem can reference the same data blocks instead of physically duplicating them. Think of it like how ZFS clones work at the dataset level, but applied to individual files through the <code>copy_file_range()<\/code> syscall.<\/p>\n\n\n\n<p>Check the ZFS version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>zfs version<\/code><\/pre>\n\n\n\n<p>Both userland and kernel module report 2.4.0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>zfs-2.4.0-rc4-FreeBSD_g099f69ff5\nzfs-kmod-2.4.0-rc4-FreeBSD_g099f69ff5<\/code><\/pre>\n\n\n\n<p>Confirm block cloning is active on your pool:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>zpool get feature@block_cloning zroot<\/code><\/pre>\n\n\n\n<p>Active and ready:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME   PROPERTY               VALUE   SOURCE\nzroot  feature@block_cloning  active  local<\/code><\/pre>\n\n\n\n<p>FreeBSD&#8217;s <code>cp<\/code> command uses <code>copy_file_range()<\/code> automatically, so block cloning happens transparently. You can monitor how much space it saves:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>zpool get bclonesaved,bcloneused,bcloneratio zroot<\/code><\/pre>\n\n\n\n<p>On our test system with a few jail clones, the ratio is already 2x:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME   PROPERTY     VALUE  SOURCE\nzroot  bclonesaved  100K   -\nzroot  bcloneused   100K   -\nzroot  bcloneratio  2.00x  -<\/code><\/pre>\n\n\n\n<p>A <code>bcloneratio<\/code> of 2.00x means ZFS references blocks instead of duplicating them, effectively halving the physical space used for copied data. Particularly useful for jail deployments where multiple jails share similar base files.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jail Improvements in FreeBSD 15<\/h2>\n\n\n\n<p>Jails got two upgrades worth knowing about.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">File Descriptor-Based Jail Operations<\/h3>\n\n\n\n<p>Previous versions identified jails by integer JIDs. The problem: a jail could be destroyed and recreated with the same JID between the time you looked it up and the time you acted on it. Classic TOCTOU race condition. FreeBSD 15 adds <code>jail_set()<\/code> and <code>jail_get()<\/code> via file descriptors, plus new syscalls <code>jail_attach_jd()<\/code> and <code>jail_remove_jd()<\/code>. Kevent filters can now track jail lifecycle events (creation, changes, removal) without polling.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Service Jails<\/h3>\n\n\n\n<p>Service jails confine individual daemons with minimal configuration. Instead of building a full jail with a separate filesystem, a service jail shares the host&#8217;s filesystem and isolates only the process. Configure it directly in <code>rc.conf<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sysrc nginx_svcj=\"YES\"<\/code><\/pre>\n\n\n\n<p>That single line runs Nginx inside a jail the next time the service starts. No separate root filesystem, no jail.conf entry, no epair interfaces. Service jails are ideal for quick isolation of internet-facing daemons.<\/p>\n\n\n\n<p>For full VNET jail networking with bridge and epair interfaces (where each jail gets its own IP and network stack), see our <a href=\"https:\/\/computingforgeeks.com\/freebsd-jails-vnet-networking\/\" target=\"_blank\" rel=\"noreferrer noopener\">FreeBSD Jails VNET networking guide<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nanosecond Precision in date<\/h2>\n\n\n\n<p>The <code>date<\/code> command now supports the <code>%N<\/code> format specifier for nanosecond precision. Sounds minor, but it matters for log correlation, benchmarking, and any script that needs sub-second timing.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>date '+%Y-%m-%d %H:%M:%S.%N'<\/code><\/pre>\n\n\n\n<p>Nine digits of sub-second precision:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2026-03-25 01:21:15.266045940<\/code><\/pre>\n\n\n\n<p>Unix epoch with nanoseconds:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>date '+%s.%N'<\/code><\/pre>\n\n\n\n<p>Useful for timing operations in shell scripts:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1774401675.266958911<\/code><\/pre>\n\n\n\n<p>On FreeBSD 14 and earlier, <code>%N<\/code> produced a literal <code>N<\/code> character. No error, just wrong output. Worth checking if you have scripts that were already trying to use it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Linux Compatibility: Native inotify<\/h2>\n\n\n\n<p>FreeBSD&#8217;s Linux compatibility layer (Linuxulator) now includes a native <code>inotify<\/code> implementation. Linux applications that monitor filesystem changes using inotify can now run on FreeBSD without workarounds or patches. This matters for tools like Node.js file watchers, Docker builds, and any Linux binary that relies on <code>inotifywait<\/code>.<\/p>\n\n\n\n<p>Load the Linux compatibility module and check the emulated kernel version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kldload linux64\nsysctl compat.linux.osrelease<\/code><\/pre>\n\n\n\n<p>The Linuxulator reports Linux kernel 5.15.0 to applications:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>compat.linux.osrelease: 5.15.0<\/code><\/pre>\n\n\n\n<p>That version is high enough for most Linux binaries that check for minimum kernel versions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">USB HID as the Default Input Driver<\/h2>\n\n\n\n<p>FreeBSD 15 enables <code>usbhid<\/code> by default, replacing the older <code>ukbd<\/code> (keyboard), <code>ums<\/code> (mouse), and <code>uhid<\/code> (generic HID) drivers. The new driver handles keyboards, mice, touchpads, game controllers, digitizers, and compound devices through a single unified stack.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sysctl hw.usb.usbhid.enable<\/code><\/pre>\n\n\n\n<p>Enabled by default on fresh installs:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>hw.usb.usbhid.enable: 1<\/code><\/pre>\n\n\n\n<p>If you have custom configurations referencing <code>ukbd<\/code> or <code>ums<\/code> in <code>\/boot\/loader.conf<\/code>, those still work but are redundant on 15.0.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">32-Bit Platform Retirement<\/h2>\n\n\n\n<p>FreeBSD 15 drops i386, armv6, and 32-bit PowerPC as hardware platforms. The <code>armv7<\/code> platform remains as the last supported 32-bit architecture. The practical impact for most people: none. 32-bit application support continues on amd64 through the compatibility layer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sysctl kern.features.compat_freebsd_32bit<\/code><\/pre>\n\n\n\n<p>Still available:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kern.features.compat_freebsd_32bit: 1<\/code><\/pre>\n\n\n\n<p>Existing 32-bit applications and libraries still run. What changed is that FreeBSD no longer builds or ships installation media for 32-bit only hardware. If you are still running i386 servers, FreeBSD 14 is your last stop.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Other Notable Changes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Kerberos Migration to MIT<\/h3>\n\n\n\n<p>FreeBSD 15 ships MIT Kerberos 1.22.1, replacing the Heimdal 1.5.2 implementation that FreeBSD has used for decades. MIT Kerberos has better interoperability with Active Directory and Linux environments. Heimdal will be fully removed in FreeBSD 16, so start migrating any Heimdal-specific configurations now.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">NVMe over Fabrics<\/h3>\n\n\n\n<p>NVMe-oF support via TCP transport is new in 15.0. Remote NVMe controllers can be accessed as if they were locally attached, with export support through the CAM target layer. This enables disaggregated storage architectures where compute and storage nodes communicate over standard Ethernet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Networking Improvements<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>NFSv4.2 Clone operation<\/strong> for copy-on-write file operations on ZFS (server-side copies without data transfer)<\/li>\n\n\n\n<li><strong>iwx driver<\/strong> for Intel Wi-Fi 6 M.2 adapters, plus stability fixes to <code>iwlwifi<\/code><\/li>\n\n\n\n<li><strong>ice driver<\/strong> for Intel E800 series 100Gb\/s Ethernet controllers<\/li>\n\n\n\n<li><strong>NFS privileged port enforcement<\/strong> now on by default (<code>nfs_reserved_port_only<\/code>)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Deprecated and Removed Features<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Item<\/th><th>Status<\/th><th>Alternative<\/th><\/tr><\/thead><tbody><tr><td><code>ftpd<\/code><\/td><td>Removed<\/td><td>Use <code>vsftpd<\/code> or <code>sftp<\/code> from ports<\/td><\/tr><tr><td><code>fdisk<\/code><\/td><td>Deprecated (shows migration warning)<\/td><td>Use <code>gpart<\/code><\/td><\/tr><tr><td>GEOM Vinum<\/td><td>Removed<\/td><td>Use ZFS or GEOM mirror\/stripe<\/td><\/tr><tr><td><code>agp<\/code> driver<\/td><td>Deprecated for removal in 16.0<\/td><td>Modern GPUs don&#8217;t use AGP<\/td><\/tr><tr><td><code>firewire<\/code> driver<\/td><td>Deprecated for removal in 16.0<\/td><td>USB\/Thunderbolt<\/td><\/tr><tr><td><code>readdir_r()<\/code><\/td><td>Deprecated with compile-time warnings<\/td><td>Use <code>readdir()<\/code> (thread-safe in FreeBSD)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">FreeBSD 15 Support Timeline<\/h2>\n\n\n\n<p>FreeBSD has moved to a new release cadence with quarterly point releases:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FreeBSD 15.0<\/strong>: released December 2, 2025, supported until September 30, 2026<\/li>\n\n\n\n<li><strong>FreeBSD 15.1<\/strong>: scheduled for June 2026<\/li>\n\n\n\n<li><strong>FreeBSD 15.2<\/strong>: scheduled for December 2026<\/li>\n\n\n\n<li><strong>15.x series end-of-life<\/strong>: December 31, 2029<\/li>\n<\/ul>\n\n\n\n<p>Four years of security updates for the 15.x series. Point releases bring new features, while the major version guarantees ABI compatibility.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Upgrading from FreeBSD 14<\/h2>\n\n\n\n<p>If you are running FreeBSD 14, the upgrade uses <code>freebsd-update<\/code> one last time. After that, pkgbase takes over:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>freebsd-update -r 15.0-RELEASE upgrade\nfreebsd-update install\nreboot\nfreebsd-update install<\/code><\/pre>\n\n\n\n<p>Our <a href=\"https:\/\/computingforgeeks.com\/upgrade-freebsd-14-to-15\/\" target=\"_blank\" rel=\"noreferrer noopener\">FreeBSD 14 to 15 upgrade guide<\/a> covers the complete process including gotchas like the Heimdal to MIT Kerberos migration. For fresh installations, the <a href=\"https:\/\/computingforgeeks.com\/install-freebsd-15-proxmox-kvm\/\" target=\"_blank\" rel=\"noreferrer noopener\">FreeBSD 15 installation guide on KVM and Proxmox<\/a> walks through the entire installer and post-install setup.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>FreeBSD 15.0 landed on December 2, 2025, and it changes how you manage the entire operating system. The base system is now a collection of 310 individual packages managed through pkg, the same tool you already use for ports. No more freebsd-update. Alongside that, OpenSSL 3.5 ships with quantum-resistant cryptography, and OpenSSH 10 defaults to &#8230; <a title=\"FreeBSD 15.0 New Features: pkgbase, Post-Quantum Crypto, ZFS 2.4\" class=\"read-more\" href=\"https:\/\/computingforgeeks.com\/freebsd-15-new-features\/\" aria-label=\"Read more about FreeBSD 15.0 New Features: pkgbase, Post-Quantum Crypto, ZFS 2.4\">Read more<\/a><\/p>\n","protected":false},"author":3,"featured_media":164435,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[765,299,50,75],"tags":[766,39815,205,167,209,771],"cfg_series":[39803],"class_list":["post-164434","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-freebsd","category-how-to","category-linux-tutorials","category-security","tag-freebsd","tag-freebsd-15","tag-security","tag-ssh","tag-storage","tag-zfs","cfg_series-freebsd-15-install-base"],"_links":{"self":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/164434","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/comments?post=164434"}],"version-history":[{"count":1,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/164434\/revisions"}],"predecessor-version":[{"id":164438,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/164434\/revisions\/164438"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media\/164435"}],"wp:attachment":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media?parent=164434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/categories?post=164434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/tags?post=164434"},{"taxonomy":"cfg_series","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/cfg_series?post=164434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}