Franka机械臂安装实时内核

之前安装了一个实时内核,结果电脑一开实时内核就发烫然后温度抬高就关机,后来才发现是因为NVIDIA 图形环境没有编译成功,导致一开浏览器就高温爆炸,所以后面重新安装了实时内核,最主要的就是NVIDIA 模块重新安装成功。

Ubuntu 20.04 安装 5.15.209-rt96 实时内核并配置 NVIDIA 驱动,用于 Franka 机械臂控制

1. 背景说明

本文记录一次在 Ubuntu 20.04 上手动编译安装 PREEMPT_RT 实时内核的完整过程。目标是用于 Franka Emika Panda 机械臂真机控制,同时希望保留 NVIDIA 图形环境,方便日常调试代码、浏览器查资料、运行图形界面程序。

本次安装目标:

复制代码
Linux 5.15.209-rt96-lenovo
PREEMPT_RT=y
NVIDIA Driver 570.133.20
Ubuntu 20.04

最终验证结果:

复制代码
uname -r
# 5.15.209-rt96-lenovo

cat /sys/kernel/realtime
# 1

nvidia-smi
# NVIDIA-SMI 正常显示

dkms status | grep -i nvidia
# nvidia, 570.133.20, 5.15.209-rt96-lenovo, x86_64: installed

2. 安装前注意事项

2.1 一定保留原来的可用内核

安装实时内核前,一定不要删除原来的普通内核。例如本文机器上保留了:

复制代码
5.15.0-139-generic
5.15.0-140-lowlatency

如果实时内核启动失败,还可以从 GRUB 的 Advanced options 里选择普通内核进入系统。

2.2 实时内核不等于一定适合跑桌面

Franka 真机控制需要实时性,但浏览器、RViz、RealSense、点云、NVIDIA 图形界面都会增加系统负载和温度。

本文的目标是:

复制代码
实时控制 Franka 时使用 PREEMPT_RT
调试代码时保留 NVIDIA/图形界面
正式跑真机时尽量少开浏览器、RViz、点云、视频网页

2.3 本机硬件环境

复制代码
CPU:AMD Ryzen 9 5900HX
GPU:NVIDIA GeForce RTX 3080 Laptop GPU
系统:Ubuntu 20.04
目标内核:5.15.209-rt96-lenovo

3. 先确认当前内核

复制代码
uname -r

本文开始时处于普通内核:

复制代码
5.15.0-139-generic

建议所有编译操作都先在普通稳定内核中进行。


4. 修复 apt 源问题

如果执行:

复制代码
sudo apt update

出现类似:

复制代码
E: 仓库 "https://dl.google.com/linux/chrome-stable/deb stable Release" 不再含有 Release 文件。

可以先临时禁用 Chrome 源:

