记录在redhat7.2中编译vcan
由于项目需求,需要搭建can总线开发环境,在没有硬件设备的前提下,准备用虚拟环境开发。
搜了一下,发现https://github.com/GENIVI/CANdevStudio这个项目挺适合的,可以用linux中的vcan进行环境仿真。
但是redhat7.2并没有开启can总线支持,需要自己编译内核,获得can和vcan的ko模块。
uname -r发现系统用的是3.10.0-229.11.11.rt56.141.11,于是去找对应的内核源文件。
这里需要说一下:229是redhat7.1使用的内核版本,7.2中使用的是3.10.0-327,所以使用yum源中的版本不行,得自己下载。
不知道在哪里下载redhat的源文件,于是从centos上找。
https://git.centos.org/rpms/kernel-rt/是实时内核的源码,https://git.centos.org/rpms/kernel是普通核的源码,区别在于
=》
上图中会多出最后两个配置,RT表示是realtime kernel。
在上述网址的
中选择正确的版本,在其中的“.kernel-rt.metadata”文件中找出内核源码压缩包的哈希码,

然后在这个网址https://git.centos.org/sources/kernel-rt/c7-rt/中找到对应的文件,下载后改名为XXX.tar.xz。
解压,开始编译。
首先从/boot中赋值configXXXX文件到当前源码中(与uname -r一致),命名为.config,然后就可以基于当前系统的配置修改了,在net-》can中打开can和vcan的支持,标记为M,
make
如果出现因为-Werror造成的错误,说明gcc将所有warning当做了error,修改内核的Makefile文件,其中有一处“KBUILD_CFLAGS”设置了-Werror,将其改为-Wno-error,继续make。
编译成功后需要将drivers/net/can和net/can分别拷贝到/lib/modules/`uname -r`中的kernel/drivers/net/can、/kernel/net/can中,因为前者包含了vcan.ko,后者包含了can.ko。
然后运行depmod -a, modprobe can modprobe van,就能加载成功vcan模块了。
如果采用的内核版本不一致,可能会报“modprobe Exec format error”,用modinfo查看会发现其中的rhelversion是7.2(我用327源码包编译的就会报错)。

用一下命令创建vcan设备:
sudo ip link add dev can0 type vcan
sudo ip link set can0 up
用ifconfig命令查看,就能看见can0设备了。
记录几个有用的网址:
https://vault.centos.org/,centos和redhat的源
https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/,linux-rt的源代码
https://www.modb.pro/db/473391,一个介绍gcc选项的网址
https://github.com/torvalds/linux, linux kernel source

浙公网安备 33010602011771号