设置实时内核
为了使用 libfranka 控制的机器人,工作站 PC 上的控制器程序必须以实时优先级运行在 PREEMPT_RT 内核下。本节介绍如何给内核打补丁以支持 PREEMPT_RT 和创建安装包的过程。
备注
NVIDIA驱动在 PREEMPT_RT 内核上没有官方支持,但通过将环境变量 IGNORE_PREEMPT_RT_PRESENCE=1 传递给安装命令,安装可能仍然可以正常工作。
首先,安装必要的依赖项:
sudo apt-get install build-essential bc curl debhelper dpkg-dev devscripts fakeroot libssl-dev libelf-dev bison flex cpio kmod rsync libncurses-dev
然后,必须决定使用哪个内核版本。要查找当前使用的那个,请使用命令 uname -r 。实时补丁仅适用于选定的内核版本,请参阅 https://www.kernel.org/pub/linux/kernel/projects/rt/ 。我们建议选择与当前使用的版本匹配(如不能严格匹配则应选择最接近的)的版本。如果选择不同的版本,只需替换数字即可。确定版本后,使用 curl 下载源文件:
备注
对于使用内核版本 4.14.12 测试通过的 Ubuntu 16.04:
curl -LO https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.12.tar.xzcurl -LO https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.12.tar.signcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patch-4.14.12-rt10.patch.xzcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patch-4.14.12-rt10.patch.sign
备注
对于使用内核版本 5.4.19 测试通过的 Ubuntu 18.04:
curl -LO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.4.19.tar.xzcurl -LO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.4.19.tar.signcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/5.4/older/patch-5.4.19-rt10.patch.xzcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/5.4/older/patch-5.4.19-rt10.patch.sign
备注
对于使用内核版本 5.9.1 测试通过的 Ubuntu 20.04:
curl -LO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xzcurl -LO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.signcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/5.9/patch-5.9.1-rt20.patch.xzcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/5.9/patch-5.9.1-rt20.patch.sign
备注
对于 Ubuntu 22.04,我们建议使用 Ubuntu Pro 实时内核 。启用后,您可以直接跳转到 允许用户为其进程设置实时权限。如果您不想使用 Ubuntu Pro,您可以按照其他版本的方式继续操作(已在内核版本 6.8.0 下测试):
curl -LO https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.8.tar.xzcurl -LO https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.8.tar.signcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/6.8/older/patch-6.8-rt8.patch.xzcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/6.8/older/patch-6.8-rt8.patch.sign
并使用以下命令解压缩它们:
xz -d *.xz
验证文件完整性
备注
此步骤是可选的,但推荐! (根据经验,该验证过程容易出错,如果能确保下载过程的文件完整,也可直接跳过本节不做,至下一小节《编译内核》继续)
这些 .sign 文件可用于验证下载的文件没有损坏或篡改。此处显示的步骤改编自 Linux内核存档,有关该过程的更多详细信息,请参阅链接页面。
可以使用 gpg2 来验证 .tar 存档:
gpg2 --verify linux-*.tar.signgpg2 --verify patch-*.patch.sign
如果输出类似于以下内容:
$ gpg2 --verify linux-*.tar.sign gpg: assuming signed data in 'linux-4.14.12.tar' gpg: Signature made Fr 05 Jan 2018 06:49:11 PST using RSA key ID 6092693E gpg: Can't check signature: No public key
必须首先下载签署上述文件的人的公开密钥。从上面的输出中可以看出,它具有 ID 6092693E。可以从密钥服务器获取它:
gpg2 --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 6092693E
对补丁也类似:
gpg2 --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 2872E4CC
请注意,其他内核版本的密钥可能具有不同的 ID,必须相应地进行匹配调整。
下载密钥后,现在可以验证来源。以下是正确输出的示例:
$ gpg2 --verify linux-*.tar.sign gpg: assuming signed data in 'linux-4.14.12.tar' gpg: Signature made Fr 05 Jan 2018 06:49:11 PST using RSA key ID 6092693E gpg: Good signature from "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" [unknown] gpg: aka "Greg Kroah-Hartman <gregkh@kernel.org>" [unknown] gpg: aka "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E
有关警告的更多信息,请参阅 Linux内核存档 。
编译内核
一旦确定文件下载正确,就可以提取源代码并应用补丁:
tar xf linux-*.tarcd linux-*/patch -p1 < ../patch-*.patch
接下来复制当前启动的内核配置作为新实时内核的默认配置:
cp -v /boot/config-$(uname -r) .config
从内核文件中去除调试信息以节省空间:
scripts/config --disable DEBUG_INFOscripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULTscripts/config --disable DEBUG_KERNEL
禁用系统范围内的受信密钥环(Ring of Trusted Keys):
scripts/config --disable SYSTEM_TRUSTED_KEYSscripts/config --disable SYSTEM_REVOCATION_LIST
激活完全可抢占内核(实时):
scripts/config --disable PREEMPT_NONEscripts/config --disable PREEMPT_VOLUNTARYscripts/config --disable PREEMPTscripts/config --enable PREEMPT_RT
现在可以使用此配置作为默认配置来配置构建:
make olddefconfig
之后,就可以编译内核了。由于这是一个漫长的过程,请将多线程选项 -j 设置为 CPU 核心数量,也可以直接使用下面的命令:
make -j$(nproc) deb-pkg
最后,您准备好安装新创建的包了。确切的包名称取决于您的环境,但要查找的是不带 dbg 后缀的 headers 和 images 包。要安装,请执行:
sudo IGNORE_PREEMPT_RT_PRESENCE=1 dpkg -i ../linux-headers-*.deb ../linux-image-*.deb
验证新内核
重新启动系统。Grub 启动菜单现在应该允许选择新安装的内核。选好启动项登录成功后,如果要查看当前正在使用的是不是前面步骤安装的实时内核,请查看 uname -a 命令的输出。它应该包含选择的 PREEMPT RT 字符串和版本号。此外, /sys/kernel/realtime 应该存在,并包含数字1。
备注
如果遇到无法引导新内核的错误,请参阅 由于 “Invalid Signature(无效签名)” 无法引导实时内核
允许用户为其进程设置实时权限
在安装 PREEMPT_RT 内核并成功运行后,添加一个名为realtime的组 ,并将控制的机器人的用户添加到该组中:
sudo addgroup realtime sudo usermod -a -G realtime $(whoami)
然后,将以下限制添加到在 /etc/security/limits.conf 文件中的realtime组
@realtime soft rtprio 99@realtime soft priority 99@realtime soft memlock 102400@realtime hard rtprio 99@realtime hard priority 99@realtime hard memlock 102400
这些限制将在 注销 并再次 登录 后得以应用。