复制代码
grep -R "dl.google.com/linux/chrome" /etc/apt/sources.list /etc/apt/sources.list.d/*.list

如果源文件是:

复制代码
/etc/apt/sources.list.d/google-chrome.list

执行:

复制代码
sudo sed -i.bak '/dl.google.com\/linux\/chrome/s/^/# /' /etc/apt/sources.list.d/google-chrome.list

然后重新更新:

复制代码
sudo apt update

5. 安装编译依赖

复制代码
sudo apt install build-essential bc curl debhelper dpkg-dev devscripts \
fakeroot libssl-dev libelf-dev bison flex cpio kmod rsync libncurses-dev \
dkms pkg-config cpufrequtils

6. 下载 Linux 5.15.209 和 RT96 补丁

复制代码
mkdir -p ~/rt_kernel_build
cd ~/rt_kernel_build

curl -LO https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.209.tar.xz
curl -LO https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.15/patch-5.15.209-rt96.patch.xz

解压:

复制代码
xz -d linux-5.15.209.tar.xz
xz -d patch-5.15.209-rt96.patch.xz

tar xf linux-5.15.209.tar
cd linux-5.15.209

打 RT 补丁:

复制代码
patch -p1 < ../patch-5.15.209-rt96.patch

如果一路显示:

复制代码
patching file ...

说明补丁成功。


7. 使用 Ubuntu 原内核配置作为模板

不要从默认配置开始。建议直接复制当前稳定内核配置:

复制代码
cp /boot/config-5.15.0-139-generic .config

然后设置关键配置:

复制代码
scripts/config --disable DEBUG_INFO
scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
scripts/config --disable DEBUG_KERNEL

scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_LIST

scripts/config --disable PREEMPT_NONE
scripts/config --disable PREEMPT_VOLUNTARY
scripts/config --disable PREEMPT
scripts/config --enable PREEMPT_RT

scripts/config --set-str LOCALVERSION "-rt96-lenovo"

生成配置:

复制代码
make olddefconfig

检查:

复制代码
grep CONFIG_PREEMPT_RT .config

希望看到:

复制代码
CONFIG_PREEMPT_RT=y

8. 处理 localversion 导致版本名重复的问题

打完 RT 补丁后,源码目录里可能有:

复制代码
localversion-rt

里面内容是:

复制代码
-rt96

如果同时设置了:

复制代码
CONFIG_LOCALVERSION="-rt96-lenovo"

可能导致最终内核版本名变成:

复制代码
5.15.209-rt96-rt96-lenovo

可以检查:

复制代码
make kernelrelease

如果看到重复的 rt96,执行:

复制代码
cd ~/rt_kernel_build/linux-5.15.209

mv localversion-rt ../localversion-rt.bak

scripts/config --set-str LOCALVERSION "-rt96-lenovo"
make olddefconfig

rm -rf debian

make kernelrelease

希望最终看到:

复制代码
5.15.209-rt96-lenovo

9. 禁用 NFSD,绕过 nfs4state.c 编译错误

编译过程中可能遇到如下错误:

复制代码
fs/nfsd/nfs4state.c:1826:10: note: in expansion of macro 'clamp_t'
make[5]: *** [scripts/Makefile.build:289:fs/nfsd/nfs4state.o] 错误 1

这是 NFS Server 相关模块的编译错误。用于 Franka 控制时不需要 NFS Server,可以禁用:

复制代码
cd ~/rt_kernel_build/linux-5.15.209

scripts/config --disable NFSD
scripts/config --disable NFSD_V2
scripts/config --disable NFSD_V3
scripts/config --disable NFSD_V4
scripts/config --disable NFSD_BLOCKLAYOUT
scripts/config --disable NFSD_SCSILAYOUT
scripts/config --disable NFSD_FLEXFILELAYOUT
scripts/config --disable NFSD_V4_2_INTER_SSC

make olddefconfig

检查:

复制代码
grep CONFIG_NFSD .config

希望看到:

复制代码
# CONFIG_NFSD is not set

禁用 NFSD 不影响:

复制代码
Franka 控制
libfranka
ROS
浏览器
普通网络连接
NVIDIA
Wi-Fi / 有线网卡

它只是关闭本机作为 NFS Server 给其他机器共享目录的功能。


10. 处理 X32 warning

如果出现:

复制代码
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support

可以尝试禁用:

复制代码
scripts/config --disable X86_X32_ABI
scripts/config --disable X86_X32
make olddefconfig

本文实际编译时即使仍然有该 warning,也没有阻止编译成功。


11. 编译内核 deb 包

笔记本编译内核容易过热,不建议直接 -j16-j10。建议保守一点:

复制代码
cd ~/rt_kernel_build/linux-5.15.209

make -j4 bindeb-pkg 2>&1 | tee ~/rt_kernel_build/build_rt_j4_final.log

如果还担心过热,可以用:

复制代码
make -j3 bindeb-pkg 2>&1 | tee ~/rt_kernel_build/build_rt_j3_final.log

如果报错,查看关键错误:

复制代码
grep -n -iE "error:|fatal error|killed|No such file|undefined|pahole|BTF|failed|cannot|缺少|错误" \
~/rt_kernel_build/build_rt_j4_final.log | tail -n 120

编译成功时,会看到类似:

复制代码
dpkg-deb: 正在 '../linux-libc-dev_5.15.209-rt96-lenovo-1_amd64.deb' 中构建软件包
dpkg-deb: 正在 '../linux-image-5.15.209-rt96-lenovo_5.15.209-rt96-lenovo-1_amd64.deb' 中构建软件包
dpkg-buildpackage: info: binary-only upload

12. 安装新实时内核

查看生成的 deb 包:

复制代码
cd ~/rt_kernel_build
ls -lh *.deb

本文生成了:

复制代码
linux-headers-5.15.209-rt96-lenovo_5.15.209-rt96-lenovo-1_amd64.deb
linux-image-5.15.209-rt96-lenovo_5.15.209-rt96-lenovo-1_amd64.deb
linux-libc-dev_5.15.209-rt96-lenovo-1_amd64.deb

安装:

复制代码
sudo dpkg -i linux-image-5.15.209-rt96-lenovo_*.deb \
             linux-headers-5.15.209-rt96-lenovo_*.deb \
             linux-libc-dev_5.15.209-rt96-lenovo-1_amd64.deb

修复依赖并更新 GRUB:

复制代码
sudo apt -f install
sudo update-grub

如果 GRUB 输出里能看到:

复制代码
找到 Linux 镜像:/boot/vmlinuz-5.15.209-rt96-lenovo
找到 initrd 镜像:/boot/initrd.img-5.15.209-rt96-lenovo

说明新内核已经被 GRUB 识别。


13. 处理 NVIDIA DKMS 在 PREEMPT_RT 下编译失败

安装内核时,NVIDIA DKMS 可能报错:

复制代码
The kernel you are installing for is a PREEMPT_RT kernel!

The NVIDIA driver does not support real-time kernels.

*** Failed PREEMPT_RT sanity check. Bailing out! ***

这是 NVIDIA 驱动检测到 PREEMPT_RT 后主动退出。

先检查当前 NVIDIA DKMS 状态:

复制代码
dkms status | grep -i nvidia

如果只看到普通内核,例如:

复制代码
nvidia, 570.133.20, 5.15.0-139-generic, x86_64: installed
nvidia, 570.133.20, 5.15.0-140-lowlatency, x86_64: installed

说明还没有为 RT 内核安装 NVIDIA 模块。

手动强制忽略 PREEMPT_RT 检查:

复制代码
cd ~/rt_kernel_build

sudo env IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 \
dkms build -m nvidia -v 570.133.20 -k 5.15.209-rt96-lenovo \
2>&1 | tee ~/rt_kernel_build/nvidia_dkms_build_rt.log

如果成功,会看到:

复制代码
DKMS: build completed.

然后安装:

复制代码
sudo env IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 \
dkms install -m nvidia -v 570.133.20 -k 5.15.209-rt96-lenovo \
2>&1 | tee ~/rt_kernel_build/nvidia_dkms_install_rt.log

如果成功,会看到:

复制代码
DKMS: install completed.

再次检查:

复制代码
dkms status | grep -i nvidia

希望看到:

复制代码
nvidia, 570.133.20, 5.15.209-rt96-lenovo, x86_64: installed

更新 initramfs 和 GRUB:

复制代码
sudo update-initramfs -u -k 5.15.209-rt96-lenovo
sudo update-grub

14. 重启进入新实时内核

复制代码
sudo reboot

重启时进入 GRUB:

复制代码
Advanced options for Ubuntu
Ubuntu, with Linux 5.15.209-rt96-lenovo

如果 GRUB 菜单不显示,可以开机时连续按 EscShift


15. 验证实时内核、NVIDIA 和 DKMS

进入系统后执行:

复制代码
uname -a

希望看到:

复制代码
Linux tinycarcar 5.15.209-rt96-lenovo #1 SMP PREEMPT_RT ...

检查实时内核:

复制代码
cat /sys/kernel/realtime

希望看到:

复制代码
1

检查 NVIDIA:

复制代码
nvidia-smi

希望 NVIDIA-SMI 正常显示,例如:

复制代码
NVIDIA-SMI 570.133.20
Driver Version: 570.133.20
CUDA Version: 12.8

检查显卡驱动:

复制代码
lspci -nnk | grep -EA3 "VGA|3D|Display"

希望看到:

复制代码
Kernel driver in use: nvidia
Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia

检查 DKMS:

复制代码
dkms status | grep -i nvidia

希望看到:

复制代码
nvidia, 570.133.20, 5.15.209-rt96-lenovo, x86_64: installed

16. 配置 Franka 需要的实时权限

先看当前用户是否已经在 realtime 组:

复制代码
groups

如果已经有:

复制代码
realtime

则不用再添加。

如果没有,执行:

复制代码
sudo groupadd realtime
sudo usermod -a -G realtime $USER

然后写入实时权限配置:

复制代码
sudo tee /etc/security/limits.d/99-realtime.conf > /dev/null <<'EOF'
@realtime soft rtprio 99
@realtime hard rtprio 99
@realtime soft priority 99
@realtime hard priority 99
@realtime soft memlock unlimited
@realtime hard memlock unlimited
EOF

检查:

复制代码
cat /etc/security/limits.d/99-realtime.conf

说明:

复制代码
rtprio 99:允许实时线程使用较高实时优先级
priority 99:允许进程设置高优先级
memlock unlimited:允许锁内存,减少实时控制时的分页风险

建议使用 memlock unlimited,而不是一些教程中的 102400,因为 Franka 控制、ROS 节点、驱动程序可能需要更宽松的内存锁定限制。


17. 配置降温策略,避免真机控制时热关机

本机在刚进入 RT 内核时温度曾达到:

复制代码
Tctl: +85.2°C

关闭 AMD boost 并限制 CPU 频率后下降到:

复制代码
Tctl: +68.1°C

临时关闭 AMD boost:

复制代码
cat /sys/devices/system/cpu/cpufreq/boost
echo 0 | sudo tee /sys/devices/system/cpu/cpufreq/boost

临时限制 CPU 最大频率到 2.0GHz:

复制代码
sudo cpufreq-set -r -u 2.0GHz

查看温度:

复制代码
sensors
watch -n 1 sensors

为了重启后自动生效,创建 systemd 服务:

复制代码
sudo tee /etc/systemd/system/rt-franka-cpu-limit.service > /dev/null <<'EOF'
[Unit]
Description=CPU limit for Franka realtime kernel
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'if [ -e /sys/devices/system/cpu/cpufreq/boost ]; then echo 0 > /sys/devices/system/cpu/cpufreq/boost; fi'
ExecStart=/usr/bin/cpufreq-set -r -u 2.0GHz
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

启用服务:

复制代码
sudo systemctl daemon-reload
sudo systemctl enable rt-franka-cpu-limit.service
sudo systemctl start rt-franka-cpu-limit.service

检查:

复制代码
cat /sys/devices/system/cpu/cpufreq/boost
cpufreq-info | grep -E "current policy|current CPU frequency" | head -n 30
systemctl status rt-franka-cpu-limit.service --no-pager
sensors

希望看到:

复制代码
boost = 0
CPU 最大频率约 2.0GHz
rt-franka-cpu-limit.service active/exited
温度稳定,不要快速冲到 85~95°C

18. 重启后最终检查

复制代码
sudo reboot

重启后仍然选择:

复制代码
Ubuntu, with Linux 5.15.209-rt96-lenovo

进入系统后执行:

复制代码
uname -r
cat /sys/kernel/realtime
groups
cat /sys/devices/system/cpu/cpufreq/boost
nvidia-smi
sensors
dkms status | grep -i nvidia
systemctl status rt-franka-cpu-limit.service --no-pager

最终希望看到:

复制代码
uname -r                         5.15.209-rt96-lenovo
cat /sys/kernel/realtime          1
groups                            包含 realtime
boost                             0
nvidia-smi                        正常
dkms status                       nvidia 在 RT 内核下 installed
温度                              稳定

19. Franka 真机测试顺序

不要一上来就运行复杂控制算法。建议按以下顺序测试。

19.1 测试 Franka 网络连通

假设 Franka Control Box 的 FCI IP 是:

复制代码
172.16.0.2

先 ping:

复制代码
ping 172.16.0.2

再做高频 ping:

复制代码
sudo ping 172.16.0.2 -i 0.001 -D -c 10000 -s 1200

如果有明显丢包、延迟很大,先不要跑控制。

19.2 测试 libfranka communication_test

如果使用 libfranka:

复制代码
cd ~/libfranka/build
./examples/communication_test 172.16.0.2

如果找不到:

复制代码
find ~ -name communication_test 2>/dev/null

然后运行找到的路径:

复制代码
/path/to/communication_test 172.16.0.2

19.3 再启动 FrankaPy / franka-interface

如果使用 FrankaPy 或 franka-interface,先确认:

复制代码
实时内核正常
NVIDIA 正常
温度稳定
网络通信测试通过
用户在 realtime 组
实时权限配置完成

再启动 FrankaPy 相关服务或控制程序。


20. 使用建议

正式控制 Franka 时建议:

复制代码
1. 尽量关闭浏览器、视频网页、QQ、无关图形程序
2. 不要同时跑大规模点云、RealSense、RViz、仿真和 Franka 真机控制
3. 真机 1kHz 控制程序尽量只做控制,不要在循环里频繁 print、sleep、动态分配内存
4. RealSense / SDF / MoveIt / RViz 可以考虑放到另一台普通内核电脑上
5. RT 控制电脑只负责 libfranka / FrankaPy / franka-interface 低层控制

如果只是调试代码、查资料,可以开浏览器;但真正跑真机控制时,建议只保留必要终端和控制节点。


21. 常见问题总结

问题 1:apt update 被 Chrome 源卡住

错误:

复制代码
E: 仓库 "https://dl.google.com/linux/chrome-stable/deb stable Release" 不再含有 Release 文件。

解决:

复制代码
sudo sed -i.bak '/dl.google.com\/linux\/chrome/s/^/# /' /etc/apt/sources.list.d/google-chrome.list
sudo apt update

问题 2:NFSD 编译失败

错误:

复制代码
fs/nfsd/nfs4state.c
clamp() low limit slotsize greater than high limit

解决:

复制代码
scripts/config --disable NFSD
make olddefconfig

问题 3:版本号变成 5.15.209-rt96-rt96-lenovo

原因:

复制代码
localversion-rt 里有 -rt96
CONFIG_LOCALVERSION 又设置了 -rt96-lenovo

解决:

复制代码
mv localversion-rt ../localversion-rt.bak
scripts/config --set-str LOCALVERSION "-rt96-lenovo"
make olddefconfig
rm -rf debian
make kernelrelease

问题 4:NVIDIA DKMS 在 RT 内核下失败

错误:

复制代码
The kernel you are installing for is a PREEMPT_RT kernel!
The NVIDIA driver does not support real-time kernels.
*** Failed PREEMPT_RT sanity check. Bailing out! ***

解决:

复制代码
sudo env IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 \
dkms build -m nvidia -v 570.133.20 -k 5.15.209-rt96-lenovo

sudo env IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 \
dkms install -m nvidia -v 570.133.20 -k 5.15.209-rt96-lenovo

问题 5:RT 内核下温度太高

临时处理:

复制代码
echo 0 | sudo tee /sys/devices/system/cpu/cpufreq/boost
sudo cpufreq-set -r -u 2.0GHz

永久处理:

复制代码
sudo systemctl enable rt-franka-cpu-limit.service

22. 最终状态

最终成功状态如下:

复制代码
uname -a
# Linux tinycarcar 5.15.209-rt96-lenovo #1 SMP PREEMPT_RT ...

cat /sys/kernel/realtime
# 1

groups
# 包含 realtime

nvidia-smi
# NVIDIA-SMI 570.133.20 正常

lspci -nnk | grep -EA3 "VGA|3D|Display"
# Kernel driver in use: nvidia

dkms status | grep -i nvidia
# nvidia, 570.133.20, 5.15.209-rt96-lenovo, x86_64: installed

sensors
# CPU 温度稳定

至此,Ubuntu 20.04 上的 5.15.209-rt96-lenovo 实时内核安装完成,并且 NVIDIA 图形环境和 Franka 实时控制前置配置也完成。

相关推荐
今天也是元气满满的一天呢2 小时前
从单机架构到负载均衡的互联网架构全流程
数据库·系统架构
SelectDB2 小时前
快手 AB 场景提速 145 倍,从 Spark 到 Apache Doris 的加速实践
数据库·spark·开源
SelectDB2 小时前
阶跃星辰 Agent 可观测实践:为什么 Trace 数据底座选择 SelectDB?
大数据·数据库·agent
冷静的楼房2 小时前
使用ThreadPool发起同步的调用
数据库
一个天蝎座 白勺 程序猿2 小时前
自动SQL优化实战|吃透调优接口+报告配置+统计+索引全流程落地
数据库·sql·sql优化
TDengine (老段)2 小时前
# TDengine TMQ 最佳实践 — 可靠消费、容错与监控
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
杨云龙UP3 小时前
Windows SQL Server 备份无法传输至异地共享目录排查处理
运维·服务器·数据库·windows·共享·smb·异地备份传输
落寞的电源3 小时前
Delegate = Object + MethodInfo
开发语言·数据库·c#
要开心吖ZSH3 小时前
处方物流信息同步优化:从 36 秒到亚秒级的踩坑记录
java·数据库·mysql·性能优化