ubuntu打实时内核补丁(RT-PREEMPT kernel)

#简介
RT-Preempt Patch是在Linux社区kernel的基础上,加上相关的补丁,以使得Linux满足硬实时的需求。下面是编译RT linux内核的流程,以内核3.18.59为例。
#流程

##下载代码
rt补丁下载 https://www.kernel.org/pub/linux/kernel/projects/rt/
内核源码下载 https://www.kernel.org/pub/linux/kernel/v3.0/

下载的内核和补丁版本号必须严格对应

##打补丁

解压linux源码linux-3.18.59.tar.gz,把补丁文件patch-3.18.59-rt65.patch.gz放到和内核文件夹同一目录


sudo apt-get install libncurses-dev

cd linux-3.18.59
gzip -cd ../patch-3.18.59-rt65.patch.gz | patch -p1 --verbose
或
patch -p1 < ../patch-3.18.59-rt65.patch

p0意思是不忽略目录,直接从当前目录开始、p1忽略第一层目录。进入内核目录打补丁,所以使用p1

##配置内核

make localmodconfig 
make menuconfig

make localmodconfig 根据目前系统内核的配置生成配置文件 .config

这里写图片描述
这里写图片描述

这里写图片描述
关闭内存溢出检测
这里写图片描述
这里写图片描述
这里写图片描述

##编译安装

	make -j2
	sudo make modules_install -j2
	sudo make install -j2

或者
	#fakeroot make deb-pkg
	#sudo dpkg -i *.deb

##更新grub

cd /boot
ls 
查看是否成功生成rt核
sudo update-grub
vim /boot/grub/grub.cfg 看内核是否添加到grub

如果自动安装失败,就需要手动修改 /boot/grub/grub.conf 去配置启动项,如下图,

这里写图片描述

##校验
重新启动系统,uname -a命令查看 有PREEMPT RT 字样内核替换成功
这里写图片描述

#引用

https://ubuntuforums.org/showthread.php?t=2273355
http://blog.csdn.net/zzsfqiuyigui/article/details/7621665
http://blog.csdn.net/sakaue/article/details/17629917
http://www.linuxidc.com/Linux/2015-09/123227.htm
https://rt.wiki.kernel.org/index.php/Main_Page
http://elinux.org/RT-Preempt_Tutorial
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git/
http://developer.toradex.com/knowledge-base/real-time-linux#Realtime_Optimization
http://git.linaro.org/kernel/linux-linaro-stable.git

<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 在实时环境中稳定运行。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值