linux实时内核Preempt编译安装

1.准备工作

系 统 : Ubuntu16.04.6
内核版本 : Linux-4.15.0-72
目标内核 : Linux-4.19.72-rt26
下载地址 : https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/ (下载内核)
https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/ (下载补丁)
国内镜像 : https://mirrors.aliyun.com/linux-kernel/ (内核下载速度快)
安装依赖 :sudo apt-get install -y build-essential kernel-package libncurses5-dev

2. 安装实时补丁

1
2
3
4
5
6
7
8
makdir rt_linux_build  ##创建个文件夹用来存放编译所需文件
cd Download ##进入下载文件保存目录
cp linux-4.19.72.tar.xz patch-4.19.72-rt26.patch.xz ~/rt_linux_build ##拷贝内核源码和补丁文件
cd ~/rt_linux_build/
xz -cd linux-4.19.72.tar.xz | tar xvf - ##解压源码
xzcat ../patch-4.19.72-rt26.patch.xz ##解压补丁
cd linux-4.19.72/ ##进入内核源码目录
patch -p1 < ../patch-4.19.72-rt26.patch ##安装补丁

3. 拷贝系统通用内核默认内核配置

1
2
3
4
cp /boot/config-4.15.0-72-generic  .config
##安装内核编译一些依赖工具(可能部分工具安装不上,需要翻墙)
sudo apt-get build-dep linux
sudo apt-get install libncurses-dev flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf fakeroot ##装不上的先跳过

读取写入通用内核配置项目

1
yes '' | make oldconfig

编译裁减内核项

1
make menuconfig

配置项完整内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Enable CONFIG_PREEMPT_RT
-> General Setup
-> Preemption Model (Fully Preemptible Kernel (Real-Time))
(X) Fully Preemptible Kernel (Real-Time)

# Enable CONFIG_HIGH_RES_TIMERS
-> General setup
-> Timers subsystem
[*] High Resolution Timer Support

# Enable CONFIG_NO_HZ_FULL
-> General setup
-> Timers subsystem
-> Timer tick handling (Full dynticks system (tickless))
(X) Full dynticks system (tickless)

# Set CONFIG_HZ_1000 (note: this is no longer in the General Setup menu, go back twice)
-> Processor type and features
-> Timer frequency (1000 HZ)
(X) 1000 HZ

# Set CPU_FREQ_DEFAULT_GOV_PERFORMANCE [=y]
-> Power management and ACPI options
-> CPU Frequency scaling
-> CPU Frequency scaling (CPU_FREQ [=y])
-> Default CPUFreq governor (<choice> [=y])
(X) performance

部分内核版本编译项目存在差异,实时内核运行需要确保核心配置生效才能正常使用,内核项目的配置会对实时性造成影响,后续若是实时性不满足要求,则需要对裁减项进行深度优化,这部分是需要深层次学习的。

确保:
  • General setup —> Preemption Model —> Fully Preemptible Kernel (RT) selected
  • Kernel hacking —> Memory Debugging —> Check for stack overflows not selected

    4.编译内核(10-30min on a modern cpu)

    1
    make -j `nproc` deb-pkg

    5.安装内核

    1
    2
    ls ../*deb ##编译完成后会产生4个.deb结尾的安装包
    sudo dpkg -i ../*.deb ##可以全部安装,也可以只安装header ,image两个包

    6.更改内核启动项

    1
    sudo update-grub   ##更新内核配置项
    执行上述命令,得到类似下面结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sourcing file `/etc/default/grub'
    Sourcing file `/etc/default/grub.d/init-select.cfg'
    正在生成 grub 配置文件 ...
    找到 Linux 镜像:/boot/vmlinuz-5.13.0-52-generic
    找到 initrd 镜像:/boot/initrd.img-5.13.0-52-generic
    找到 Linux 镜像:/boot/vmlinuz-5.13.0-51-generic
    找到 initrd 镜像:/boot/initrd.img-5.13.0-51-generic
    找到 Linux 镜像:/boot/vmlinuz-.419.72-rt26
    找到 initrd 镜像:/boot/initrd.img-4.19.72-rt26
    找到 Windows Boot Manager 位于 /dev/sda1@/efi/Microsoft/Boot/bootmgfw.efi
    找到 Ubuntu 18.04.2 LTS (18.04) 位于 /dev/sdb2
    Adding boot menu entry for UEFI Firmware Settings
    完成
    修改/etc/default/grub 文件内容,选择“boot/vmlinuz-.419.72-rt26” 第五个内核项编号项为4,修改内容如下:
    1
    GRUB_DEFAULT="1> 4"
    再次执行grub更新,使修失败改生效。
    1
    sudo update-grub

7. 重启并验证

重启后在终端命令行输入 uname -r

1
2
uname -r
4.19.72-rt26

注:第六步grub引导文件修改错误会导致进入系统失败,内核编译有问题也会导致进入系统失败。