跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash

Linux Ubuntu 22.04 安装实时内核补丁 PREEMPT_RT

Ubuntu 系统手动编译安装 PREEMPT_RT 实时内核的步骤。包括检查当前内核版本、下载对应源码与补丁、安装编译依赖、配置内核选项、编译安装、修改 GRUB 启动项以及设置用户实时调度权限。最后通过 rt-tests 工具测试实时性延迟。

氛围发布于 2025/11/18更新于 2026/5/2325 浏览
Linux Ubuntu 22.04 安装实时内核补丁 PREEMPT_RT

Linux Ubuntu 22.04 安装实时内核补丁 PREEMPT_RT

前言

通过 uname -r 命令查看当前版本内核,注意选择自己目前内核最接近的内核补丁和 RT 补丁并下载。根据描述在 5.15.0-64-generic 的基础上,分别安装了 5.15.167-rt79 和 5.10.225-rt117,都是可以正常运行 RT 内核的,实时性都是 OK 的。

Ubuntu 提供了 Ubuntu Pro(原 Ubuntu Advantage)的实时内核(Real-time Kernel)支持,从 Ubuntu 22.04 LTS 开始,Canonical 提供了官方维护的 PREEMPT_RT 内核作为 Ubuntu Pro 的一项服务(适用于 x86_64 和 ARM64 架构)。如果你需要订阅 Ubuntu Pro 的实时内核,可以通过下面命令进行安装:

sudo apt install linux-realtime

如果不是那么接下来需要手动编译或从第三方源获取 PREEMPT_RT 补丁。

1. 准备工作

查看当前内核版本
uname -a

本文使用环境为 Ubuntu 24.04.3 LTS,Linux 6.8.0-40-generic PREEMPT_DYNAMIC。

2. 下载内核源码和 RT 补丁

正常顺序应该是,先查 RT 补丁,再下对应主线程内核源码。

例如,你发现 patch-6.8.2-rt11.patch.xz 存在,那就说明 linux-6.8.2.tar.xz 这个主线内核版本有对应的 RT 补丁,可以组合使用。

为什么不建议先下内核再找补丁?

  • RT 补丁并非对所有主线版本都可用,很多主线版本根本没有对应补丁。
  • 即使版本接近(如 6.8.2 和 6.8.3),也可能存在不兼容,导致补丁失败或内核不稳定。

RT 补丁下载地址:https://www.kernel.org/pub/linux/kernel/projects/rt/ Linux 内核源码下载地址:https://www.kernel.org/pub/linux/kernel

本例使用:

  • RT 补丁:patch-6.8.2-rt11.patch.xz
  • 内核补丁:linux-6.8.2.tar.xz

3. 安装依赖

sudo apt update
sudo apt-get install libncurses-dev libssl-dev build-essential openssl zlibc libelf-dev minizip libidn11-dev libidn11 bison flex zstd

4. 解压内核和把 RT 补丁打进去

sudo mkdir /usr/src/rt_kernel
# 可根据下载位置进行拷贝,当然不复制也没啥~
sudo cp /path/to/linux-6.8.2.tar.xz /usr/src/rt_kernel/
sudo cp /path/to/patch-6.8.2-rt11.patch.xz /usr/src/rt_kernel/
 /usr/src/rt_kernel/
cd
sudo su
xz -cd linux-6.8.2.tar.xz | tar xvf -
cd linux-6.8.2
xzcat ../patch-6.8.2-rt11.patch.xz | patch -p1
exit

5. 配置内核

  1. 复制系统当前内核的 .config 文件(无论当前是哪个内核版本都可以)
cp -v /boot/config-6.8.0-40-generic .config
  1. 进入图形化界面配置 .config 文件
make menuconfig
  1. 需要改动的地方如下:

General Setup -> Timers subsystem -> Timer tick handling 设置为 Full dynticks system
General Setup -> Timers subsystem 开启 High Resolution Timer Support
General Setup -> Preemption Model 设置为 Fully Preemptible Kernel (Real Time) RT
Processor type and features -> Timer frequency 设置为 1000 HZ
Device Drivers -> staging drivers 设置为 不开启 ——[ ] 默认开启,按 N 取消

理论上只有高亮的两条需要配置其他都是默认的,最后 save 保存一下。

6. 编辑 Config 文件

CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_REVOCATION_KEYS=""
CONFIG_DEBUG_INFO=n
不然新内核带 debug 信息超大。

7. 编译带 RT 补丁的内核

其中 -j$(nproc) 表示使用本机的全部线程数进行编译。

下面这一条指令是最慢的,CPU 内核数越多速度越快,因为是全量编译,drivers/是最大最耗时的,其次是 fs/、net/、kernel/、arch/和 sound/。

make -j$(nproc)
sudo make INSTALL_MOD_STRIP=1 modules_install
sudo make install

8. 查看是否成功

cd /boot
ls | grep rt

查看/boot 目录下是否有生成的 rt 核心,应该包括以下 4 个文件:

  • config-6.8.2-rt11
  • initrd.img-6.8.2-rt11
  • System.map-6.8.2-rt11
  • vmlinuz-6.8.2-rt11

如果都有,则重启电脑,(在 make install #安装内核完成后)系统将把'Linux 6.8.2-rt11'列进 GRUB 菜单第一条(默认启动项)。

reboot

重启后并确认当前内核版本,后缀为 rt,就表明你已经完成!

uname -r
uname -a

9. 设置用户权限以使用 RT 实时调度(关键一步)

为了能够以用户权限调度线程(驱动程序将执行此操作),您需要通过更改 /etc/security/limits.conf 文件来修改用户的限制。

建议为实时用户设置一个组,而不是将固定的用户名写入配置文件:

sudo groupadd realtime
sudo usermod -aG realtime $(whoami)

然后,确认当前文件夹下是否包含以下内容,没有则进行添加:

sudo vi /etc/security/limits.conf
@realtime soft rtprio 99
@realtime soft priority 99
@realtime soft memlock 204800
@realtime hard rtprio 99
@realtime hard priority 99
@realtime hard memlock 204800
  • rtprio : 实时调度的优先级
  • priority : 最高调度优先级
  • memlock : 是内存锁定的大小,单位为 KB,防止应用程序的内存被交换到磁盘(即锁定内存),从而保证高性能

重新登录或重启(必须!)输入以下指令,结果一致说明配置成功~

ulimit -r
ulimit -l

10. 测试实时性

安装 rt_test 测试工具

sudo apt-get install rt-tests

运行测试 5 个线程,线程优先级 99,以 ns 单位显示时间

sudo cyclictest -t 5 -p 99 -N -m

测试结果中各项含义如下

选项中文含义
T线程
P线程优先级
C计数器。线程的时间间隔每达到一次,计数器加 1
I时间间隔为 1000 微秒 (us)
Min最小延时 (us)
Act最近一次的延时 (us)
Avg平均延时 (us)
Max最大延时 (us)

11. 启动设置

在 /etc/default/grub 中配置开机自动选择

sudo vi /etc/default/grub
GRUB_TIMEOUT=10 %超时时间,单位 s
GRUB_DEFAULT="1>2" %1 代表默认启动第 2 个内核,2 代表所启动内核 1 中的第 3 个(序号从 0 开始)

然后更新 grub

sudo update-grub

注意事项

/etc/security/limits.conf 只是把'允许'的门槛打开:让你指定的用户或组有权把线程/进程调度策略设成 SCHED_FIFO、SCHED_RR,并把优先级调到 99。它并不会自动把任何线程的调度策略改成实时。

因此:

  • 不调用 pthread_attr_setschedpolicy(..., SCHED_FIFO)(或 sched_setscheduler),线程仍然是默认的 SCHED_OTHER,优先级固定为 0。
  • 只有在你显式设置 SCHED_FIFO/SCHED_RR 并给出优先级 99 后,系统才会真正按实时线程来调度它。

给出 C/C++ 设置代码

void set_thread_realtime(int priority) {
    struct sched_param sp = { .sched_priority = priority };
    pthread_setschedparam(pthread_self(), SCHED_RR, &sp);
}
int main(int argc, char *argv[]) {
    set_thread_realtime(99); // 99 是优先级
}

常见问题

问题一:无法定位软件包 zlibc、libidn11

建议优先通过包管理器安装,若需手动安装旧版 deb 包请确保来源可靠。

手动安装旧包

# 手动安装旧包
sudo dpkg -i zlibc_*.deb libidn11_*.deb
问题二:Mac 和依赖问题
情况一:libncurses-dev,版本不对,导致依赖链断裂。

报错如图所示: 下列软件包有未满足的依赖关系:libncurses-dev : 依赖:libtinfo6 (= 6.3-2ubuntu0.1) 但是 6.4+20240113-1ubuntu2 正要被安装...

解决: 先安装(切换 root)

sudo su
apt install aptitude
aptitude install libncurses-dev

点击 n 采取降级方案,之后输入 Y。

正常的话便可以安装了

apt-get install libncurses5-dev
情况二:缺少 flex(或 bison)

报错如图所示: make[2]: *** [scripts/Makefile.host:9:scripts/kconfig/lexer.lex.c] 错误 127 make[1]: *** [/usr/src/rt_kernel/linux-6.8.2/Makefile:689:menuconfig] 错误 2 make: *** [Makefile:240:__sub-make] 错误 2

说明在生成 lexer.lex.c 时,缺少 flex(或 bison)这类词法/语法生成器。直接根据下面命令安装就可以

sudo apt install flex bison
情况三:补装常见缺失依赖

报错命令如下所示: compilation terminated. make[5]: *** [/usr/src/rt_kernel/linux-6.8.2/tools/build/Makefile.build:106:/usr/src/rt_kernel/linux-6.8.2/tools/objtool/arch/x86/decode.o] 错误 1...

建议先补充依赖

# 1. 补装常见缺失依赖
sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc

理论上处理完这一步应该就可以编译了

# 2. 如果还是不行就确认一下 gcc 版本
gcc --version
# 若 >13,建议切回 11/12
sudo apt install gcc-12 g++-12
export CC=gcc-12
export CXX=g++-12

目录

  1. Linux Ubuntu 22.04 安装实时内核补丁 PREEMPT_RT
  2. 前言
  3. 1. 准备工作
  4. 查看当前内核版本
  5. 2. 下载内核源码和 RT 补丁
  6. 3. 安装依赖
  7. 4. 解压内核和把 RT 补丁打进去
  8. 可根据下载位置进行拷贝,当然不复制也没啥~
  9. 5. 配置内核
  10. 6. 编辑 Config 文件
  11. 7. 编译带 RT 补丁的内核
  12. 8. 查看是否成功
  13. 9. 设置用户权限以使用 RT 实时调度(关键一步)
  14. 10. 测试实时性
  15. 11. 启动设置
  16. 注意事项
  17. 常见问题
  18. 问题一:无法定位软件包 zlibc、libidn11
  19. 手动安装旧包
  20. 问题二:Mac 和依赖问题
  21. 情况一:libncurses-dev,版本不对,导致依赖链断裂。
  22. 情况二:缺少 flex(或 bison)
  23. 情况三:补装常见缺失依赖
  24. 1. 补装常见缺失依赖
  25. 2. 如果还是不行就确认一下 gcc 版本
  26. 若 >13,建议切回 11/12
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型大比对:2026主流AI大模型全方位横评与选型指南
  • 电商策略自动化系统:结合数据采集与 AI 的分析实践
  • Trae AI 设计稿转代码实战:从上传到生成的全流程指南
  • Dubbo 服务降级与 Mock 机制实战指南
  • C++ 继承机制详解:访问权限、同名隐藏与派生类默认成员函数
  • 基于 GraphRAG 构建知识图谱增强 LLM 检索:以《红楼梦》为例
  • 《大模型应用开发极简入门》:GPT-4 与 ChatGPT 应用开发指南
  • SpringBoot 中药材进存销管理系统设计与实现
  • 网络安全工程师职业定义、核心技能与认证体系详解
  • JetBrains Copilot Agent Mode + MCP:从配置到实战
  • C++ 与 Linux 内核:深入剖析 open() 系统调用与文件描述符机制
  • Ubuntu 下 CUDA 环境安装与配置
  • 基于大模型的 Agent 智能体架构与实现解析
  • Flutter 三方库 modular_core 在鸿蒙系统下的适配与依赖注入实践
  • 文心大模型 4.5 开源测评与单卡部署实战
  • 基于 Higress 将现有 REST API 转换为 MCP Server 工具
  • GESP-C++ 三级考试重点与编程题模板汇总
  • Whisper Turbo:支持超99种语言的极速语音识别
  • 网络安全入门:黑客必须掌握的核心技术
  • Python 云音乐播放平台 Flask Bootstrap 管理系统

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online