freebsd logo

Sometimes it’s necessary to build a new kernel to add some modules. In my case, it’s adding RACK TCP Stack.

Requirements:

  • node to compile the kernel
  • servers to receive and boot the new kernel

Compile the new kernel

Check sources

First, a little check that sources are available:

ls /usr/src/sys/amd64/conf/

if it’s not the case, you need a few steps (for example with FreeBSD 13.1-RELEASE on AMD64):

cd /tmp
fetch http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/13.1-RELEASE/src.txz
tar -zxf -C / src.txz
rm src.txz
freebsd-update fetch install

New kernel: RACK

Sources are available so it’s time to create the configuration file, build the kernel and install it.

Create the configuration file

cat > /usr/src/sys/amd64/conf/RACK <<EOF
include GENERIC
ident RACK
makeoptions WITH_EXTRA_TCP_STACKS=1
options RATELIMIT
options TCPHPTS
EOF

Time to build and install it

make -j 8 KERNCONF=RACK buildkernel
make installkernel KERNCONF=RACK KODIR=/boot/kernel.rack

Deployment

local node

rsync -avz --progress -h /boot/kernel.rack REMOTE_NODE:/tmp

remote node

As root:

mv /tmp/kernel.rack /boot/
chown -R root:root /boot/kernel.rack

Configure /boot/loader.conf like:

kernel="kernel.rack"
bootfile="kernel.rack"
module_path="/boot/kernel.rack"
autoboot_wait="0"
autoboot_delay="0"
beastie_disable="YES"
boot_serial="YES"
loader_logo="none"
cryptodev_load="YES"
cc_htcp_load="YES"

New lines added from the configuration in my previous post: Install FreeBSD 13.1 on Oracle Cloud:

  • kernel=“kernel.rack”
  • bootfile=“kernel.rack”
  • module_path="/boot/kernel.rack"
  • cc_htcp_load=“YES”

Add at the top of /etc/rc.conf

kld_list="${kld_list} /boot/kernel.rack/tcp_bbr.ko"

Now, a little sysctl configuration to use the new stack

cat >> /etc/sysctl.conf <<EOF
net.inet.tcp.cc.algorithm=htcp
net.inet.tcp.functions_default=bbr
net.inet.tcp.functions_inherit_listen_socket_stack=0
EOF

Reboot on the new kernel

reboot

Conclusion

It’s not very complicated to build and deploy this kernel including RACK stack (HTCP and BBR)

At scale, it’s needed to build a pkg and use an internal repository.