Linux bare-metal bring-up
Linux is a supported platform alongside FreeBSD 14.3. Bring-up is the same shape on both: reserve hugepages, isolate the worker cores, hand the adapters to the data plane, then start the daemon and confirm the plan it logs.
Distro choice
Rocky or AlmaLinux 9 for telco and regulated environments with long support and tuned real-time profiles; Ubuntu 24.04 LTS for the newest kernel and broadest out-of-box NIC support. The deciding factor is the adapter: confirm its poll-mode driver is supported on the kernel you are standing up, and that you can either pass the device through or expose it via SR-IOV. Either distro carries the isolation and hugepage tooling the data plane needs.
Packages and toolchain
Add protobuf-c only if you are building the gNMI wire transport.
# Rocky / Alma 9 dnf groupinstall -y "Development Tools" dnf install -y meson ninja-build python3-pyelftools numactl numactl-devel \ libpcap-devel pkgconf-pkg-config clang tuned # Ubuntu 24.04 LTS apt-get install -y build-essential meson ninja-build python3-pyelftools \ libnuma-dev libpcap-dev pkg-config clang tuned
Kernel boot parameters
Isolate the worker cores from the scheduler and from IRQs, enable the IOMMU for VFIO, and reserve 1 G hugepages. Leave MAIN and CONTROL cores to the kernel and the control threads. The core lists below follow a six-lcore reference plan — reconcile against show topology after first boot.
# Intel intel_iommu=on iommu=pt \ isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3 irqaffinity=0,1,4,5 \ default_hugepagesz=1G hugepagesz=1G hugepages=8 # AMD: replace the first line with amd_iommu=on iommu=pt
Verify isolation and hugepages
Check the cmdline took effect, the isolated set matches your worker cores, hugepages are reserved, and the IOMMU came up.
cat /proc/cmdline
cat /sys/devices/system/cpu/isolated # -> 2-3
grep -i hugepages_total /proc/meminfo
dmesg | grep -i -e DMAR -e IOMMU | head
mountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepages
Binding NICs
Adapters attach through vfio-pci. The shipped bind script detects the family, excludes the management interface and applies the right attach model — worth using rather than hand-binding, because a mis-bound slot is the most common reason a first start finds no ports.