Xenomai"/>
Ubuntu18.04/20.04编译Linux5.10.76+Xenomai
0、前言
目前在ubuntu20.04和18.04下试过xenomai+IgH的安装,遇到了诸多问题,最终参考了网上的博客得到了这篇安装说明。编译系统中的gcc版本是gcc 7.5.0,但并不确定之前在20.04下安装失败是否是gcc版本的问题。
(1)22年3月:编译内核使用的是Ubuntu 18.04.06 LTS。
(2)22年4月27日:将系统gcc版本设为7.5.0,ubuntu20.04可以按照下面流程编译xenomai。
1、安装工具
sudo apt update
sudo apt-get install gcc git libncurses5-dev make flex bison libssl-dev libelf-dev automake
1.1 gcc版本切换
通过gcc -v查看当前gcc版本,安装所需的gcc版本
sudo apt install gcc-7 g++-7
为所有gcc版本设置优先级
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90
切换版本
sudo update-alternatives --config gcc
2、下载源码
Xenomai需要添加一个i-pipe层到内核中,目前的i-pipe对内核的支持只到Linux 5.4,5.10开始就要用到dovetail这个patch了。
2.1 Xenomai官方Linux5.10.76源码
Xenomai官方做好的内核源码链接如下,源码包名字如“linux-dovetail-v5.10.76-dovetail3.tar.gz”
下载地址
2.2 Xenomai源码
最新的Xenomai的源码链接如下,源码包名字如“xenomai-v3.2.1.tar.gz”
下载地址
3、解压压缩包
进入存放源码的路径下
sudo tar xf linux-dovetail-v5.10.76-dovetail3.tar.gz
sudo tar xf xenomai-v3.2.1.tar.gz
将解压后的文件拷贝到制定文件夹中
sudo mkdir ~/xenomai
sudo cp -r linux-dovetail-v5.10.76-dovetail3 ~/xenomai
sudo cp -r xenomai-v3.2.1 ~/xenomai
4、导入内核
将xenomai导入到待编译的内核中
cd ~/xenomai/linux-dovetail-v5.10.76-dovetail3
sudo ~/xenomai/xenomai-v3.2.1/scripts/prepare-kernel.sh --arch=x86_64
5、配置内核
sudo make menuconfig
内核配置参考如下
* General setup
--> Local version - append to kernel release: -xenomai(起个区分内核的名字)--> Timers subsystem
---> High Resolution Timer Support [*](默认)* Pocessor type and features --> Processor family ---> Core 2/newer Xeon (if “cat /proc/cpuinfo | grep family” returns 6, otherwise set as Generic otherwise)--> Multi-core scheduler support [](关闭)* Xenomai/cobalt --> Sizes and static limits ---> Number of registry slots (512 --> 4096) ---> Size of system heap (Kb) (4096 --> 4096) ---> Size of private heap (Kb) (256 --> 256) ---> Size of shared heap (Kb) (256 --> 256) ---> Maximum number of POSIX timers per process (256 --> 512) --> Drivers ---> RTnet ---> RTnet, TCP/IP socket interface (Enable) ----> Drivers -----> New intel(R) PRO/1000 PCIe(Gigabit) [M](模块) -----> Realtek 8169(Gigabit) [M](模块) -----> Loopback [M](默认) ----> Add-Ons -----> Real-Time Capturing Support [M](模块)* Power management and ACPI options --> CPU Frequency scaling ---> CPU Frequency scaling [](关闭) --> ACPI (Advanced Configuration and Power Interface) Support ---> Processor [](关闭) --> CPU Idle ---> CPU idle PM support [](关闭)* Memory Management Options ---> Transparent Hugepage Support [](关闭) ---> Allow for memory compaction [](关闭) ---> Contiguous Memory Allocation [](关闭)---> Page Migration [](关闭)* Device Drivers--> Unisys visorbus driver [](关闭)
上述配置的参考来源大致来源于此【内核配置参考】。
下面是一些可选配置
原文链接
* Pocessor type and features
--> Enable Maximum number of SMP Processors and NUMA Nodes [](可选)原文链接
* Xenomai/cobalt
--> Drivers
---> Real-time IPC drivers [*] (双击空格选定为*)(可选)
---> RTIPC protocol family <M>(默认)
---> XDDP cross-domain datagram protocol [*](默认)
---> IDDP intra-domain datagram protocol [*](默认)
---> Number of IDDP communication ports (32) (默认)
---> Buffer protocol [*](默认)
---> Number of BUFP communication ports (32) (默认)
6、编译内核映像、模组
sudo make -j4 bzImage
sudo make modules
sudo make INSTALL_MOD_STRIP=1 modules_install
【注】:可以在modules_install时通过INSTALL_MOD_PATH指定模组的安装位置。
make modules时可能会报如下错误(多数安装中都有遇到):
6.1 canonical-certs.pem
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
make: *** [Makefile:1868: certs] Error 2
命令行中执行
sudo scripts/config --disable SYSTEM_TRUSTED_KEYS
6.2 canonical-revoked-certs.pem
make[1]: *** No rule to make target 'debian/canonical-revoked-certs.pem', needed by 'certs/x509_revocation_list'. Stop.
make: *** [Makefile:1868: certs] Error 2
命令行中执行
sudo scripts/config --disable SYSTEM_REVOCATION_KEYS
6.3 BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
make: *** [Makefile:1113: vmlinux] Error 1
一般是系统缺少dwarves
软件包导致。
sudo apt install dwarves
6.4 "FAILED unresolved symbol udp_sock"
FAILED unresolved symbol udp_sock
make: *** [Makefile:1179: vmlinux] Error 255
这个问题没有得到很好的解决,试过在18.04中编译,20.04下gcc7.5.0编译,都遇到同样问题。但是失能以下指令将不会报错,可能引起的问题尚不确定
sudo scripts/config --disable CONFIG_DEBUG_INFO_BTF
6.5 “loading initial ramdisk”(Can't allocate initrd)
这是一个在安装完新的内核重启后可能会遇到的问题。编译内核过程中,当安装内核模块时未使用“INSTALL_MOD_STRIP=1”标注,会导致initrd文件过大,Grub 2.04无法支持过大的initrd文件(如500M),可通过以下命令解决
sudo make INSTALL_MOD_STRIP=1 modules_install
【注】对应的错误6.1、6.2、6.3也可以直接编辑.config文件,注释掉对应的选项;在执行make -j4 bzImage时会提示输入对应字段,直接按回车置空即可。
7、安装
将内核编译源码路径下的.config文件拷贝到/boot路径下,并重命名,其尾缀为第5步中“Local version”设置的内核名字:
sudo cp ~/xenomai/linux-dovetail-v5.10.76-dovetail3/.config /boot
sudo mv /boot/.config /boot/config-5.10.76-xenomai
将内核编译源码中的bzImage拷贝被到/boot下并重命名,尾缀同上:
sudo cp ~/xenomai/linux-dovetail-v5.10.76-dovetail3/arch/x86_64/boot/bzImage /boot
sudo mv /boot/bzImage /boot/vmlinuz-5.10.76-xenomai
将内核编译源码中的System.map拷贝被到/boot下并重命名,尾缀同上:
sudo cp ~/xenomai/linux-dovetail-v5.10.76-dovetail3/System.map /boot
sudo mv /boot/System.map /boot/System.map-5.10.76-xenomai
【注】:可以将make modules_install生成的模组(/lib/modules/5.10.76-xenomai)拷贝到要替换内核系统的/lib/modules下。
生成/boot/initrd.img-5.10.76-xenomai文件:
cd /lib/modules/5.10.76-xenomai
sudo update-initramfs -c -k 5.10.76-xenomai
8、允许非root用户
sudo addgroup xenomai --gid 1234
sudo addgroup root xenomai
sudo usermod -a -G xenomai $USER
9、配置GRUB(可选)
sudo gedit /etc/default/grub
具体配置如下
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.10.76-xenomai"
GRUB_TIMEOUT=10
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash xenomai.allowed_group=1234"
更新grub
sudo update-grub
sudo update-grub2
重启电脑,看下版本号是否发生变化
uname -a
dmesg | grep -i xenomai
10、安装库
前面下载好的xenomai源码包里面没有configure脚本和makefile,需要手动生成,在源码根目录下使用./scripts/bootstrap
命令。然后使用以下命令进行配置:
cd ~/xenomai/xenomai-v3.2.1
sudo ./scripts/bootstrap
sudo ./configure --with-pic --with-core=cobalt --enable-smp --disable-tls --enable-dlopen-libs --disable-clock-monotonic-raw
sudo make -j4
sudo make install
配置中的参数解释:位置无关代码、使用cobalt微内核、对称多处理、线程本地存储、动态加载基于Xenomai的库、使用单调递增时间来计时。
可能遇到的问题1
"possibly undefined macro: AC_ENABLE_SHARED"
解决方法
sudo apt install automake libtool m4 autoconf
可能遇到的问题2
configure: error: cannot find install-sh, install.sh, or shtool in "." "./.." "./../.."
解决方法
sudo autoreconf -vif
11、更新环境变量
echo '
### Xenomai
export XENOMAI_ROOT_DIR=/usr/xenomai
export XENOMAI_PATH=/usr/xenomai
export PATH=$PATH:$XENOMAI_PATH/bin:$XENOMAI_PATH/sbin
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$XENOMAI_PATH/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$XENOMAI_PATH/lib
export OROCOS_TARGET=xenomai
' >> ~/.xenomai_rcecho 'source ~/.xenomai_rc' >> ~/.bashrc
source ~/.bashrc
追加权限:
sudo chmod -R 777 /dev/rtdm/memdev-private
sudo chmod -R 777 /dev/rtdm/memdev-shared
12、测试
sudo /usr/xenomai/bin/latency
还可以使用“rt-tests”进行测试,运行测试(5个线程,线程优先级80,以ns显示时间)
sudo apt install rt-tests
sudo cyclictest -t 5 -p 80 #默认时间单位微秒,添加-N以纳秒显示
rt-tests测试结果中各字母含义为:
T: 0 序号为0的线程
P: 0 线程优先级为0
C: 9397 计数器。线程的时间间隔每达到一次,计数器加1
I: 1000 时间间隔为1000微秒(us)
Min: 最小延时(us)
Act: 最近一次的延时(us)
Avg: 平均延时(us)
Max: 最大延时(us)
两个测试测试结果如下图所示:
13、修复xenomai负延迟
sudo -s
echo 0>/proc/xenomai/latency
sudo /usr/xenomai/bin/latency
运行一段时间后记录下“last_best”的值,令YOUR_VALUE=这个值*1000
echo YOUR_VALUE>/proc/xenomai/latency
14、编译IgH
14.1 下载源码包
安装所需工具
sudo apt install autoconf autogen libtool
下载IgH源码(下载链接),源码包名字如“ethercat-e1000e-5.10.tar.gz”
cd ~/Download
sudo tar xf ethercat-e1000e-5.10.tar.gz
sudo cp -r ethercat-e1000e-5.10 ~/xenomai
cd ~/xenomai/ethercat-e1000e-5.10
14.2 编译IgH
编译IgH,其中的配置选项根据实际情况参照下图(来自官方文档)
sudo ./bootstrap
sudo ./configure --with-module-dir=/lib/modules/5.10.76-xenomai --enable-generic --enable-8139too=no --enable-e1000e --enable-cycles --enable-hrtimer --with-xenomai-dir=/usr/xenomai --prefix=/opt/etherlab
sudo make #编译
sudo make modules #编译模块
sudo make install #安装
sudo make modules_install #安装模块
如果在刚开始配置的时候没有动–prefix选项,默认是安装在/opt/下的,可以查看在/opt/路径下多了一个etherlab文件夹。
14.3 配置
sudo mkdir /etc/sysconfig #创建文件夹
sudo cp /opt/etherlab/etc/sysconfig/ethercat /etc/sysconfig/ #复制配置文件
sudo cp /opt/etherlab/etc/init.d/ethercat /etc/init.d/ #复制启动脚本
sudo chmod a+x /etc/init.d/ethercat
sudo update-rc.d ethercat defaults
使能ethercat工具
sudo ln -s /opt/etherlab/bin/ethercat /usr/local/bin/ethercat
配置用户权限
$ sudo gedit /etc/udev/rules.d/99-EtherCAT.rules
输入下列内容 KERNEL=="EtherCAT[0-9]*", MODE="0664", GROUP="users"
把相关模块放进系统目录,如果使用通用网卡是这样的
sudo cp devices/ec_generic.ko /lib/modules/$(uname -r)
sudo cp master/ec_master.ko /lib/modules/$(uname -r)
如果使用专用网卡需要多进一个目录,是这样的
sudo cp devices/e1000e/ec_e1000e.ko /lib/modules/$(uname -r)
sudo cp master/ec_master.ko /lib/modules/$(uname -r)
然后执行命令
sudo depmod
查看网卡MAC地址和类型
ifconfig
配置网卡
sudo gedit /etc/sysconfig/ethercat
在27行和56行处填入自己的网卡信息
MASTER0_DEVICE=" "
DEVICE_MODULES=" "
14.4 启动主站
sudo /etc/init.d/ethercat start
如果主站启动则表示安装成功。
还有很多好用的ethercat tool,通过下面命令查看帮助
sudo ethercat --h
14.5
ethercat master可以跑了,接下来就是配置系统,让应用程序可以使用 /opt/etherlab/lib 到你的 /etc/ld.so.conf(/opt/ethercatlab前缀实在前面配置ethercat是选定的,默认是/opt/ethercatlab)
sudo gedit /etc/ld.so.conf
添加 /opt/etherlab/lib
sudo ldconfig
通过下面指令测试是否安装
sudo ldconfig -v | grep libether*
成功安装会显示 libethercat.so.1 -> libethercat.so.1.1.0
参考资料:
Ubuntu18.04安装xenomai3.1.x实时系统笔记
linux系统乌班图18.04安装xenomai3.1,内核4.9.38
EtherCAT(ubuntu18.04,linux4.9.38,xenomai3.1,igh1.52)配置完整流程
Xenomai实现RTOS(1)Ubuntu20.04下,Xenomai3.2.1+Linux5.10.76安装
Ubuntu18.04+Xenomai3.1详细步骤(附内核deb文件)
Linux下IGH Ethercat Master安装
IgH详解六、IgH命令行工具使用
Grub 2.04启动内核卡在“loading initial ramdisk”
ethercat环境搭建(igh安装)
内核错误:BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
更多推荐
Ubuntu18.04/20.04编译Linux5.10.76+Xenomai
发布评论