'Install RT Linux patch for Ubuntu

Trying to make my generic Ubuntu to real time Ubuntu by modifying the kernel by patching / installing RT Linux but couldn't find a straight setup. Can someone help with the steps?



Solution 1:[1]

Step 0 - Make a working directory

Make a working directory

#Move to working directory
mkdir ~/kernel && cd ~/kernel

Step 1 - Download kernel and patch

Go to https://www.kernel.org/pub/linux/kernel/ and download a desired version of kernel to ~/kernel. Similarly, go to https://www.kernel.org/pub/linux/kernel/projects/rt/ and download the RT patch with same version as the downloaded kernel version. The kernel and patch I used were linux-4.9.115.tar.gz and patch-4.9.155-rt93.patch.gz.

Step 2 - Unzip the kernel

tar -xzvf linux-4.9.115.tar.gz

Step 3 - Patch the kernel

#Move to kernel source directory
cd linux-4.9.115
gzip -cd ../patch-4.9.115-rt93.patch.gz | patch -p1 --verbose

Step 4 - Enable realtime processing This step requires libncurses-dev

sudo apt-get install libncurses-dev libssl-dev

The next command launches a graphical menu in the terminal to generate the config file.

make menuconfig

Go to the location and make the changes accordingly

##Graphical Menu##

Processor type and features ---> [Enter]
Preemption Model (Voluntary Kernel Preemption (Desktop)) [Enter]
Fully Preemptible Kernel (RT) [Enter] #Select

[Esc][Esc]

Kernel hacking --> [Enter]
Memory Debugging [Enter]
Check for stack overflows #Already deselected - do not select


[Esc][Esc]


[Right Arrow][Right Arrow]

<Save> [Enter]

.config

<Okay> [Enter]

<Exit> [Enter]


[Esc][Esc]


[Right Arrow]
<Exit> [Enter]

Step 5 - Compile the kernel

make -j20
sudo make modules_install -j20
sudo make install -j20

Step 6 - Verify and update Verify that initrd.img-4.9.115-rt93, vmlinuz-4.9.115-rt93, and config-4.9.115-rt93 are generated in /boot directory and update the grub.

cd /boot
ls
sudo update-grub

Verify that there is a menuentry containing the text "menuentry 'Ubuntu, with Linux 4.9.115-rt93'" in /boot/grub/grub.cfg file

To change default kernel in grub, edit the GRUB_DEFAULT value in /etc/default/grub to your desired kernel.

NOTE: 0 is the 1st menuentry

7 - Reboot and verify

sudo reboot

Once the system reboots, open the terminal and use uname -a to check the kernel version, it should look like the following

Linux abhay-home 4.9.115-rt93 #1 SMP PREEMPT RT Mon May 13 03:32:57 EDT 2019 x86_64 x86_64 x86_64 GNU/Linux

Note: "SMP PREEMPT RT" validates that your system is running real time kernel.

Solution 2:[2]

Here’s for Ubuntu 19.10 and above and I patched Linux 5.4.5 rt kernel patch because Linux 5.3 -- the base of Ubuntu 19.10 -- has no rt kernel patch.

0. Make a working directory

# Make dir and move to working directory
$ mkdir ~/kernel && cd ~/kernel

1. Download kernel and patch

Download kernel and rt patch from https://www.kernel.org/. You can get these below:

(kernel) https://www.kernel.org/pub/linux/kernel/
(rt patch) https://www.kernel.org/pub/linux/kernel/projects/rt/

Note that the version of rt patch and kernel should be same. I used linux-5.4.5.tar.gz and patch-5.4.5-rt3.patch.gz.

If you download these on the ~/kernel, skip below and move on to step 2.

# Move these zip file to ~/kernel
$ cd ~/Download
$ mv linux-5.4.5.tar.gz patch-5.4.5-rt3.patch.gz ~/kernel/.

2. Extract kernel sources and patch rt kernel

