用PREEMPT_RT内核安装Ubuntu

为了运行universal_robot_driver,我们强烈建议安装一个具有实时功能的ubuntu系统。特别是对于e系列的机器人,如果不使用实时启用的系统,较高的控制频率可能会导致不平滑的轨迹执行。

你可能仍然可以使用非实时系统来控制机器人。但是,不建议这样做。

要在ubuntu系统中获得实时支持,必须执行以下步骤:

获取实时内核的源代码
编译实时内核
设置用户权限以执行实时任务

本指南将帮助您使用实时内核设置系统。

要构建内核,您需要在系统上使用几个工具。您可以使用

$ sudo apt-get install build-essential bc ca-certificates gnupg2 libssl-dev wget gawk flex bison

在下载启用实时功能的内核源代码之前,请检查当前安装的内核版本:

$ uname -r
4.15.0-62-generic

要继续学习本教程,请创建一个临时文件夹并导航到其中。您应该在那里有足够的空间(大约25GB),因为提取的内核源代码占用很多空间。新内核安装完成后,您可以再次删除此文件夹。

在这个例子中,我们将在主文件夹中使用一个临时文件夹:

$ mkdir -p ${HOME}/rt_kernel_build
$ cd ${HOME}/rt_kernel_build

所有未来的命令都应该在这个文件夹中运行。如果文件夹不同,$符号将以相对于上述文件夹的路径作为前缀。

获取实时内核的源代码

为了构建实时内核,我们首先需要获得内核源代码和实时补丁。首先,我们必须决定要使用的内核版本。上面,我们确定我们的系统安装了4.15内核。但是,实时补丁仅适用于选定的内核版本。这些可以在realtime:preempt_rt_versions [Wiki]上找到。

在本例中,我们将选择4.14内核。选择与系统上安装的内核版本相近的内核版本。

继续下载内核源代码、补丁源代码和它们的签名文件:

$ wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/patch-4.14.139-rt66.patch.xz
$ wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/patch-4.14.139-rt66.patch.sign
$ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.139.tar.xz
$ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.139.tar.sign

要解压缩下载的文件,请执行

$ xz -dk patch-4.14.139-rt66.patch.xz
$ xz -d linux-4.14.139.tar.xz

验证

从技术上讲,您可以跳过本节,但是强烈建议您验证系统中这样一个核心组件的文件完整性!

要验证文件完整性,必须首先由内核开发人员和补丁作者导入公钥。对于内核源代码使用(按照kernel.org上的建议

$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org

对于补丁,搜索realtime:preempt_rt_versions [Wiki]上列出的作者的密钥。

$ gpg2 --keyserver hkp://keys.gnupg.net --search-keys zanussi
gpg: data source: http://51.38.91.189:11371
(1)     German Daniel Zanussi <german.zanussi@globant.com>
          4096 bit RSA key 0x537F98A9D92CEAC8, created: 2019-07-24, expires: 2023-07-24
(2)     Michael Zanussi <mzanussi@gmail.com>
          4096 bit RSA key 0x7C7F76A2C1E3D9EB, created: 2019-05-08
(3)     Tom Zanussi <tzanussi@gmail.com>
        Tom Zanussi <zanussi@kernel.org>
        Tom Zanussi <tom.zanussi@linux.intel.com>
          4096 bit RSA key 0xDE09826778A38521, created: 2017-12-15
(4)     Riccardo Zanussi <riccardo.zanussi@gmail.com>
          2048 bit RSA key 0xD299A06261D919C3, created: 2014-08-27, expires: 2018-08-27 (expired)
(5)     Zanussi Gianni <g.zanussi@virgilio.it>
          1024 bit DSA key 0x78B89CB020D1836C, created: 2004-04-06
(6)     Michael Zanussi <zanussi@unm.edu>
        Michael Zanussi <mzanussi@gmail.com>
        Michael Zanussi <michael_zanussi@yahoo.com>
        Michael Zanussi <michael@michaelzanussi.com>
          1024 bit DSA key 0xB3E952DCAC653064, created: 2000-09-05
(7)     Michael Zanussi <surfpnk@yahoo.com>
          1024 bit DSA key 0xEB10BBD9BA749318, created: 1999-05-31
(8)     Michael B. Zanussi <surfpnk@yahoo.com>
          1024 bit DSA key 0x39EE4EAD7BBB1E43, created: 1998-07-16
Keys 1-8 of 8 for "zanussi".  Enter number(s), N)ext, or Q)uit > 3

现在我们可以验证下载的源代码:

