This repository contains preconfigured amd64 FreeBSD Kernel Configs, mainly for various virtual servers or cloud based systems. These configs can be used as a base for your own custom kernels on actual hardware or in the cloud. Currently, the configs are for FreeBSD version 13.0.
Even though some of the functionality in the kernel of FreeBSD is contained in modules, building a custom kernel provides:
- Faster boot times
- Lower memory usage
- Lower storage requirements
- Possibility of including drivers/functionality not included by the base kernel
- Faster kernel build times if rebuilding from source
- Slightly more secure as the attack surface is smaller because unused code is removed
- If you use
freebsd-update
to keep your system up to date, that utility will stop working if you have a custom kernel. - If you do not know what hardware you have, installing a custom kernel can prevent your system from booting, requiring you to go through a recovery procedure (which may consist of booting off recovery media, mount the root partition, move /boot/kernel to /boot/kernel.bad, move /boot/kernel.old to /boot/kernel, and rebooting, tho your mileage may vary)
- You don't have the time, desire, or need to build your own kernel
The files are:
- BASE - ALL other configs import this file. This file is the bare minimum configuration with most bells and whistles removed. This config will probably not work on its own as it removes all of the NIC drivers and most storage drivers. This file imports the GENERIC config file and disables most of the items that I think are unnecessary for most of my configurations. The advantage of importing GENERIC (Instead of copying what is necessary) is when GENERIC is updated, a rebuild will include any new features or functionality added to GENERIC which may be necessary to boot the system.
- VMWARE - Build for a VMware system, ie ESXi, Fusion, or VMware Workstation
- AZURE - Build for Microsoft's Azure, Hyper-V, or Virtual PC
Future/Untested config files:
- GOOGLE - Build for the Google Compute Engine
- AWS - Build for Amazon Web Services EC2
Make sure to have the latest stable sources at /usr/src.
Copy all these files into the following directory on a FreeBSD system:
/usr/src/sys/amd64/conf
Note, there is a make build variable 'KERNCONFDIR' that can be set to override the directory where the KERNCONF file is at. But since the BASE config file references the default GENERIC kernel config located in the default directory, setting this variable will not work as it will not find the GENERIC kernel. Until setting this variable allows multiple directories or checks the base directory in its search, this option is not viable.
cd /usr/src
make buildkernel KERNCONF=VMWARE
make installkernel KERNCONF=VMWARE
If you rebuild your kernel often, it is simpler to place the KERNCONF assignment in /etc/make.conf
:
KERNCONF=VMWARE
And build without the assignment on the command line:
cd /usr/src
make buildkernel
make installkernel
If the options INCLUDE_CONFIG_FILE
was set on the kernel when it was built (which is set on the default GENERIC kernel), you can use the config
command to extract the kernel build options. To see what options are in your existing kernel, type the following command:
config -x /boot/kernel/kernel | more
cd /usr/src/sys/amd64/conf
make LINT
more LINT
While this will list the possible options, it will not tell you what those options do. The /usr/src/sys/amd64/conf/NOTE
file may provide some insight into some of the options, but be aware that there is a lot of limited documented options.
If you build your kernel using the 'buildkernel', 'installkernel' method, the following procedure 'may' work:
Upon booting, you should encounter the FreeBSD boot loader screen that says "Welcome to FreeBSD", hit '5' to change the kernel to use kernel.old
. Then hit Enter
to boot the old kernel. Once you have logged in, type the following to restore your old kernel
mv /boot/kernel /boot/kernel.bad
mv /boot/kernel.old /boot/kernel
reboot
This one liner will list the drivers the kernel has detected. After booting up, log in and run the following:
dmesg | grep '^[[:lower:]_]*[0-9]:' | cut -d ':' -f 1 | sed -r 's/[0-9]*//g' | sort -u
FreeBSD Handbook on If Something Goes Wrong FreeBSD Handbook on Building a Custom Kernel