Ubuntu编译使用实时内核补丁(RT-PREEMPT kernel)并测试(亲测OK)

简介

RT-Preempt patch 是在Linux社区kernel的基础上,加上相关的补丁,以使得Linux满足实时性的需求。项目主页见:https://rt.wiki.kernel.org/index.php/Main_Page
下面的是编译和使用RT linux内核的流程,这里使用的Linux内核版本是4.4.0。

运行环境

使用的VMware虚拟机,上面安装的Ubuntu16.04 64位系统。

下载Linux内核和实时补丁文件

rt补丁下载 https://www.kernel.org/pub/linux/kernel/projects/rt/
内核源码下载 https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/
下载的内核和补丁版本号必须严格对应。

使用方法
  1. 解压内核源码
tar -zxvf linux-4.4.tar.gz
  1. 解压补丁
gunzip patch-4.4-rc6-rt1.patch.gz

注意:如果在打补丁之前,手动解压缩这个patch文件,那么就可以对这个文件进行gunzip或者bunzip操作,就像下面这样

gunzip patch-4.4-rc6-rt1.patch.gz
bunzip2 patch-4.4-rc6-rt1.patch.bz2
  1. 打补丁
cd linux-4.4
patch -p1 < ../patch-4.4-rc6-rt1.patch
  1. 安装编译内核需要的模块
sudo apt-get install libncurses-dev
sudo apt-get install libssl-dev
  1. 配置内存
make menuconfig

选择Fully Preemptible Kernel(RT)这个选项
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关闭内存溢出检测
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6. 编译Linux内核并安装

make
sudo make modules_install
sudo make install
sudo update-grub
使用实时内核

启动Ubuntu时,想进入grub选择界面,当进入VMware启动界面时,长按shift键。
在这里插入图片描述
之后就会出现grub界面:
在这里插入图片描述
在这里插入图片描述

测试实时内核

可参考以下网页:

https://blog.youkuaiyun.com/kl1125290220/article/details/78560220

https://blog.youkuaiyun.com/longerzone/article/details/16897655

sudo cyclictest -t 5 -p 80 -n  //运行5个线程,线程的优先级为80,无线循环

也可以进行多次运行并统计结果

sudo cyclictest -l10000000 -m -n -t1 -p99 -i2 -h100

-l10000000 指定1千万循环,

-m锁定当前和将来的内存分配,

-n指定使用 clock_nanosleep,

-t1指定开一个线程进行测试,

-p99指定最高优先级,

-i2指定基本线程间隔,单位是us,此处是2us,

-h100指定统计结果的分布情况。

参考文献:
https://blog.youkuaiyun.com/v6543210/article/details/80941906

