Compile FOS kernel¶
FOS kernels (Linux kernel used by the FOG OS - a minimal Linux OS doing
all the imaging work) are updated regularly to provide drivers for newer
hardware and fix issues. The vanilla Linux kernel is used and very few
(currently none) patches are added to keep it as close to the official
source as possible. In case you want to compile your own binaries for
whatever reason you might want to follow the below instructions.
Prerequisites¶
To be able to build the kernel from source you need tools to checkout
and compile source code:
debian/ubuntu# sudo apt install git build-essential flex bison libelf-dev
fedora/centos# sudo yum install git gcc gcc-c++ make flex bison elfutils-libelf-devel
Build script¶
Within the fos repository a build script is provided:
git clone https://github.com/FOGProject/fos
cd fos
./build.sh --kernel-only --arch x64
Manual compilation¶
Checkout the code and download our config header files from github. The
header files need to be a little different for BIOS and UEFI and
therefore I usually checkout the source twice to have one ready for each
platform.
mkdir fos
cd fos
wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.10.83.tar.gz
tar xzf linux-5.10.83.tar.gz
cd linux-5.10.83/
git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
Up to this point your kernel source is prepared and ready. Now you need
to choose which architecture you want to compile for: Intel/AMD 64 bit
or 32 bit or ARM 64 bit.
Intel/AMD 64 bit¶
make mrproper
wget -O .config https://github.com/FOGProject/fos/raw/master/configs/kernelx64.config
make oldconfig
make -j $(nproc) bzImage
cp arch/x86/boot/bzImage /var/www/html/fog/service/ipxe/bzImage
Intel/AMD 32 bit¶
make mrproper
wget -O .config https://github.com/FOGProject/fos/raw/master/configs/kernelx86.config
make ARCH=i386 oldconfig
make ARCH=i386 -j $(nproc) bzImage
cp arch/x86/boot/bzImage /var/www/html/fog/service/ipxe/bzImage32
ARM 64 bit¶
make mrproper
wget -O .config https://raw.githubusercontent.com/FOGProject/fos/master/configs/kernelarm64.config
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- oldconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j $(nproc) Image
cp arch/arm64/boot/Image /var/www/html/fog/service/ipxe/arm_Image
Additional patches¶
As mentioned above the number of additional patches is kept low. For
quite some time in the 4.x kernel series we added the following patches
which are not need for 5.x kernels anymore.
drivers/net/usb/r8152.c¶
Search for
REALTEK_USB_DEVICE(VENDOR_ID_REALTEK
and add this line
{REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927)}
drivers/scsi/storvsc_drv.c¶
This is an important patch to help prevent from major performance issues
in HyperV:
https://forums.fogproject.org/topic/6695/performance-decrease-using-hyper-v-win10-clients
Search for
blk_queue_virt_boundary
Delete the line and add this instead
if (PAGE_SIZE - 1 < 4096) {
blk_queue_virt_boundary(sdevice->request_queue, 4096);
} else {
blk_queue_virt_boundary(sdevice->request_queue, PAGE_SIZE - 1);
}