本文记录在我笔记本上安装最新版本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