Ubuntu上编译 Linux_RT 内核
实时Linux内核常见的有 PREEMPT_RT 和 Xenomai,其中 PREEMPT_RT 是将Linux内核以打补丁的形式来实现抢占式实时性。Xenomai 的架构为双内核,其中实时性任务又 Xenomai 内核来执行,非实时性的任务由通用Linux内核来执行。
在此记录编译安装 PREEMPT_RT 补丁的内核过程。
一、编译安装
1. 下载 Linux 内核源码和对应版本的 preempt_rt 补丁源码
Linux内核源码下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/
PREEMPT_RT 补丁源码下载地址:https://wiki.linuxfoundation.org/realtime/preempt_rt_versions
要保证所下载的 Linux内核源码版本 和 PREEMPT_RT 所对应的版本匹配,否则可能编译失败。
在此使用的是 5.4.182 版本的Linux内核和补丁。
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.182.tar.gz
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.4/patches-5.4.182-rt72-rc1.tar.gz
2. 解压及安装依赖项
在Linux上新建对应的目录来存放Linux源码和对应的补丁包,如将下载的 linux-5.4.182.tar.gz和 patches-5.4.182-rt72-rc1.tar.gz 放入到 kernelRT 目录下,并进入到该目录。
mkdir kernelRT
cd kernelRT
2.1 安装依赖
sudo apt-get update
sudo apt-get build-dep linux
sudo apt-get install autoconf automake make bc bison flex libtool libncurses-dev libelf-dev libssl-dev libudev-dev libpci-dev libiberty-dev openssl dkms fakeroot zstd net-tools
2.2 解压缩文件并打补丁
// 将Linux源码解压到当前位置
tar -zxvf linux-5.4.182.tar.gz
// 将补丁解压到当前位置
gunzip patches-5.4.182-rt72-rc1.tar.gz
// 进入Linux源码目录下,进行打补丁
cd linux-5.4.182
patch -p1 < ../patch-5.15-rt17.patch
3. 自定义部分编译配置
3.1 生成相关的内核配置文件
内核的配置文件有两种生成方式,如下:
方法一、直接复制当前系统的内核配置,然后有新增项时自动设置为默认值
// 复制当前系统的内核作为要编译内核的配置
cp -v /boot/config-$(uname -r) .config
// 所有配置设为默认
yes '' | make oldconfig
方法二、根据当前系统中加载的模块生成一个最小配置文件,自动启用当前系统中使用的模块,并禁用未使用的选项,适用于针对当前硬件和模块精简内核配置,以减小编译的内核体积,提供性能。
make localmodconfig
3.2 修改调整内核的一些配置项
// 打开内核配置界面
make menuconfig
要实现实时性,需要调整以下的配置项
CONFIG_PREEMPT_RT对应的 Preemption Model 选择 (X) Fully Preemptible Kernel (Real-Time) 如下
![]()
CONFIG_HIGH_RES_TIMERS对应的 Timers subsystem 选择 [*] High Resolution Timer Support 如下![]()
CONFIG_NO_HZ_FULL对应的 Timer tick handling 选择 (X) Full dynticks system (tickless)![]()
CONFIG_HZ_1000对应的 Timer frequency 选择 (X) 1000 HZ,如下![]()
- Enable loadable module support 启动加载模块支持对应的选项中,需要将
Module signature verification取消选中,否则在安装部分模块的过程中由于没有签名导致安装失败,如下图:![]()
- Cryptographic API > Certificates for signature checking 选项设置中
Additional X.509 keys for default system keyring,Provide a keyring to which extra trustable keys may be added,Provide system-wide ring of blacklisted keys都需要取消选中,如下图![]()
- Kernel hacking > Compile-time checks and compiler options对应的选项中 要把编译内核调试信息
Compile the kernel with debug info取消选中,否则编译出来的内核镜像太大,导致新内核在加载时无法分配对应的内存启动失败,如下图![]()
设置完成后,保存并退出该配置界面。
4. 编译内核
在设置完以上的所有选项之后,开始编译内核
// 根据自己系统的核心数来设置对应的数字,查看核心指令 echo $(nproc)
make -j4
sudo make modules_install -j4
sudo make install -j4
5. 修改启动项
安装完成之后,重新启动时,进入高级设置里面,可以选择启动实时内核。如果需要默认以实时内核来启动,需要配置和更新对应的grub
//打开grub
sudo vim /etc/default/grub
根据界面的选项顺序修改 GRUB_DEFAULT 的内容,索引从0开始
修改完之后需要 sudo update-grub 来更新配置
二、实时性测试
// 安装测试模块
sudo apt install rt-tests
// 进行循环测试 -t 后为线程数, -p后为优先级
sudo cyclictest -t 16 -p 90
三、可选项操作
1. 重新编译
在一些情况下会出现编译报错,需要进行重新编译,此时清空之前的编译内容即可
// 清除编译过程中生成的文件,但是会保留 config
make clean
// 更彻底的清理,会把config配置文件也清理掉,后续重新编译前,需要重新配置
make mrproper
// 卸载 /lib/modules/ 中的编译的新内核,因为 sudo make modules_install 会把模块安装到这个目录下
2. 打包编译内核为deb包
以上编译的新内核,如果需要移植到其它的设备上,为了不再进行重新编译,可以直接将其打包成 .deb 包,然后拷贝到目标设备直接安装。
(1)、打包编译的内核
// 进入到编译内核的源代码目录下,执行如下打包命令
make bindeb-pkg -j$(nproc)
该命令执行完成之后,会在源代码目录的上一层路径下,通常生成三个 deb 包,类似如:
linux-image-<version>-<custom_name>_amd64.deb: 包含内核镜像 (vmlinuz) 和模块 (.ko 文件)。这是最重要的包linux-headers-<version>-<custom_name>_amd64.deb: 包含内核头文件,用于编译第三方内核模块(如各种驱动)linux-libc-dev-<version>-<custom_name>_amd64.deb: 包含内核提供给用户空间的 API 头文件。
(2)、拷贝安装
将这三个 deb 包拷贝到目标设备上,放到一个自定义目录下,进行安装
// cd 到该目录下,安装该目录下的所有 deb 包。
sudo dpkg -i *.deb
// 安装之后重启验证
sudo reboot
【参考资料】
Ubuntu20.04编译内核安装preempt_rt实时补丁
Ubuntu编译安装实时内核
实时Linux内核(PREEMPT_RT)的编译安装以及测试
Building the PREEMPT_RT-patched Linux Kernel
有利于提高xenomai /PREEMPT-RT 实时性的一些配置建议







浙公网安备 33010602011771号