A translation layer for people who already run Gentoo in anger: the same jobs, the FreeBSD 15.x way. Mapping tables first, commands second, traps last.
Gentoo is a meta-distribution assembled from upstream projects by Portage. FreeBSD is one operating system (kernel plus userland, one source tree, one release team) with third-party software layered on top through ports.
Dimension
FreeBSD 15
Gentoo
Unit of the OS
base (kernel + userland from src) and ports (everything in /usr/local)
Every component is a package, including the toolchain and libc
Default delivery
Binary: freebsd-update or pkgbase for base, pkg for ports
Source: emerge; official binhost is optional
Customisation knob
Port OPTIONS, src.conf WITHOUT_* knobs, kernel config
USE flags, CFLAGS, profiles, package.* files
Release cadence
Fixed: minor releases on a schedule, major every two years
Rolling; profiles mark ABI eras (23.0)
Init
BSD rc.d with rc.conf
OpenRC or systemd
Config location
Base in /etc, ports in /usr/local/etc
Everything in /etc
Filesystem of choice
ZFS is first-class in base and the installer
Any; ZFS is an out-of-tree package
Containers
Jails (kernel native)
Namespaces + cgroups (Docker, Podman, LXC)
Documentation
Handbook, man pages are authoritative and current
Wiki and Handbook, upstream man pages
02Release and support model
The single biggest operational difference: on FreeBSD you track a supported point release and plan a jump; on Gentoo you never stop moving.
Item
Value
Note
15.0-RELEASE
2 Dec 2025
EoL 30 Sep 2026; move to 15.1 now
15.1-RELEASE
16 Jun 2026
Supported until 31 Mar 2027
stable/15 branch
until 31 Dec 2029
Branch support cut from five to four years starting with 15
Next major
16.0
Planned for Dec 2027; file sets and freebsd-update are planned to go away in favour of pkgbase
Branches
releng/15.1, stable/15, main
Roughly: stable ~ ~amd64 mindset, main ~ live ebuilds
pkg repos
quarterly / latest
quarterly is the stable default; latest tracks ports HEAD
Gentoo equivalent
stable vs ~arch keywords
Profile switch (for example 17.1 to 23.0) is the nearest thing to a major upgrade
where am I
freebsd-version -kru # installed kernel, running kernel, userland
uname -a
pkg -vv | grep -A3 url # which pkg repo branch is active
03Package management: pkg vs emerge
pkg is a binary manager with a SQLite database in /var/db/pkg. Think of it as Portage with --getbinpkgonly forced on, plus apt-like ergonomics.
Task
FreeBSD
Gentoo
sync and update
Refresh catalogue
pkg update -f
emaint sync -a
Upgrade everything
pkg upgrade
emerge -avuDN @world
Show pending upgrades
pkg version -vIL=
emerge -puDN @world
Read news
/usr/ports/UPDATING, pkg updating
eselect news read
install and remove
Install
pkg install nginx
emerge -av www-servers/nginx
Remove
pkg delete nginx
emerge --deselect nginx then depclean
Remove orphans
pkg autoremove
emerge -a --depclean
World set
pkg prime-list (non-automatic packages)
/var/lib/portage/world
Mark as explicitly wanted
pkg set -A 0 pkgname
emerge --noreplace pkg
Pin a version
pkg lock pkgname
package.mask with > atom
query
Search
pkg search -x '^nginx'
eix nginx / emerge -s
Info
pkg info -f nginx
equery meta, emerge -pv
Files of a package
pkg info -l nginx
equery files / qlist
Owner of a file
pkg which /usr/local/sbin/nginx
equery belongs / qfile
Reverse deps
pkg info -r pkgname
equery depends
Built options
pkg query '%Ok %Ov' nginx
equery uses
Integrity check
pkg check -sa (checksums), pkg check -d
qcheck, emerge @preserved-rebuild
Clean cache
pkg clean -a
eclean-dist, eclean-pkg
No slots. FreeBSD ships parallel versions as separate package names (python311, python312, postgresql17-server), not as slots of one atom. Default versions are set ports-wide via DEFAULT_VERSIONS in /etc/make.conf, which is the closest thing to eselect.
04Building from source: ports, OPTIONS and poudriere
If you want the Gentoo experience on FreeBSD, the answer is poudriere, not building ports in place. poudriere builds in clean jails and publishes a pkg repo, which is exactly a private Gentoo binhost.
Do not mix freely. Building one port in /usr/ports on a box that otherwise uses the official quarterly repo works, until the next pkg upgrade replaces it with the stock build. Either pkg lock it, or move the whole box to your own poudriere repo.
05Updating the base system
Gentoo has one update path. FreeBSD 15 has three for the base system, and you pick one per host. pkgbase is the future; in 15.x it is an optional technology preview chosen at install time.
fig 1 · base update paths in FreeBSD 15 vs the single Gentoo path; ports packages always go through pkg
Path
Patch level
Major / minor jump
Fit
freebsd-update
freebsd-update fetch install
freebsd-update -r 15.1-RELEASE upgrade
default GENERIC kernel, binary shops
pkgbase
pkg upgrade -r FreeBSD-base
Repoint repo ABI, then pkg upgrade (follow relnotes)
15.x preview one tool for base and ports, BE friendly
source
git pull releng/15.1, rebuild
Switch branch, rebuild
Gentoo-like custom kernel, src.conf knobs
binary minor upgrade
bectl create pre-15.1 && bectl list
freebsd-update -r 15.1-RELEASE upgrade
freebsd-update install # kernel
shutdown -r now
freebsd-update install # userland
pkg upgrade -f # only on a major jump
freebsd-update install # remove old libs
source build (the Gentoo way)
git -C /usr/src pull
cd /usr/src
make -j$(sysctl -n hw.ncpu) buildworld buildkernel
make installkernel && shutdown -r now
etcupdate -p
make installworld
etcupdate -B
make delete-old delete-old-libs
Pick one per host. From 15.1, a system installed from pkgbase packages refuses installworld and installkernel, to keep the package database consistent. Build packages with make packages or poudriere instead.
06Merging configuration
Task
FreeBSD
Gentoo
Three-way merge of /etc
etcupdate (replaced mergemaster)
dispatch-conf / etc-update
Show conflicts
etcupdate status, etcupdate resolve
find /etc -name '._cfg*'
Protected paths
Everything in /etc; ports configs ship as *.sample
CONFIG_PROTECT
Ports config upgrade
pkg keeps your file if it differs from the old sample
sys/amd64/conf/MYKERN with include GENERIC, nodevice
make menuconfig, .config
Build and install
make buildkernel installkernel KERNCONF=MYKERN
make && make modules_install install
Initramfs
None needed (loader preloads modules)
dracut, installkernel
List / load modules
kldstat, kldload, kldunload
lsmod, modprobe, rmmod
Load at boot (early)
if_wg_load="YES" in loader.conf
Built in, or initramfs
Load at boot (late)
sysrc kld_list+="vmm"
/etc/modules-load.d/*.conf
Kernel params
Tunables in loader.conf, runtime sysctl / /etc/sysctl.conf
Kernel cmdline, /etc/sysctl.d/
Fallback kernel
/boot/kernel.old, select at loader menu, or a boot environment
Older entry in GRUB
Scheduler choice
15.1kern.sched.name tunable at boot
Kernel config (EEVDF default upstream)
08Services and init
rc.d is closest to OpenRC in spirit (shell scripts with dependency keywords via rcorder), but enablement lives in rc.conf variables instead of runlevel symlinks.
sysrc pf_enable=YES pflog_enable=YES
cat > /etc/pf.conf <<'EOF'
ext_if = "em0"
set skip on lo
block in log all
pass out quick keep state
pass in on $ext_if proto tcp to port { 22 443 }
EOF
pfctl -nf /etc/pf.conf && service pf start
GEOM is the block layer (think device-mapper, but composable as classes). ZFS is in base, shares the release cycle, and boot environments are a native workflow rather than a project.
Task
FreeBSD
Gentoo
Disk names
ada0 (SATA), nda0 (NVMe), da0 (SCSI / USB)
sda, nvme0n1
List disks
geom disk list, camcontrol devlist, nvmecontrol devlist
lsblk
Partitioning
gpart show, gpart add -t freebsd-zfs
fdisk, parted, sgdisk
Labels
gpart add -l then /dev/gpt/label
/dev/disk/by-partlabel/
Software RAID
gmirror, graid, or ZFS
mdadm
Encryption
geli, or ZFS native encryption
LUKS (cryptsetup)
ZFS module
In base, version tied to the release (OpenZFS 2.4 in 15)
sys-fs/zfs + zfs-kmod, rebuild per kernel
Boot environments
bectl create / activate / list
ZFSBootMenu or manual datasets
I/O live view
gstat -p, zpool iostat -v 1
iostat -x 1, iotop
SMART
smartmontools from ports
sys-apps/smartmontools
fstab quirks
No UUID mounts by default; use GPT labels
UUID / PARTUUID
freebsd: boot environment routine
bectl create pre-change # snapshot + clone of the root dataset# ... upgrade, break things ...
bectl activate pre-change # roll back on next boot
bectl activate -t pre-change # temporary: one boot only
bectl destroy -o old-be # remove with its origin snapshot
0 коментара