$ gpg2 --verify linux-4.14.139.tar.sign
gpg: assuming signed data in 'linux-4.14.139.tar'
gpg: Signature made Fr 16 Aug 2019 10:15:17 CEST
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
gpg: Good signature from "Greg Kroah-Hartman <gregkh@kernel.org>" [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

$ gpg2 --verify patch-4.14.139-rt66.patch.sign
gpg: assuming signed data in 'patch-4.14.139-rt66.patch'
gpg: Signature made Fr 23 Aug 2019 21:09:20 CEST
gpg:                using RSA key 0x0129F38552C38DF1
gpg: Good signature from "Tom Zanussi <tom.zanussi@linux.intel.com>" [unknown]
gpg:                 aka "Tom Zanussi <zanussi@kernel.org>" [unknown]
gpg:                 aka "Tom Zanussi <tzanussi@gmail.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: 5BDF C45C 2ECC 5387 D50C  E5EF DE09 8267 78A3 8521
     Subkey fingerprint: ACF8 5F98 16A8 D5F0 96AE  1FD2 0129 F385 52C3 8DF1

编译:

在编译源代码之前,我们必须提取tar存档文件并应用补丁

$ tar xf linux-4.14.139.tar
$ cd linux-4.14.139
linux-4.14.139$ xzcat ../patch-4.14.139-rt66.patch.xz | patch -p1

现在要配置内核,只需键入

linux-4.14.139$ make oldconfig

这将询问内核选项。对于其他所有东西,那么抢占模型使用默认值(只需按Enter)或适应您的偏好。对于抢占模型,选择Fully Preemptible Kernel:

Preemption Model
  1. No Forced Preemption (Server) (PREEMPT_NONE)
> 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
  3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT__LL) (NEW)
  4. Preemptible Kernel (Basic RT) (PREEMPT_RTB) (NEW)
  5. Fully Preemptible Kernel (RT) (PREEMPT_RT_FULL) (NEW)
choice[1-5]: 5

现在可以构建内核了。这需要一些时间……

linux-4.14.139$ make -j `getconf _NPROCESSORS_ONLN` deb-pkg

构建完成后,在父文件夹中安装linux-headers和linux-image包(只安装名称中没有-dbg的包)

linux-4.14.139$ sudo apt install ../linux-headers-4.14.139-rt66_*.deb ../linux-image-4.14.139-rt66_*.deb

设置用户权限以使用实时调度

为了能够调度具有用户权限的线程(驱动程序将做什么),您必须通过更改/etc/security/limits.conf来更改用户的限制(详细信息请参阅手册)。

我们建议为实时用户设置一个组,而不是在配置文件中写入一个固定的用户名:

$ sudo groupadd realtime
$ sudo usermod -aG realtime $(whoami)

然后确定包含 /etc/security/limits.conf

@realtime soft rtprio 99
@realtime soft priority 99
@realtime soft memlock 102400
@realtime hard rtprio 99
@realtime hard priority 99
@realtime hard memlock 102400

注意:您必须注销并重新登录(不仅仅是关闭终端窗口)才能使这些更改生效。现在不需要这样做,因为我们稍后将重新启动。

设置GRUB以始终引导实时内核

要使新内核成为系统每次启动时都会进入的默认内核,您必须更改/etc/default/grub.中的grub配置文件

注意:这适用于ubuntu,但可能不适用于其他linux系统。这里可能需要使用另一个菜单项名称。

但首先,让我们找出我们想要作为默认值的条目的名称。列出所有可用的内核

$ awk -F\' '/menuentry |submenu / {print $1 $2}' /boot/grub/grub.cfg

menuentry Ubuntu
submenu Advanced options for Ubuntu
    menuentry Ubuntu, with Linux 4.15.0-62-generic
    menuentry Ubuntu, with Linux 4.15.0-62-generic (recovery mode)
    menuentry Ubuntu, with Linux 4.15.0-60-generic
    menuentry Ubuntu, with Linux 4.15.0-60-generic (recovery mode)
    menuentry Ubuntu, with Linux 4.15.0-58-generic
    menuentry Ubuntu, with Linux 4.15.0-58-generic (recovery mode)
    menuentry Ubuntu, with Linux 4.14.139-rt66
    menuentry Ubuntu, with Linux 4.14.139-rt66 (recovery mode)
menuentry Memory test (memtest86+)
menuentry Memory test (memtest86+, serial console 115200)
menuentry Windows 7 (on /dev/sdc2)
menuentry Windows 7 (on /dev/sdc3)

从上面的输出中,我们需要生成一个模式为“submenu_name>entry_name”的字符串。在我们的例子中,这是

"Advanced options for Ubuntu>Ubuntu, with Linux 4.14.139-rt66"

双引号和>周围没有空格是很重要的!

这样,我们就可以设置默认的grub项,然后更新grub菜单项。不要忘记最后一步!

$ sudo sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.14.139-rt66"/' /etc/default/grub
$ sudo update-grub

重启pc

执行上述步骤后,重新启动PC。它应该自动引导到正确的内核。

检查优先权力

确保内核确实支持实时调度:

$ uname -v | cut -d" " -f1-4
#1 SMP PREEMPT RT

可选:禁用CPU速度缩放

许多现代cpu支持根据当前请求的计算资源动态更改其时钟频率。在某些情况下,这可能会导致执行中的小中断。虽然实时调度的控制器线程应该不受此影响,但任何外部组件(如视觉伺服系统)可能会在缩放变化时被中断一段时间。

检查和修改省电模式,请安装cpufrequtils:

$ sudo apt install cpufrequtils

执行命令cpufreq-info,查看可用的“governors”和当前“CPU Frequency”(当前CPU频率为XXX MHZ)。在下文中,我们将调控器设置为“performance”。

$ sudo systemctl disable ondemand
$ sudo systemctl enable cpufrequtils
$ sudo sh -c 'echo "GOVERNOR=performance" > /etc/default/cpufrequtils'
$ sudo systemctl daemon-reload && sudo systemctl restart cpufrequtils

这将禁用随需应变的CPU扩展守护进程,创建一个cpufrequtils配置文件并重启cpufrequtils服务。查看cpufreq-info。

有关调控器的更多信息,请参阅内核文档。

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值