ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu 24.04 源码编译 Xenomai 4 实时内核完整指南

Ubuntu 24.04 源码编译 Xenomai 4 实时内核完整指南 1. 项目概述与环境定位1.1 这套方案到底解决什么问题Xenomai 4 是实时 Linux 领域近几年最具颠覆性的一个版本它抛弃了老一代 Xenomai 3 依赖的 I-pipe中断流水线机制转向了 Dovetail EVL 双内核架构。简单说双内核就是让一颗 CPU 上同时存在两个内核——一个是用于跑业务逻辑和文件系统的 Linux 内核另一个是专门处理硬实时的 EVL 核心。EVL 核心接管中断和调度后实时任务的延迟可以从普通 Linux 的几十毫秒抖动压到个位数微秒级别。我之所以在 Ubuntu 24.04 下折腾这套东西是因为工作里需要给一套六轴机械臂的轨迹规划加实时控制环之前用 PREEMPT_RT 单内核方案在高负载下偶尔会冒出 1ms 以上的尖峰这对 1kHz 控制频率来说是不可接受的。这篇博文的完整流程覆盖了从准备编译环境、给 Linux 内核打 Dovetail 补丁、把 EVL 核心编进内核、再到用户态 libevl 库的编译和延迟测试。适合正在评估实时方案的运动控制、机器人、CNC、数据采集从业者也适合对 Linux 内核编译有一定基础、想理解双内核架构怎么落地的同学。如果你完全没编译过内核按本文走也能完成但建议先了解基本的 make menuconfig 操作。1.2 Ubuntu 24.04 的特殊性在哪里Ubuntu 24.04 默认内核是 6.8 系列而这恰恰是第一个需要特别注意的坑点。Xenomai 4 的 Dovetail 补丁并不是跟着 Ubuntu 内核走的它有自己维护的版本线。Dovetail 补丁社区通常优先适配长期支持内核LTS比如 6.6.x、6.7.x、6.8.x 这些版本线但每个补丁文件都严格对应一个特定的内核子版本号。你拿着 6.8 的补丁往 6.8.1 上打没准能过但往 6.8.12 上打大概率就冲突了。我在实际测试中Ubuntu 24.04 自带内核是 6.8.0-xx-generic这个带 Ubuntu 定制魔改的内核无法直接打补丁必须换成官方原版内核源码。所以整个项目的核心链路变成Ubuntu 24.04 作为宿主系统但实际运行的内核是手动编译的官方原版 Linux Dovetail 补丁 EVL 核心。这意味着你需要和 Ubuntu 内核保持独立编译完自己安装自己管理引导项。2. 方案选型与核心原理拆解2.1 为什么双内核架构比 PREEMPT_RT 更适合硬实时要理解 Xenomai 4 的编译过程得先明白这套双内核机制到底在做什么。传统 Linux 内核里有大量的临界区、自旋锁、关中断操作这些是延迟毛刺的主要来源。PREEMPT_RT 的思路是把这些不可抢占的区域尽量缩小但缩小不等于消除在极端负载下依然可能产生不可避免的调度延迟。Xenomai 4 走了另外一条路它引入了一个名为 EVL core 的轻量级实时核心。这个核心并不替代 Linux而是和 Linux 共用同一个硬件平台。Dovetail 机制在这里起到了类似“中断路由器”的作用Dovetail 补丁把 Linux 内核的中断入口改造出一个管道让硬件中断首先经过 EVL 核心。如果实时核心当前有待处理的实时任务中断就被 EVL 核心截获并调度如果实时核心空闲就把中断继续传递给 Linux 内核处理。这样做的本质是让实时任务和 Linux 的任务在中断层面“错峰”使用 CPU。Linux 再卡、再有长临界区也影响不到 EVL 核心的中断响应路径。代价是你要维护一套额外的核心代码而且编译配置比单纯的内核编译要复杂得多这也是本文存在的意义。2.2 Xenomai 3 与 Xenomai 4 的差异很多从老项目迁移过来的朋友第一个疑问是Xenomai 4 和 Xenomai 3 到底差在哪编译方式还一样吗差别非常大。Xenomai 3 使用的是 I-pipeInterrupt Pipeline需要先给内核打上 ipipe 补丁然后通过 xenomai 的 prepare-kernel.sh 脚本对内核源码做二次加工把 cobalt 核心代码嵌入到 Linux 内核目录中。编译完一个 Linux 内核后实时核心以内核线程和补丁改写的关键路径形式存在于其中。Xenomai 4 改成了 Dovetail 加独立的 EVL core。Dovetail 本身是一个相对于 I-pipe 来说更克制、更接近主线风格的补丁它只改写了中断入口和少数调度相关路径而 EVL core 作为独立的内核目录存在于源码树中。在编译配置上Xenomai 4 不再需要特殊的补丁脚本只需要把 EVL 核心的目录放到内核源码树中然后在内核配置里开启对应的 CONFIG_EVL 选项。另外迁移时要注意Xenomai 3 的老 APIalchemy、vxworks 等兼容层在 Xenomai 4 中基本被移除了应用层主要面向 EVL 的原生 API 和 POSIX 兼容层。如果你有老项目要迁移API 改动的工作量可能比系统编译还要大。2.3 为什么不用现成的实时内核包Ubuntu 官方软件源和第三方社区都提供过一些带实时补丁的内核包例如低延迟内核。网上也有别人编译好的 Xenomai 内核镜像直接用行不行我的建议是做快速验证可以做正式项目必须自己编译。预编译内核的最大问题是你无法确认它打了补丁的具体版本、内核配置里有没有开全 CONFIG_EVL 相关选项、中断隔离等关键参数是否调过。而实时系统的性能瓶颈往往就在这些细节里。比如 CONFIG_CPU_ISOLOPT 没开、CONFIG_IRQ_FORCED_THREADING 配置不对都会导致延迟测试数据很难看。自己从源码编译虽然过程痛苦但至少你能知道每一步做了什么出了问题也知道从哪下手。3. 环境准备与依赖安装3.1 基础依赖包清单在 Ubuntu 24.04 上编译内核和 Xenomai 4首先得保证基础编译工具链齐全。我踩过的坑是Ubuntu 24.04 默认安装的 build-essential 只装了最基础的 gcc 和 make缺少不少内核编译需要的辅助工具。建议执行以下命令安装完整依赖sudo apt update sudo apt install -y build-essential flex bison libncurses-dev \ libssl-dev libelf-dev dwarves bc git rsync kmod \ cpio tar xz-utils zstd gcc make pkg-config autoconf autoconf-archive \ libtool libtool-bin libreadline-dev libuuid-dev libevdev-dev \ libyaml-dev libaio-dev其中 flex 和 bison 是生成内核词法/语法分析器的必需品。libssl-dev 提供内核模块签名和压缩固件所需的 OpenSSL 头文件。libelf-dev 用于内核的 BPF 工具和模块剥离符号缺了它在编译某些驱动时会报找不到 elf.h。dwarves 这一项非常容易被忽略它提供 pahole 工具内核的 BTF 功能依赖它不装的话 CONFIG_DEBUG_INFO_BTF 开启时直接编译报错。我建议在编译前把所有工具都装好别想着缺什么再补什么因为内核编译过程真的很长中途失败重来非常浪费时间。3.2 创建合理的源码目录结构编译这套系统源码存放位置的规划很重要。我吃过把内核源码直接放在 /home 下然后因为路径带空格导致脚本出错的亏。建议使用一个专门的目录例如mkdir -p ~/rt_ws/{kernel,xenomai,tools}这三个目录各司其职kernel 存放 Linux 内核源码和 Dovetail 补丁xenomai 存放 Xenomai 4 的源码树tools 存放一些辅助脚本。目录结构清晰的好处是后面需要查看补丁版本、检查内核 .config可以快速定位到对应文件。另外编译内核不建议直接在源码目录下编译出乱糟糟的目标文件Linux 内核支持 out-of-tree 编译。我强烈建议使用 O 参数把编译输出目录独立出来例如make O../kernel/build_x86_64 menuconfig这样源码目录始终保持干净实验不同配置时也不需要重新解压源码。后文我所有的编译命令都会带上 O 参数这一点对避免配置混乱非常关键。3.3 工具链版本检查Ubuntu 24.04 自带的 gcc 13 编译较新的内核没有问题但要注意 gcc 版本不能过新。有些朋友习惯用 Ubuntu 24.04 的 PPA 装上 gcc 14 甚至更新的版本在编译老一些的内核源码时会碰到内联汇编语法不兼容、警告被升级为错误之类的情况。检查当前 gcc 版本gcc --version如果是 gcc 13 或 12直接用没问题。如果发现系统里默认 gcc 版本过高比如 14可以在编译内核时指定 CC 变量例如make CCgcc-13。另外一个容易忽略的是内核版本和 binutils 的匹配。Ubuntu 24.04 默认 binutils 2.42处理 6.6 到 6.8 的内核都足够不需要额外处理。4. 从源码准备到内核编译4.1 获取匹配的 Linux 内核与 Dovetail 补丁这一步是整个流程中最容易让我血压升高的一步。先说明一下整体关系Dovetail 补丁是一个针对 Linux 内核的 diff 文件它把内核的中断入口改造成管道形式。EVL core 代码则依赖这个改造后的接口。因此版本链路必须是Linux 内核版本 A Dovetail 补丁 A针对版本 A Xenomai 4 源码其中内核部分需要与补丁版匹配。Xenomai 4 官方仓库git.xenomai.org/xenomai/xenomai4里一般会有一个说明文档说明当前支持的 Dovetail 补丁下载地址。Dovetail 补丁通常托管在 Linux 内核实时社区的仓库中可以搜索dovetail-patch相关关键字寻找。实际操作时我建议先确认 Xenomai 4 仓库里kernel/evl/Kconfig文件的最低版本要求再选择对应的内核版本。例如如果仓库适配的是 6.6 LTS就直接选 6.6.x 内核不要好奇去试 6.9 之类的新版本。Dovetail 补丁不是每次都随主线内核同步更新的用不匹配的版本patch 阶段就会报大量 hunk failed根本没有继续的意义。假设当前推荐版本是 6.6.x那么下载命令大致如下cd ~/rt_ws/kernel # 下载官方原版内核 wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.xx.tar.xz tar -xf linux-6.6.xx.tar.xz cd linux-6.6.xx # 下载对应的 dovetail 补丁并尝试打入 # 如果补丁原文和内核版本匹配下面这条命令会顺利执行完且没有任何 rejects patch -p1 ../dovetail-6.6.xx.patch如果出现类似 “Hunk #4 FAILED at 315” 的信息立即停止去检查补丁版本和内核版本是否严格对应而不是尝试忽略失败点继续编译。强制跳过的补丁会在后续 EVL 编译时报出千奇百怪的接口错误排查起来比重新选版本痛苦得多。4.2 把 EVL 核心整合进内核源码树打完 Dovetail 补丁后需要把 Xenomai 4 的 EVL 核心代码放进内核源码树。Xenomai 4 源码仓库的结构有 kernel/evl 目录这就是实时核心的内容。操作方法是在内核源码根目录下创建一个 evl 目录然后把 Xenomai 4 仓库的 kernel/evl 内容拷贝进去cd ~/rt_ws/xenomai # 拉取 Xenomai 4 源码 git clone https://git.xenomai.org/xenomai/xenomai4.git cd ~/rt_ws/kernel/linux-6.6.xx cp -r ~/rt_ws/xenomai/xenomai4/kernel/evl ./同时还需要把用户空间 API 头文件拷贝到内核的 include 目录下这样内核代码里才能引用 EVL 的 UAPI 头文件mkdir -p include/uapi/evl cp -r ~/rt_ws/xenomai/xenomai4/include/uapi/evl/* include/uapi/evl/注意在 Xenomai 4 发布早期部分版本的仓库结构可能略有不同。如果发现内核源码树中的drivers/Kconfig或者其他地方没有自动关联 EVL 的配置项往往是因为还需要修改内核顶层的 Kconfig 和 Makefile把 evl 子目录加进去。具体做法是在内核源码的kernel/Kconfig的初始化相关段落下方加入source evl/Kconfig一行在kernel/Makefile中加入obj-y evl/一行。这个因人而异建议以 Xenomai 4 仓库的 README 为准。4.3 内核配置必须开启的关键选项准备编译前最重要的一步是配置内核。先直接用默认配置打底make O~/rt_ws/kernel/build_x86_64 x86_64_defconfig然后进入菜单配置界面make O~/rt_ws/kernel/build_x86_64 menuconfig需要重点确认的选项有下面这组配置项说明推荐值CONFIG_EVLEVL 核心总开关开启CONFIG_EVL_SYSINFO提供实时系统信息节点开启CONFIG_CPU_ISOLOPTCPU 隔离优化选项开启CONFIG_HIGH_RES_TIMERS高精度定时器开启默认开启CONFIG_PREEMPT内核抢占建议开启或使用 PREEMPT_DYNAMICCONFIG_IRQ_FORCED_THREADING强制中断线程化关闭除非测试需要CONFIG_DEBUG_INFO_BTFBTF 调试信息可关闭减少编译时间与依赖CONFIG_EVL 开关在 menuconfig 里一般位于 General setup 或者 Kernel Features 相关的子菜单下。如果找了一圈没找到极大可能是第 4.2 步的 Kconfig 关联没做对。此时不要硬找回到源码目录重新确认 evl 目录下是否有 Kconfig 文件以及顶层 Kconfig 是否引用了它。另一个值得注意的选项是 CPU 隔离。实时测试时我们通常会把某些 CPU 核心从 Linux 调度器中隔离出来专门给实时任务用。这个可以通过内核配置开启 CONFIG_CPU_ISOLOPT然后在内核启动参数里加 isolcpus 来实现。建议把这组参数一起配置好避免后面测试延迟时忽高忽低找不到原因。4.4 分阶段编译与安装内核编译主线命令make O~/rt_ws/kernel/build_x86_64 -j$(nproc)nproc 是 CPU 线程数全速编译时机器会比较卡。建议如果是日常使用的开发机把 -j 参数调到 nproc-2 或 nproc 的一半。编译过程根据机器性能不同可能耗时 10 到 40 分钟不等。编译完成后编译并安装模块make O~/rt_ws/kernel/build_x86_64 modules_install make O~/rt_ws/kernel/build_x86_64 installinstall 这一步会运行 update-grub 之类的引导更新命令把新内核加入 GRUB 菜单。安装后建议重启并临时进入新内核。启动时在 GRUB 菜单里选择 Advance options选中新编译的内核。如果启动新内核后出现 kernel panic 或者卡在某个驱动的加载上不要急常见原因有几种。第一种是文件系统驱动没编进内核而是编译成了模块而 initramfs 里没有包含对应模块。解决方法是确保CONFIG_EXT4_FSy或更新 initramfssudo update-initramfs -c -k 6.6.xx-evl第二种是 Dovetail 补丁与显卡驱动或某些硬件驱动冲突导致中断异常。这种情况可以尝试在内核启动参数中加上acpioff或者irqpoll但这只是绕过问题的方法深入解决要检查硬件兼容性。新内核启动后用uname -r确认版本号是否和自己编译的版本一致然后检查/proc/evl或/sys/kernel/evl是否生成了对应实时核心的接口节点。4.5 启动参数与内核隔离配置在成功启动编译好的内核后建议通过修改/etc/default/grub来调整启动参数GRUB_CMDLINE_LINUX_DEFAULTquiet splash isolcpus1,2 nohz_full1,2 rcu_nocbs1,2这里的含义是把 CPU1 和 CPU2 从 Linux 的通用调度中隔离出来专门用于运行 EVL 实时线程。nohz_full 让这两个核尽量不接收周期性的时钟中断rcu_nocbs 把 RCU 回调转移到其他核。这样实时任务所在的核不会因为内核自身的事务处理被打扰延迟更容易稳定。修改后执行sudo update-grub然后再次重启。这个步骤不做也行但做与不做latency 测试结果的差距可能是一倍以上尤其是测试时间拉长到几个小时后更是明显。5. libevl 的用户态编译与测试5.1 编译安装 libevl内核部分就绪后还需要用户态库 libevl应用层才能调用实时 API。Xenomai 4 仓库本身包含了 libevl 的源码和构建脚本位于仓库根目录的 lib/evl。编译过程比较常规cd ~/rt_ws/xenomai/xenomai4 mkdir build cd build ../configure --prefix/usr/local make -j$(nproc) sudo make installconfigure 脚本使用的是 autoconf 体系如果没有自动生成 configure需要先运行autogen.sh或按 README 提示执行autoreconf -f -i。首次跑 configure多半会遇到缺某个开发库的报错按提示补齐即可我在第 3 节中的依赖包清单基本涵盖了大多数情况。安装完成后检查库文件是否落地ls /usr/local/lib/libevl* ls /usr/local/include/evl/同时需要确保动态库加载器能找到这个路径echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/evl.conf sudo ldconfig5.2 设备节点和权限问题libevl 工作依赖于内核提供的 EVL 设备接口。新内核启动后这些设备节点通常默认挂在/dev/evl路径下。如果不存在检查内核配置是否开启了 CONFIG_EVL并确认相关模块是否加载。理论上上进用 EVL 核心编进内核后设备节点会在启动时自动创建。在默认权限下普通用户访问 /dev/evl 可能被拒绝。最简单的方案是把自己加入 dialout 组或直接使用 sudo 运行测试程序。但做正式项目时建议配置 udev 规则让实时用户组可以访问sudo tee /etc/udev/rules.d/99-evl.rules EOF KERNELevl, MODE0660, GROUPrealtime EOF同时创建 realtime 组并把自己的用户加进去sudo groupadd realtime sudo usermod -aG realtime $USER newgrp realtime另外还需要注意实时任务的资源限制。运行实时程序时内存锁定mlock权限和实时调度优先级需要相应配置。编辑/etc/security/limits.conf加上realtime soft rtprio 99 realtime hard rtprio 99 realtime soft memlock unlimited realtime hard memlock unlimited这一项没有配置的话latency 测试程序在尝试把内存锁定到物理内存时可能会报Cannot allocate memory或者创建实时线程时返回EPERM。5.3 运行 libevl 测试工具Xenomai 4 仓库的 utils/evl 目录下提供了多个测试工具编译后会在 /usr/local/bin 下出现 evl test、latmus 等命令。先跑一个基本功能测试确认 EVL 核心工作正常/usr/local/bin/evl test这个命令会遍历 EVL 核心提供的各种实时接口线程、定时器、同步、共享内存、门控等如果某项失败会明确指出失败项。我遇到过的情况是线程创建成功但定时器精度在测试中不达标这类问题基本都能追溯到内核配置或者 CPU 隔离参数上的缺失。接着运行延迟测试/usr/local/bin/latmus -c 1 -T 600参数说明-c 指定运行在哪个 CPU 核上需要是前面隔离出来的核-T 指定测试持续时间秒。latmus 会创建实时线程测量线程唤醒和定时器触发的周期抖动。正常输出中会给出最小、平均、最大延迟数据。常见的良好水平是平均 1~3 微秒最大不超过 10 微秒。如果最大延迟一直有周期性尖峰多半是系统和实时核之间仍然存在某些底层干扰。排查方向包括检查是否有其他中断被路由到了隔离的 CPU 上通过/proc/interrupts观察各核的中断分布检查是否有未被隔离的内核线程仍然在实时核上运行通过ps -eLo psr,comm | awk $11查看。5.4 用户态实时编程的初步验证在 libevl 测试工具通过后强烈建议再写一个十几行的自己的实时程序验证 API 调用链路没问题。这样既确认了开发库可用也为自己后续的项目打了个底。一个最简的周期线程程序骨架是#include evl/evl.h #include evl/thread.h #include evl/timer.h #include stdio.h int main(int argc, char *argv[]) { struct evl_timer timer; struct timespec period { .tv_sec 0, .tv_nsec 1000000 }; // 1ms int tfd, tmfd, ret; evl_init(); tfd evl_attach_self(periodic-thread); if (tfd 0) { perror(evl_attach_self); return 1; } tmfd evl_new_timer(timer, tfd, period, EVL_CLOCK_MONOTONIC); if (tmfd 0) { perror(evl_new_timer); return 1; } // 实际业务循环 for (int i 0; i 1000; i) { ret evl_read_timer(tmfd); if (ret) { perror(evl_read_timer); } // 在这里做你的控制计算、数据采样等实时任务 } evl_stop_timer(timer); return 0; }编译命令gcc -o rt_demo rt_demo.c -levl运行后通过evl ps命令可以看到这个实时线程是否处于 RUNNING 状态。如果在这里能够稳定看到线程实时运行说明整套环境已经完整打通接下来就可以把真正业务代码迁移到 EVL 框架上。6. 常见问题与避坑技巧实录6.1 编译阶段的典型问题速查我把实际操作中遇到的高频问题整理成了表格方便直接从排查思路入手症状可能原因解决方向patch 报大量 FAILEDDovetail 补丁版本与内核版本不匹配换用严格匹配的内核版本不要尝试手动修复menuconfig 里找不到 CONFIG_EVLevl 目录未放置或 Kconfig 未关联检查 kernel/evl 目录是否存在检查顶层 Kconfig 是否 source编译报找不到 linux/evl/xxx.hUAPI 头文件没有拷贝到 include/uapi/evl重新拷贝 Xenomai 4 仓库 include/uapi/evl 下内容BTF: .BTF size large / pahole 报错缺少 dwarves 工具安装 dwarves 或者关闭 CONFIG_DEBUG_INFO_BTF模块签名错误导致无法加载启用了模块签名但未生成签名密钥直接取消 CONFIG_MODULE_SIG 或配置好密钥启动新内核后卡住或 panic文件系统驱动未编入内核、initramfs 不完整检查 CONFIG_EXT4_FS 等重新 update-initramfs实时线程优先级设置失败limits.conf 未配置 rtprio / memlock按第 5.2 节配置并重新登录6.2 延迟测试数据不稳定的排查思路latency 测试是这套系统最终效果的试金石。如果测试数据始终飘忽不定优先做下面几步排查。第一步确认实时线程确实运行在隔离核上。latmus 的 -c 参数指定的核必须在内核启动参数 isolcpus 列表中否则内核调度器依然可能把中断和普通线程丢到该核上。检查方法很简单cat /proc/cmdline确认启动参数里有没有 isolcpus。第二步看中断分布。运行 latmus 的时候同时开另一个终端执行watch -n1 -d cat /proc/interrupts观察 local timer 中断和网卡中断是不是打到了隔离核上。LAPIC 定时器中断如果和目标核绑定通常需要检查 irqbalance 服务是否在运行。Ubuntu 默认会启动 irqbalance它自动把中断均匀分布到多个核上但这恰恰会干扰实时核的干净度。建议直接禁用sudo systemctl stop irqbalance sudo systemctl disable irqbalance第三步检查是否有内核线程残留在隔离核上。可以通过ps -eLo psr,comm | awk $11 || $12如果有 kworker 之类的线程常驻多半是因为 workqueue 没有正确隔离。需要确认内核启动参数里是否包含nohz_full和rcu_nocbs同时把 workqueue 的 unbound 默认掩码也调整一下echo 3 /sys/devices/virtual/workqueue/cpumask这里的 3 是二进制 11代表只允许使用 CPU0 和 CPU1把实时核排除在外。具体掩码值要根据你实际使用的核数计算。6.3 一些经验性的避坑建议第一点不建议把整个 Ubuntu 安装盘都变成实时系统。日常工作用的桌面系统还是那个普通内核实时内核只在需要跑测试或者控制任务时才进入。这种双引导方案最稳因为 Ubuntu 22.04 升级到 24.04 这类系统更新不太容易影响你手动编译的内核只要 GRUB 默认入口不指向实时内核就不会出现“某天开机进不了系统”的尴尬。第二点给内核打补丁前先完整读一遍补丁文件头部的版本说明。Dovetail 补丁作者通常会在补丁文件前几行写清楚适用的内核版本以及已知的硬件兼容问题。这个文件的注释比很多论坛帖子都准确。第三点保存完整的内核配置。编译完成后把.config文件备份出来比如cp .config ~/rt_ws/kernel/config-6.6.xx-evl。后续如果重新编译或者需要复现环境这个文件就是金标准。实时系统的内核配置项很多重新手点一遍很容易漏项。第四点别追求带大量额外功能的全功能内核。实时系统讲究可控和稳定Ubuntu 带上的一堆模块比如各种显卡驱动、蓝牙、网络过滤框架都可能引入不可控的中断源。内核配置时尽量精简用不到的功能一律关掉。这样既减小编译时间也能减少运行时中断不可预测性。7. 写在最后从我个人的实际测试来说Ubuntu 24.04 跑 Xenomai 4 这套组合最大的学习成本并不在编译本身而是在理解 Dovetail 和 EVL 的设计哲学。编译命令来来回回就那么几条难的是搞明白“为什么这个补丁必须匹配那个版本”、为什么 CPU 隔离参数少了会影响延迟峰值、为什么业务线程要绑核还要锁定内存。把这些原理过一遍以后再接触任何基于事件驱动的高实时框架都会比懵着直接用顺手得多。最后再分享一个小技巧在第一次打补丁和编译内核之前给当前系统做一个完整的磁盘快照或至少备份好 GRUB 配置。我见过不止一个人因为新内核启动失败手忙脚乱修引导结果把宿主机弄到重装系统。如果第一次尝试用的是实体机尤其要留意这一点。等整套流程走过一遍心里有底了再考虑在主力机器上做长期部署。
返回列表