群晖驱动编译篇(三)CX314A – ConnectX-3 Pro
本驱动坑度:50,编译耗时: 10分钟以内,排坑一天(太老了,没文档)
设备信息:DS918+ DSM7.0 Linux内核4.4.180+
驱动地址:https://network.nvidia.com/products/ethernet-drivers/linux/mlnx_en/
目的:使用最新版的CX314A网卡驱动
致谢:https://github.com/a-will/mlnx-ofa-kernel
编译基础:群晖驱动编译篇(一)编译环境搭建,非上述方法搭建的环境一定会有坑,且大概率不成功。
躺平玩法
直接用大佬的编译好的2.2-1 (Feb 2014)版本驱动:https://github.com/pocopico/rp-ext/tree/main/mlx4_core/releases
战斗机玩法
编译准备
从https://network.nvidia.com/products/ethernet-drivers/linux/mlnx_en/ 下载驱动,注意Nvida对于ConnectX-3 系列只提供4.9 LTS驱动

同时需要注意你的群晖内核版本,由于提供的源码是基于Debain操作系统,需要从https://docs.nvidia.com/networking/display/MLNXENv496060LTS/General+Support+in+MLNX_OFED 中确认你的内核和Debain同平台的在同一个大版本且小于等于Deabin的内核版本(可小不可大)因为内核一般向后兼容,但是跨大版本不保证,而且中版本不一致,也有小概率不兼容的。

DS918+在DSM7.0 的内核版本是4.4.180+ 小于4.9.0 且属于一个大版本,不属于同一个小版本。
如图下载驱动,忽略为啥Ubuntu 的驱动里出现一个Debain源码的驱动,他所有版本的源码都是Debain的

编译过程
驱动放在编译目录(/volume1/Build/),并使用下列命令解压驱动
tar -xvf MLNX_EN_SRC-debian-4.7-3.2.9.0.tgz
解压完成后进入SOURCRE目录解压mlnx-en_4.9.orig.tar.gz
tar -xvf mlnx-en_4.9.orig.tar.gz
然后你这里没法make,提示错误(官方没有文档指引):
makefile:10: config.mk: No such file or directory
make: *** No rule to make target 'config.mk'. Stop.

然后我强行找了个configure 但是一直卡这个错误,这里是个超级大坑,因为他有makefile 和Makefile 缺configure让我以为补齐configure就行了,实际不行。折腾了一天。

最后发现了Github项目:https://github.com/a-will/mlnx-ofa-kernel,原来makefile和Makefile 都需要一起替换。

这位老哥给了详细的编译步骤和指令,下面我们按照老哥的步骤来
当前目录如下:
/volume1/Build/MLNX_EN_SRC-4.9-6.0.6.0/SOURCES/mlnx-en-4.9
在这里目录执行下列命令,如果路径不对的看看自己是否解压了两次
ln -s ofed_scripts/configure
rm -rf makefile
ln -s ofed_scripts/makefile
rm -rf Makefile
ln -s ofed_scripts/Makefile
下面我们确认下:
ls -al

下面我们使用Chroot命令切换根目录环境,确保全套环境都在群晖的编译工具链下:
chroot /volume1/Build/
rm -rf /dev/null
由于Chroot的特性,设备描述符在nodev硬盘下是无法读取,这里我们先删除了吗,这里算是个小坑。
执行下列命令,修复编译环境。因为群晖的源码在Build目录,但是驱动读取的是source目录,我们建立软连接即可。
ln -s /usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/modules/DSM-7.0/build /usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/modules/DSM-7.0/source
不然会报asm/types.h 错误
同时我们添加环境变量,免得后续每次都要加参数,这里和你的CPU架构相关,黑群晖基本都是x86_64
export ARCH=x86_64
下面执行下面命令编译ETH版本的驱动,如需要IB和RDMA驱动,需要自己修改参数,通过./configure -h参数查看帮助信息
./configure --with-mlx4-mod --with-mlx4_en-mod --kernel-sources=/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/modules/DSM-7.0/build

上述命令不加kernel-sources会报错,因为程序识别的内核文件路径有点偏差
我们这里只要第一个箭头没有报错就没有问题了,第二和第三个箭头能看到内核版本,这个要和你群晖一致。

如果如下图表示没有错误的成功配置成功,就可以进入编译环节

执行下列命令进行编译
make ARCH=x86_64 CROSS_COMPILE=/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu-
然后你应该和我一样不出意外的出错了

这个错误是因为驱动代码和群晖内核代码冲突了,我们需要修改驱动的源代码
将/MLNX_EN_SRC-4.9-6.0.6.0/SOURCES/mlnx-en-4.9/include/linux/uuid.h中的关于guid_t的定义删掉,也就是下面这一段:
Vi用法就不科普了,自己搜索吧,我理解你要是vi都不会也别想编译驱动了。

PS:vi编辑器下双击D键是删除整行,实际上删除整个文件也行,但是为了保证最小改动,我们只删除冲突的部分
重新执行编译命令:
make ARCH=x86_64 CROSS_COMPILE=/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu-
出现下面的图就编译成功了

这个需要看第一个框框,看一共编译出多少个驱动,我这里是三个驱动。驱动是有加载先后顺序的,不按顺序驱动是加载不上的。
可以将ko文件传输到常规Linux机器用modinfo查看依赖关系,我这里加载先后顺序是:mlx_compat.ko>mlx4_core.ko>mlx4_en.ko
加载顺序错了就会提示:
insmod: ERROR: could not insert module mlx4_en.ko: Unknown symbol in module
至此驱动就编译好了
驱动加载
将编译好的驱动传到NAS上,然后加载驱动。我一般都是SMB传,然后用mv命令挪,驱动最好在/lib/modules下,当然不在也能用insmod加载
insmod /lib/modules/mlx_compat.ko
insmod /lib/modules/mlx4_core.ko
insmod /lib/modules/mlx4_en.ko
ifconfig eth1 up
ifconfig eth2 up
命令里网卡端口号从0开始,群晖WEB界面里是从1开始,记住这个对应关系来启动网口。
40G的模块因为商家不发货的原因,还没到,目前没有办法测网速了

结束语
说实话这个卡驱动编译卡点主要实在makefile和Makefile,谁能想到驱动知道的有问题,需要替换。在这里我卡了最少有12个小时。
同时说一下40G和100G 其实都是4*10G 4*25G ,所以千兆升级直接到40G/100G,搞2.5G 10G后期升级成本高。
附上我编译的驱动:
DSMDriver/DS918+/ConnectX-3/build at main · adnin10086/DSMDriver (github.com)