<think>好的,我现在需要回答用户的问题:“在 Linux 上部署 CODESYS 时,如何验证 Preempt-RT 补丁是否生效?”首先,我得回顾一下用户之前的询问历史,确保回答的一致性和相关性。用户之前问过如何为CODESYS Runtime分配独占CPU核,现在的问题是关于验证Preempt-RT补丁是否生效。这两个问题都涉及到Linux实时系统的配置,特别是CODESYS的部署。 首先,我需要了解Preempt-RT补丁的作用。Preempt-RT实时抢占补丁)是Linux内核的一个修改版本,旨在减少系统延迟,提供更好的实时性能。对于CODESYS这样的工业自动化软件来说,实时性能至关重要,因此验证补丁是否成功应用是必要的。 接下来,我需要确定验证Preempt-RT补丁生效的方法。可能的步骤包括检查内核版本、查看内核配置参数、测试系统延迟等。用户可能需要多种方法来确认补丁的正确应用,包括命令行工具和性能测试工具。 然后,我需要考虑用户的技术背景。用户可能具备一定的Linux系统管理知识,但可能需要详细的步骤说明,特别是具体的命令和预期的输出。因此,回答需要结构清晰,分步骤说明,给出每个步骤的验证方法。 此外,用户之前的问题中提到了使用lscpu、taskset等命令,因此在本次回答中可能需要提到类似的工具,如uname检查内核版本,检查/boot/config文件的内核配置,使用cyclictest测试延迟等。 还需要注意潜在的问题,比如用户可能没有正确安装Preempt-RT补丁,或者配置参数未启用,导致验证失败。因此,在回答中可能需要包含常见问题的解决方法,或者提示用户注意的关键点。 最后,要确保回答符合用户之前接受的格式,使用分步骤说明,代码块展示命令,注意事项和常见问题部分。同时,使用中文,避免Markdown格式,但根据用户当前的指示,可能允许使用代码块等基本格式。 总结起来,回答应该包括以下步骤: 1. 检查内核版本和配置。 2. 使用工具如cyclictest进行延迟测试。 3. 查看系统日志或内核启动信息。 4. 注意事项,如权限问题、其他系统配置的影响等。 5. 常见问题解答,比如补丁未生效的可能原因。 需要验证每个步骤的正确性,确保命令的准确性,例如正确的grep参数,cyclictest的使用方法等。同时,可能需要提醒用户需要root权限运行某些命令,或者如何安装必要的测试工具。 现在,我需要将这些思路整理成一个结构清晰、逐步说明的回答,确保用户能够按照步骤验证Preempt-RT补丁是否生效,理解每个步骤的意义和可能出现的问题。</think>以下是验证 Linux 系统上 **Preempt-RT 实时补丁**是否生效的详细方法,适用于 CODESYS 部署场景: --- ### **1. 检查内核版本与配置** #### **步骤 1:确认内核版本** - 执行命令: ```bash uname -a ``` - **预期输出**: 内核名称应包含 `PREEMPT_RT` 标识,例如: ```bash Linux hostname 5.10.0-rt60 #1 SMP PREEMPT_RT ... x86_64 GNU/Linux ``` ✅ 正确标志:`PREEMPT_RT` ❌ 未生效标志:`PREEMPT`(非实时)或 `PREEMPT_VOLUNTARY`(非实时) #### **步骤 2:检查内核配置参数** - 查看内核编译配置: ```bash grep CONFIG_PREEMPT_RT /boot/config-$(uname -r) ``` - **预期输出**: ```bash CONFIG_PREEMPT_RT=y # 表示已启用实时补丁 ``` ❌ 若输出 `CONFIG_PREEMPT_RT is not set`,则补丁未生效。 --- ### **2. 测试实时延迟(核心验证方法)** #### **工具:使用 `cyclictest`** 1. **安装测试工具**: ```bash sudo apt-get install rt-tests # Debian/Ubuntu sudo yum install rt-tests # CentOS/RHEL ``` 2. **运行延迟测试**(需 root 权限): ```bash sudo cyclictest -t1 -p 99 -n -m -D 1h -i 1000 -H 1000 ``` - **参数说明**: - `-t1`:启动 1 个测试线程 - `-p 99`:设置最高实时优先级 - `-i 1000`:线程间隔 1000 微秒 - `-m`:锁定内存(避免换页延迟) - `-D 1h`:持续运行 1 小时(可选) 3. **解读结果**: 输出示例如下: ```bash # /dev/cpu_dma_latency set to 0us T: 0 ( 3608) P:99 I:1000 C: 1000000 Min: 1 Act: 2 Avg: 3 Max: 42 ``` - **关键指标**: - `Max`(最大延迟):低于 **50 微秒** 表明实时性良好(适用于工业控制场景) - `Avg`(平均延迟):通常应小于 10 微秒 ❌ 若 `Max` 超过 100 微秒,可能 Preempt-RT 未生效或系统配置有误。 --- ### **3. 验证中断与线程调度** #### **步骤 1:查看中断线程化状态** - Preempt-RT 会将大部分硬件中断转为内核线程(可调度)。执行命令: ```bash ps -eLo pid,cls,rtprio,pri,nice,cmd | grep "irq/" ``` - **预期输出**: 显示以 `irq/` 开头的线程(如 `irq/12-i915`),且调度策略为 `SCHED_FIFO`: ```bash 123 FF 99 139 - [irq/12-i915] ``` ✅ `FF` 表示 `SCHED_FIFO`(实时线程) #### **步骤 2:检查实时调度策略支持** - 验证内核是否允许设置最高优先级(99): ```bash chrt -m ``` - **预期输出**: ```bash SCHED_FIFO 最小/最大优先级: 1/99 SCHED_RR 最小/最大优先级: 1/99 SCHED_OTHER 最小/最大优先级: 0/0 ``` --- ### **4. 查看内核启动日志** - 执行命令: ```bash dmesg | grep "Preempt-RT" ``` - **预期输出**: 若补丁生效,会显示类似以下信息: ```bash [ 0.000000] Preempt-RT kernel v5.10.0-rt60 enabled ``` --- ### **注意事项** 1. **测试环境隔离**: - 关闭其他高负载进程。 - 禁用 CPU 节能模式: ```bash sudo cpupower frequency-set -g performance ``` 2. **权限要求**: - `cyclictest` 和 `chrt` 需要 root 权限(或用户加入 `realtime` 组)。 3. **硬件影响**: - 某些硬件(如旧版 BIOS 或 USB 控制器)可能导致额外延迟,需结合 `ftrace` 或 `perf` 深入分析。 --- ### **常见问题** - **Q:内核显示 `PREEMPT` 但非 `PREEMPT_RT`,是否生效?** A:未生效!标准 `PREEMPT` 仅为通用抢占,非实时补丁- **Q:`cyclictest` 延迟过高怎么办?** A:检查是否遗漏以下配置: - BIOS 中禁用 CPU C-States 和 SpeedStep。 - 内核启动参数添加 `nohz=off` 或 `nohz_full=...`。 - 使用 `isolcpus` 隔离核心(参考上一篇 CPU 隔离方法)。 --- 通过以上方法可明确验证 Preempt-RT 补丁是否生效,确保 CODESYS 在实时环境中稳定运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值