本文记录在我笔记本上安装最新版本RTAI(5.2)的过程和中间遇到的问题及解决方法,虽然不能覆盖所有问题,但希望能给后来者一些帮助。
安装的主要步骤:
1、安装操作系统和工具;
2、给内核打补丁并配置;
3、安装打补丁的内核与RTAI。
步骤一:安装操作系统和工具
1.1 安装操作系统
我选择的是Ubuntu18.04,因为这是带Linux 4.**.***内核的最新Ubuntu 版本(Ubuntu19.04 是以Linux5.**内核开始了)。而RTAI5.2 支持的最新内核版本即为4.14.111;
1.2 安装工具
这些工具是内核编译时需要的,下面命令可以保存为脚本执行
sudo apt install libncurses5-dev
sudo apt install libssl-dev
sudo apt install bison
sudo apt install flex
sudo apt install libssl-dev
sudo apt install libelf-dev
sudo apt install make gcc
sudo apt install patch
sudo apt install unzip
sudo apt install autoconf
注意:如果你使用的是不同的Linux 发布版(Redhat或openSUSE),有些包的名称是不同的,比如对于Redhat,libssl的安装包是libssl-devel。
注意:如果你采用的是Ubuntu16.04,那么可能因为包依赖的原因,你无法用apt install 命令安装libssl1.1,而这个包是在编译4.14.111 内核时必须的,所以建议你要么换更高版本OS,要么在Ubuntu 网站( https://packages.debian.org/stretch/amd64/libssl1.1/download )手动安装该包(sudo dpkg -i libssl1.1_1.1.0k-1~deb9u1_amd64.deb)。
1.3 安装已编译的Linux 内核4.14.111 (可选的)
该步骤是可选的,它会给系统安装上Linux4.14.111 的内核,从而获得一个默认的内核配置文件供后面使用,如果你是第一次安装RTAI,建议你执行该步骤。
在内核网站 https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/ 下载内核安装包:
cd ~/Downloads/
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/linux-headers-4.14.111-0414111_4.14.111-0414111.201904052241_all.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/linux-headers-4.14.111-0414111-lowlatency_4.14.111-0414111.201904052241_amd64.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/linux-image-unsigned-4.14.111-0414111-lowlatency_4.14.111-0414111.201904052241_amd64.deb`
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/linux-modules-4.14.111-0414111-lowlatency_4.14.111-0414111.201904052241_amd64.deb
然后使用dpkg -i 命令安装
sudo dpkg -i *.deb #执行该命令是可能会遇到错,再重新执行该命令可以解决;
sudo update-grub
sudo reboot
重启后可以在Grub (长按shift进入Grub)中看到安装后的内核有“Generic” 和“lowlatency” 两种。如果进入Grub 有困难,在Grub 配置文件(/etc/default/grub)中修改配置`GRUB_TIMEOUT_STYLE=hidden` 为`GRUB_TIMEOUT_STYLE=false`并更新Grub 菜单`sudo update-grub`。
步骤二:内核打补丁和编译
2.1 下载内核 (https://cdn.kernel.org/pub/linux/kernel/v4.x/)
内核的名称为 linux-4.1.111.tar.gz,为之后编译和安装方便,将源码解压到`/usr/src` 中,并创建一个软链接到该源码目录。
cd /usr/src
sudo tar xvf linux-4.1.111.tar.gz
sudo ln -sf linux-4.1.111 linux
然后,从`/boot` 中拷贝配置文件:
cd /usr/src/linux
sudo cp /boot/config-4.14.111-0414111-lowlatency .config
如果你已经有了一个配置文件(比如你安装过老版本RTAI,在其Linux 内核中拷贝其配置文件即可)uIf you already have a configuration file (e.g. in your old RTAI patched Linux system), just copy it to the source path(`/usr/src/linux`).
2.2 给内核打补丁(Ubuntu 的补丁和RTAI 的补丁)
Ubuntu 是Linux 的一个发行版本,并对Linux 内核代码做了少量修改,所以在编译内核前应该打上Ubuntu 的补丁(https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/)。
cd ~/Downloads/
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/0001-base-packaging.patch
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/0002-UBUNTU-SAUCE-add-vmlinux.strip-to-BOOT_TARGETS1-on-p.patch
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/0003-UBUNTU-SAUCE-tools-hv-lsvmbus-add-manual-page.patch
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/0004-adhoc-from-__future__-import-syncconfig.patch
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/0005-UBUNTU-SAUCE-no-up-disable-pie-when-gcc-has-it-enabl.patch
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/0006-debian-changelog.patch
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.111/0007-configs-based-on-Ubuntu-4.14.0-11.13.patch
cd /usr/src/linux
sudo patch -p1 < ~/Downloads/0001-base-packaging.patch
sudo patch -p1 < ~/Downloads/0002-UBUNTU-SAUCE-add-vmlinux.strip-to-BOOT_TARGETS1-on-p.patch
sudo patch -p1 < ~/Downloads/0003-UBUNTU-SAUCE-tools-hv-lsvmbus-add-manual-page.patch
sudo patch -p1 < ~/Downloads/0004-adhoc-from-__future__-import-syncconfig.patch
sudo patch -p1 < ~/Downloads/0005-UBUNTU-SAUCE-no-up-disable-pie-when-gcc-has-it-enabl.patch
sudo patch -p1 < ~/Downloads/0006-debian-changelog.patch
sudo patch -p1 < ~/Downloads/0007-configs-based-on-Ubuntu-4.14.0-11.13.patch
下载RTAI5.2 并给内核打上相应的补丁 :
wget https://www.rtai.org/userfiles/downloads/RTAI/rtai-5.2.tar.bz2
sudo cp rtai-5.2.tar.bz2 /usr/src/
sudo tar xvf rtai-5.2.tar.bz2
sudo ln -sf rtai-5.2 rtai
cd /usr/src/linux
sudo patch -p1 < /usr/src/rtai/base/arch/x86/patches/hal-linux-4.14.111-x86-3.patch
同样方便起见,我们也为rtai 的源码创建了一个软链接。
注意:安装RTAI补丁和PREEMPT-RT补丁的过程是类似的,如果你想安装PREEMPT-RT补丁,它的地址在这里。下载xz或gz格式后的补丁,可以用xz工具解压发现,是一个个编了序号的补丁,通过下面命令逐个应用补丁
patch -p1 -i /path/to/004-patch.x.y.z
也可以通过下面命令应用所有补丁
xzcat /path/to/patch.xz | patch -p1
bzcat /path/to/patch.xz | patch -p1
2.3 配置内核
配置内核主要参考下面的资料:
- RTAI-5.2 源码目录下的关于配置的备注文件 README.CONF_RMRKS
- https://github.com/relacs/makertai
- https://www.rtai.org/userfiles/downloads/RTAILAB/RTAI-TARGET-HOWTO.txt
- https://github.com/relacs/makertai
如果你的配置文件是从其他老的内核里拷贝过来的,首先应执行:
cd /usr/src/linux
sudo make oldconfig
否则直接执行:
sudo make menuconfig
下面是配置项中应修改的部分:
[改为 -rtai] General setup -> Local Version
[改为 None] General setup -> Stack Protector buffer overflow detection
[Enable] Processor type and features -> Interrupt pipeline
[Disable] Power management and ACPI options -> CPU Frequency Scaling
[Disable] Power management and ACPI options -> ACPI Support -> Processor
[Disable] Power management and ACPI options -> CPU Idle -> CPU idle PM support
[Disable] Kernel hacking -> Compile-time checks and compiler options -> Compile the kernel with debug info
[Disable] Kernel hacking -> Tracers
[Disable] Device Drivers -> Microsoft Hyper-V guest support
[Disable] Device Drivers -> Staging drivers -> Data acquisition support (comedi)
在 README.CONF_RMRKS 文件中要求disable `AUDITSYSCALL`,但是我们在选项中没有找到这一项。一个可替代的方法是编辑 `/usr/src/linux/init/Kconfig`文件,找到`AUDITSYSCALL` 如下部分:
config AUDITSYSCALL
def_bool y
depends on AUDIT && HAVE_ARCH_AUDITSYSCALL
替换为:
config AUDITSYSCALL
bool “Enable system-call auditing support”
depends on AUDIT && HAVE_ARCH_AUDITSYSCALL
default y if SECURITY_SELINUX
help
Enable low-overhead system-call auditing infrastructure that
can be used independently or with another kernel subsystem,
such as SELinux.
然后,你就可以在‘General Setup’选项下看到`ADUITSYSCALL`,取消即可。
如果你的主机是多CPU 或多核的,那么 `Processor type and features` 下的SMP 选项要使能(enabled),并且最大CPU 个数(`Maximum numbers of CPUs`)不应小于物理核心个数(即不考虑Hyperthreading)。因此,建议你在BIOS 中取消Hyperthreading。
步骤三:编译安装内核和RTAI
3.1 编译和安装Linux 内核
cd /usr/src/linux
sudo touch REPORTING-BUGS
sudo make -j3
sudo make modules
sudo make modules_install
sudo make install
sudo update-initramfs –c -k 4.14.111-rtai [注意修改这里的版本名称]
sudo update-grub [注意修改/etc/default/grub 启动项为自己的内核]
sudo reboot
从Linux 内核网站下载的4.14.111 版本的源码目录下没有`REPORTING-BUGS`这个文件,可能会导致你在编译的时候遇到`recipe for target ‘kernel_headers’ failed` 的错误,所以我们首先创建了这个文件。
如果一切顺利的的话,你重启后将在Grub 上看到你自己编译的内核选项:ubuntu18.04_4.14.111-rtai 。
3.2 安装RTAI5.2
RTAI 需要autotools 生成链接编译工具:
cd /usr/src/rtai
sudo autoconf
sudo ./configure
接着配置RTAI :
sudo cp ../linux/.config .rtai_config
sudo make menuconfig
将CPU 个数(`number of CPUs`)设置为实际的物理核心个数即可。
sudo make
sudo make install
如果在编译时遇到下面的错误:
make:execup: .//config.guess: Permission denied
make:execup: .//config.sub: Permission denied
手动修改权限后再编译:
chmod 764 ./config.guess
chmod 764 ./config.sub
RTAI 默认的安装路径是`/usr/realtime`,其中`modules`目录下是编译后的模块库, `testSuite` 目录下是RTAI 的测试程序,通过手动加载模块和运行测试程序可以验证RTAI是否安装成功。
cd /usr/realtime/modules
sudo insmod rtai_hal.ko
sudo insmod rtai_sched.ko
sudo insmod rtai_fifos.ko
sudo insmod rtai_sem.ko
sudo insmod rtai_shm.ko
sudo insmod rtai_rtdm.ko
一般来说,负责进程调度的 rtai_sched.ko 模块如果加载后无死机,则安装成功。
可能遇到的问题
最后罗列一些可能遇到的问题:
1 编译内核时, `implicit declaration of function ‘ipipe_root_**_syscalls’ did you mean ‘ipipe_handle_syscall’ ……` 错误
原因:在内核配置里,ipipeline 没有使能(Enable);
2 加载`sudo insmod rtai_hal.ko` 和`sudo insmod rtai_` 后,系统冻死,键盘和鼠标均无响应
可能原因:General setup -> Stack Protector buffer overflow detection 选项默认是`Strong`,应设置为`None`或 `Regular`,更多配置项参考 README.CONF_RMRKS 。
3 不能进入编译Linux内核后的系统,提示`Gave up waiting for root file system device. Common problems: …… ALERT! UUID=8e478c20-25e4-49c0-…… does not exist. Drop to the shell`.
可能原因:系统无法识别存储设备,注意配置内核时关于存储的驱动(SATA/PATA)要使能,因为我是在U盘中安装的系统,因此U盘相关的驱动也得使能。
4 当准备加载 rtai_hal.ko 模块时,提示`ERROR: Could not insert module rtai_hal.ko: Operation not permitted`错误,系统日志Syslog(`/var/log/syslog`) 提示`RTAI[hal] RTAI configured with less than num online CPUs`。
可能原因:RTAI 配置的CPU 个数比实际CPU 核心数要多,切记不要算上超线程(Hyperthreading)。
以上错误远不能包含所有你在安装RTAI 时遇到的问题,但你还可以借助下面的工具来帮助你的调试。
一些有用的命令和工具
- Dmesg
dmesg
- Syslog
sudo cat /var/logsys
- Systemctl
Systemctl -failed # 查看哪些内核没有被正常加载
- RTAI 官网和邮件列表
www.rtai.org
- Dpkg
dpkg –list | grep linux-image
- mkinitramfs
我来自德国汉堡,我想请教一些问题,能否提供帮助?谢谢
已回您邮件!
linux-4.1.111.tar.gz
你好,在配置完内核后编译内核时,出现了
“In file included from scripts/selinux/genheaders/genheaders.c:19:
./security/selinux/include/classmap.h:245:2: error: #error New address family defined, please update secclass_map.
245 | #error New address family defined, please update secclass_map.
| ^~~~~
make[3]: *** [scripts/Makefile.host:102: scripts/selinux/genheaders/genheaders] Error 1
make[2]: *** [scripts/Makefile.build:585: scripts/selinux/genheaders] Error 2
make[1]: *** [scripts/Makefile.build:585: scripts/selinux] Error 2
make: *** [Makefile:572: scripts] Error 2”
的问题,请教一下这个问题出现的原因以及解决办法。
网上很多对于这个错误的分析,你可以参考下
https://lkml.org/lkml/2019/4/23/497
我用的是Ubuntu没有遇到你的问题。
ubuntu链接上,已经没有v4.14.111的包了,能否分享一下
https://kernel.ubuntu.com/~kernel-ppa/mainline/ 可以考慮用其他版本。也是一樣的。
使用110与120的版本后,linux内核会编译不过,ipipe方面报错,如何解决
有没有在内核配置里使能ipipe ?
我也遇到这个问题了 ,亲怎么解决的啊 Processor type and features -> Interrupt pipeline这个选项找不到啊 亲解决了吗 麻烦回复一下 谢谢
如果在配置项里没有找到Interrupt pipeline 选项,应该就是内核源码没有正确打上RTAI 补丁。
您好,能留一个邮箱或者联系方式吗,谢谢了
已回复您邮件
您好,参考网上各种方案做了几天的RTAI 。都没有成功,最后几次都是依照您的这篇。
有几个疑问向您请教一下:
1。在编译RTAI时会出现很多WARNING 关于数据结构SIZE不匹配的, 是否有影响?
2。我最好的状况,是执行到手动加载RTAI模块时,每个rtai模块都提示:invalid module format
3。我主要使用了(rtai-5.2和ubuntu18.04)以及 (ubuntu server 16.04.1和rtai5.2)其中16.04.1可以在UBUNTU官方找到与RTAI一致的4.4.*KERNEL。
GOOGLE也找不到答案。
没写完就发出去了。
编译安装内核的过程没有异常,编译RTAI的过程有一些关于SIZE的WARNING。安装RTAI后,有很多WARNING ,像下面这样:
i. Linking the executable latency against the loadable module
1) Liblxrt.so is not portable!
ii. Linking the executable display against the loadable module
1) Libxlrt.so is not portable .
iii. Linking the executable preempt against the loadable module
1) Liblxrt.so is not portable
iv. Linking the executable switches against the loadable module
1) Liblxrt.so is not portable
不知道您是否能给我些建议,不胜感激。
1 第一个问题我没有碰到,你可以每个查下具体是什么现象,是什么原因造成的
2 invalid module format 即你编译后的ko 格式不对,发现这个错误的时候,kernel和RTAI都正常安装了吗?
3 kernel和rtai内核版本必须一致,不必和Ubuntu内核默认版本一致。
最后not portable 的错误你参考了这里的答案吗?
https://rtai.rtai.narkive.com/T6i4p28U/liblxrt-so-is-not-portable-and-rtai-lxrt-ko-1-invalid-module-format
RTAI的问题在RTAI maillist 里一般能找到答案。
完成安装了。综合了多个文章,不过我感觉主要是因为SMP选项与机器实际不匹配,感觉并没有真的进入打了RTAI的系统。导致后面的操作都不成功。现在好了,自己也总结了一下,方便以后安装。
编译内核和RTAI的过程都有一些关于数据结构SIZE不匹配的警告。高亮粉色提示。现在还不知道影响,做工程遇到问题再解决吧。
感谢发布实操经验,帮助很大。感谢回复。
我QQ181876052
是做机器人的,也做软件开发和外包。可以交个朋友 。
完成安装了。综合了多个文章,不过我感觉主要是因为SMP选项与机器实际不匹配,感觉并没有真的进入打了RTAI的系统。导致后面的操作都不成功。现在好了,自己也总结了一下,方便以后安装。
编译内核和RTAI的过程都有一些关于数据结构SIZE不匹配的警告。高亮粉色提示。现在还不知道影响,做工程遇到问题再解决吧。
感谢发布实操经验,帮助很大。感谢回复。
我QQ181876052
是做机器人的,也做软件开发和外包。可以交个朋友 。
另外您网站发表评论会提示错误,不过评论内容会提交。
谢谢您的反馈。
1 编译内核时, `implicit declaration of function ‘ipipe_root_**_syscalls’ did you mean ‘ipipe_handle_syscall’ ……` 错误。
我在内核配置中没有找到ipipeline,也没有找到网上说的Processor type and features -> Interrupt pipeline,这个选项在 make menuconfig中找不到,能否给一个详细说明,谢谢,我内核版本和RTAI版本都是跟你一摸一样的。
都成功了,但安装后,无法正常启动,不过系统是Ubuntu 20.10
请问在Processor type and features -> Interrupt pipeline没有 Interrupt pipeline怎么办啊,RTAI只对应特定版本的Linux内核,但是对应的Linux内核在网上找不到补丁,该如何解决啊,请问您有4.14.111的Ubuntu补丁吗?能发我一下吗?
搞定了吗,我觉得你Interrupt pipeline 选项都没有的话,应该是RTAI的补丁都没装好吧。
root@rtos:~# cd /usr/realtime/modules
root@rtos:/usr/realtime/modules# insmod rtai_hal.ko
insmod: ERROR: could not insert module rtai_hal.ko: Invalid module format
这个问题实在是不知道该怎么解决,另外如果启动选择了***.rtai 版本 会卡在random: crng init done。。。请问该怎么办
你的RTAI没有安装好,请按照步骤装好了RTAI再尝试测试。