虚拟机上的ubuntu安装RT系统+安装IGH
准备工作
在使用EtherCat的时候,公司为方便测试,使用开源的主站IGH,那么需要安装IGH。IGH的运行环境是LINUX,对操作系统有实时性的要求。解决的具体思路是:在ubuntu环境下编译一个修改的linux内核,也就是对内核打实时补丁,也就是接下来的第一步工作。
ubuntu 内核+对应版本的补丁
原系统:Ubuntu 20.04.2LTS
原内核版本:不管,一般比接下来使用的内核高
目标内核:linux-5.4.28-rt19
下载:
链接: https://pan.baidu.com/s/16vq104VM1EvP_t6QrTTU5A?pwd=r1wm
提取码: r1wm
预备软件安装
安装图形界面
sudo apt-get install -y build-essential kernel-package libncurses5-dev
安装编译工具
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install bc
sudo apt-get install libelf-dev
sudo apt-get install libncurses-dev
sudo apt-get install libssl-dev
进入root模式
#第一次进入root模式需要设置密码
sudo passwd root
#上步完成
su
开始安装,打补丁->编译->安装
1.找到刚刚下载文件的文件夹
cd ~/Downloads
2.选择一个地方为编译做准备,编译结束大小在20G左右
可以查看当前文件夹大小
df -h
3.转到编译目录
#创建rt_linux_build
mkdir rt_linux_build
#改变目录到rt_linux_build
cd ~/rt_linux_build
#复制linux-5.4.28.tar.gz到lrt_linux_build
cp ~/Downloads/linux-5.4.28.tar.gz ./
#复制patch-5.4.28-rt19.patch.gz到rt_linux_build
cp ~/Downloads/patch-5.4.28-rt19.patch.gz ./
#解压linux-5.4.28.tar.gz到rt_linux_build
tar zxvf linux-5.4.28.tar.gz
#解压patch-5.4.28-rt19.patch.gz到rt_linux_build
gzip -d patch-5.4.28-rt19.patch.gz
#复制patch-5.4.28-rt19.patch到linux-5.4.28
cp patch-5.4.28-rt19.patch ./linux-5.4.28
#到linux-5.4.28目录
cd linux-5.4.28
#打补丁
patch -p1 < patch-5.4.28-rt19.patch
配置内核
sudo make menuconfig
1.进入“General setup”, 在"Preemption Model"中选择“Fully Preemptible Kernel(Real-Time)”
2.找到Device Drivers,找到staging drivers ,(在比较后面,慢慢找),然后按空格键,把它去掉。
3.save、exit
准备编译
1.为了减少编译时出现的错误以及问题,现在总结网上常见问题并提前修改
gedit .config
注释掉下面两行
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
改成
#CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
#CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
2.查看当前系统分配的内核数
lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 43 bits physical, 48 bits virtual
CPU(s): 8
这里8核,编译可以开8的倍数的并行编译
3.编译过程
cd ~linux-5.4.28
make -j8
make modules -j8
make modules_install -j8
make install -j8
最后没有错误,出现down结尾,就是编译完成
修改启动时选择的内核
就是把刚刚编译好的内核在linux启动时启动
1.查看自己的grub版本
grub-install --version
记住(GRUB)之后的大版本是2.00以后还是2.00以前
2.查看自己现有的内核版本(完全版)
grep 'menuentry' /boot/grub/grub.cfg
3.找到自己需要换的内核
将menuentry
之后单引号内容复制,比如:
menuentry 'Ubuntu, with Linux 5.4.28-rt19'
复制Ubuntu, with Linux 5.4.28-rt19
4.修改grub
su
gedit /etc/default/grub
将
GRUB_DEFAULT=0
改为
GRUB_DEFAULT = "Ubuntu, with Linux 5.4.28-rt19"
5.更新grub
sudo update -grub
看到警告
根据警告,之前第一步的时候查看过grub的版本,根据警告更改单引号内容。
比如当前是大于2的,则把第三个单引号的内容复制,然后回到第四步重新粘贴
6.再次
sudo update -grub
sudo reboot
7.查看
uname -r
可以看到
zyy@ubuntu:~$ uname -r
5.4.28-rt19
8.测试
sudo apt-get install rt-tests
sudo cyclictest -t 5 -p 80 -s
#sudo cyclictest -t 5 -p 80 -N ##用ns显示
说明
对参数进行说明:
T: 0 序号为0的线程
P: 0 线程优先级为0
C: 9397 计数器。线程的时间间隔每达到一次,计数器加1
I: 1000 时间间隔为1000微秒(us)
Min: 最小延时(us)
Act: 最近一次的延时(us)
Avg:平均延时(us)
Max: 最大延时(us)
cyclictest的一篇参考文章:cyclictest 测试以及原理浅谈_i龙家小少的博客-优快云博客_cyclictest
结论:VM上使用RT,延时很高,不合适
安装IGH
注意1: 必须关闭scurity boot,不然在启动sudo /etc/init.d.ethercat start
会出现权限不够的问题
使用sudo dmesg
查看可知:Lockdown: insmod: unsigned module loading is restricted; see man kernel_lock
注意2: 填写网卡ether时,选择en开头的网卡,不是无线网卡
https://stackoverflow.com/questions/10704983/operation-not-permitted-while-setting-new-priority-for-thread
https://ros-realtime.github.io/Benchmarks/pendulum_demo_benchmark_instructions.html
mkdir ec_igh
cd ec_igh
git clone http://gitlab.com/etherlab.org/ethercat.git
cd ethercat/
./bootstrap
./configure --enable-8139too=no
sudo make
sudo make modules
sudo make install
sudo make modules_install
#查看网卡,找出MAC
ifconfig
sudo gedit /usr/local/etc/sysconfig/ethercat
#把下面两项复制进对应位置,两个文件夹都要操作
MASTER0_DEVICE="00:0c:29:0d:3e:cc"
DEVICE_MODULES="generic"
# 这里操作错误会出现以下错误
# Starting EtherCAT master 1.6.0-rc1 modprobe: ERROR: could not insert 'ec_master': Invalid argument
failed
------------------
# 拷贝文件到系统内
sudo mkdir /etc/sysconfig
sudo cp /usr/local/etc/sysconfig/ethercat /etc/sysconfig/ethercat
# 链接
sudo ln -s /usr/local/etc/init.d/ethercat /etc/init.d/ethercat
#配置用户态库
cd /etc/udev/rules.d
#新建一个ethercat的rule文件
sudo gedit 99-ethercat.rules
#向文件中添加下面内容
KERNEL=="EtherCAT[0-9]", MODE="0777"
#配置实时权限
sudo gedit /etc/security/limits.conf
#在该文件的最下方按照格式添加
<username> hard rtprio 99
```txt
@lm soft rtprio 99
@lm soft priority 99
#@lm soft memlock 99 # 可能需要加这行
@lm hard rtprio 99
@lm hard priority 99
#@lm hard memlock 99 # 可能需要加这行
```
#验证是否启动实时
pendulum_demo -d 200mb -t 90 -s fifo -u 1ms -i 60000 -f pendulum_demo_results
#启动
sudo depmod
#开启主站
sudo /etc/init.d/ethercat start
#显示主站状态
ethercat master
#显示从站设备
ethercat slaves
#关闭主站
sudo /etc/init.d/ethercat stop
参考
ubuntu安装实时内核
Ubuntu20.04 如何降低内核版本
igh+preempt_rt主战搭建
Ubuntu下Linux配置内核各种常见错误和解决办法
Ubuntu实时内核安装&Igh主站安装配置
ubuntu20.04 LTS安装Igh EtherCAT Master