群晖驱动编译篇(三)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驱动

ConnectX-3 特别驱动版本要求

同时需要注意你的群晖内核版本,由于提供的源码是基于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.
make错误图

然后我强行找了个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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注