How-to Kernel Compile (with Optional Real-Time (RT) Patch)

Summary

   wget <k_ver>.tar.gz && tar xzf <k_ver>.tar.gz OR git clone <rep>  // Get sources 
   wget http://www.kernel.org/pub/linux/kernel/projects/rt/<>/patch-<>.patch.bz2  // (optional) Get RT patch 
   cd <kernel_src_root_dir>
   bzcat ../patch-<kernel_version>-rt.bz2 | patch -p1   // (optional) Get RT patch 
   cp /boot/config-$(uname -r) .config  // Copy configuration if supported by the current kernel
   make oldconfig
   make menuconfig  // Select Processor type and features -> Preemption model -> Fully Preemptive Kernel (RT)
   make-kpkg clean
   CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers
   cd .. && sudo dpkg -i linux-image* linux-headers*
   sudo rm /lib/modules/`uname -r`/build  //Fix broken link
   ln -s  /usr/src/linux-headers-`uname -r` /lib/modules/`uname -r`/build

On a Debian-based system, make-kpkg utility not only compiles the kernel but also generates the .deb packages to ease installation.

Prerequisites

   sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev

Switch to a directory (you don't need to have superuser privileges) and get the source from here. You can download the full source file or use git clone to fetch from the repository. Extract source code and enter into the new directory named after the kernel version.

Enter the new directory

    cd <kernel_src_root_dir>

(optional) If you want to compile the full preemptive kernel, you need the RT patch. You can download the appropriate version from | here. The version of the patch should match the kernel version. You have to patch the sources with patch -p1

   bzcat ../patch-<kernel_version>-rt.bz2 | patch -p1

The current kernel configuration can be used by coping the config-<kernel_ver> file to the src_root of the new kernel. This is not supported from all kernels but it is the default case on the latest Debian/Ubuntu kernels

Copy old configuration

    cp /boot/config-$(uname -r) .config

(optional) Set the new compilation options. If you don't do that the default options are going to be used.

     make oldconfig

(optional) You can specify more options by using the menuconfig utility.

    make menuconfig

Important on RT kernels to set under the

    Processor type and features -> Preemption model -> Fully Preemptive Kernel (RT)

You can compile the kernel by running

    make-kpkg clean
    CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers

If you encounted an error like

   /etc/kernel/postinst.d/apt-auto-removal: cannot create /etc/apt/apt.conf.d//01autoremove-kernels.dpkg-new: Permission denied 

install the updated kernel-build package to fix the bug.

At this point two packages one directory up should have been created. One for the kernel binaries and one for the kernel headers. You can install finally the new kernel by

    cd .. && sudo dpkg -i linux-image* linux-headers*

An issue when following the make-kpkg is that the resulting kernel points to the headers and source of the directory that you compiled from. E.g. if you used ~/kernel/3.4.10 then under /lib/modules/3.4.10/build points to ~/kernel/3.4.10 instead of /usr/src/linux-headers-3.4.10. That may lead to problems if you modify (e.g. apply an other patch) or move the code to a different location. You should fix the link when you boot to the new kernel by

   sudo rm /lib/modules/`uname -r`/build
   ln -s  /usr/src/linux-headers-`uname -r` /lib/modules/`uname -r`/build

Kernel Configuration

  Offload RCU callback processing from boot-selected CPUs (EXPERIMENTAL (RCU_NOCB_CPU) [N/y/?] y 
  Proc types and features -> Preemption Model ->  FULL_RT
  Proc types and features -> Timer Frequency -> Timer_Freq 1000
  Power Management and ACPI option -> ACPI enable
  Power Management and ACPI option -> ACPI -> enable only Power Management Timer Support
  Power Management and ACPI option -> CPU Freq scaling disable 
  Power Management and ACPI option -> CPU Idle disable 
  Gen Setup -> Timers Subsystem -> High res timer
  Gen Setup -> Timers Subsystem -> Idle dynticks system (tickless idle)

Test Real-Time Kernel

Use cyclictest to check the latency of the RT kernel after installation.

Alternative src compilation and kernel installation procedure (obsolete)

   make bzImage 
   make modules 
   sudo make modules_install 
   sudo make install (or copy bzImage to /boot)
   sudo update-grub

RT Kernel and NVidia graphics card

  • Uninstall the proprietary if there are already installed
   sudo apt-get remove --purge nvidia-*
  • Download driver and rt-patch from | here.
  • Extract files and patch with nvidia-rt
   bash NVIDIA-Linux-x86_64-*.run --extract-only
   cd NVIDIA-Linux-x86_64-*/kernel
   patch -p1 < ../../patch-3.0-rt-nvidia.patch
  • If you want your module to be compiled for each kernel update (hopefully skipping this procedure) install Dynamic Kernel Module Support (DKMS)
    sudo apt-get install dkms
  • Exit all X seesions and run nvidia installer. If you wish approve registration to DKMS
   bash NVIDIA-Linux-x86_64-*/nvidia-installer.sh

Note: if DKMS fail to compile the modules you can update them manually by

   sudo dkms autoinstall -k <kernel_name>