之前安装了一个实时内核,结果电脑一开实时内核就发烫然后温度抬高就关机,后来才发现是因为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 菜单不显示,可以开机时连续按 Esc 或 Shift。
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 实时控制前置配置也完成。