# Extract kernel sources
$ cd ~/kernel
$ tar xvzf linux-5.4.5.tar.gz

# Patch rt kernel
$ cd linux-5.4.5
$ gzip -cd ../patch-5.4.5-rt3.patch.gz | patch -p1 --verbose {}

3. Install required packages

For using menuconfig GUI, libncurses-dev is required. flex and bison will be needed when you compile the kernel.

# For using gui
$ sudo apt install libncurses-dev libssl-dev

# For compiling kernel
$ sudo apt install flex bison

4. Configure kernel for RT

$ make menuconfig

and enter the menuconfig GUI.

# Make preemptible kernel setup
General setup ---> [Enter]
Preemption Model (Voluntary Kernel Preemption (Desktop)) [Enter]
Fully Preemptible Kernel (RT) [Enter] #Select

# Select <SAVE> and <EXIT>
# Check .config file is made properly

Note that there’s no Check for stack overflows option on GUI configuration anymore. You can check it by searching “overflow”. Type / and overflow on Graphical Menu.

5. Compile the kernel

$ make -j20
$ sudo make modules_install -j20
$ sudo make install -j20

6. Make kernel images lighter

As @mrRo8o7 said earlier, big initrd image can occur kernel panic. So you can resolve this problem by:

# Strip unneeded symbols of object files
$ cd /lib/modules/5.4.5-rt3  # or your new kernel
$ sudo find . -name *.ko -exec strip --strip-unneeded {} +

# Change the compression format
$ sudo vi /etc/initramfs-tools/initramfs.conf
# Modify COMPRESS=lz4 to COMPRESS=xz (line 53)

COMPRESS=xz 

[:wq]

then update initramfs

$ sudo update-initramfs -u

7. Verify and update grub

Verify that directory and update the grub.

# Make sure that initrd.img-5.4.5-rt3, vmlinuz-5.4.5-rt3, and config-5.4.5-rt3 are generated in /boot
$ cd /boot
$ ls

# Update grub
$ sudo update-grub

8. Reboot and verify

$ sudo reboot

# After the reboot
$ uname -a

then you can check your new kernel version

Linux [PROMPT] 5.4.5-rt3 …

Solution 3:[3]

After installing the new kernel (like @Abhay Nayak posted), I got into a kernel panic. The problem was that the initrd image was too big. I solved that with:

Step 1 - Strip the kernel modules

cd /lib/modules/<new_kernel>
find . -name *.ko -exec strip --strip-unneeded {} +

Step 2 - Change the initramfs compression

Edit file /etc/initramfs-tools/initramfs.conf:

COMPRESS=xz

Step 3 - Update initramfs

sudo update-initramfs -u
sudo update-grub2

Solution 4:[4]

The PREEMPT_RT patch has slowly been streamed to the Linux mainline and from Ubuntu 22.04 onward it can be activated with a few simple commands as described here.


For prior versions of Ubuntu note that you can also download Debian packages for certain PREEMPT_RT kernels from the official Debian packages web page. If you do not care about the precise kernel version I would prefer that over re-compiling the kernel yourself! After downloading the Debian file you can install it from the download directory with

$ sudo dpkg -i linux-image-rt-amd64_5.10.106-1_amd64.deb
$ sudo apt-get install -f

where linux-image-rt-amd64_5.10.106-1_amd64.deb clearly depends on the version that you downloaded. Reboot into the freshly installed kernel (verify that the current kernel name indeed contains rt with $ uname -r) and you should be ready to go!


In case you really want/have to compile the kernel you might have to set the following kernel flags in the .config after $ make oldconfig (or $ make menuconfig)

CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_REVOCATION_KEYS=""

else the compilation process might fail with a cryptic error message following the steps given by the other commentators.

I have recently written a more detailed guide on the required steps here. In the process I have also written two scripts that allow you to install it from existing Debian packages or compile the kernel yourself with a graphic user interface. Have a look at the Github repository for this.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Aiden Yeomin Nam
Solution 3 mrRo8o7
Solution 4