历尽磨难,群晖Dsm7.0编译E10M20-t1(aqc107)网卡驱动,终获成功!
节前给群晖Ds1821+和威联通1635AX组建10G网络时,在京东选购了E10M20-T1组合适配卡踩雷,上机无法识别,连指示灯都不亮,平台入驻商家以拆包影响二次销售为由,拒绝退货,交涉多天无果,不得已只能自己研究驱动。对于NAS和Linux小白的我来说,有幸找到了gebi论坛大家庭,开始如饥似渴地查看大佬们的教程,学到了非常宝贵的经验,通过近1个月的摸索,完成了下面多个环节的实践:
[*] Nas SSH开启及Root权限登录、Putty、Winscp工具软件使用
[*] Ubuntu虚拟机安装、开发环境搭建make、gcc、Linux-headers、build-essential等
[*] 群晖Dsm下IPKG、make工具、交叉编译工具包toolchain部署;
[*] Linux 4.4.180内核编译、群晖内核源码编译;
[*] 群晖linux headers头文件提取、Linux内核编译、网卡驱动编译;
通过多次实验,已成功在Ubuntu 16.04.01、群晖Dsm 7.0下使用群晖linux 4.4.x内核源码及toolchain编译工具,顺利完成了aqc107官方驱动MarvellLinux Driver 2.4.15.0的编译。
现整理一下摸索和折腾的过程,发贴分享,希望能帮到同样困扰的朋友,
其中还有好多不明白的地方,望得到有经验的大佬指点!
感谢以下贴子分享经验的大佬!
http://www.gebi1.com/forum.php?mod=viewthread&tid=284575
http://www.gebi1.com/forum.php?mod=viewthread&tid=264555
http://www.gebi1.com/forum.php?mod=viewthread&tid=84086
http://www.gebi1.com/thread-300273-1-1.html
http://www.gebi1.com/thread-63718-1-1.html
http://www.gebi1.com/thread-264733-1-1.html
(以下内容以记录自己的折腾经历为主,过程曲折并且冗长,编译方法请直接跳转Part 8,
有耐心的朋友且听我辗转道来)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
想要编译后驱动的直接戳这里:
**** Hidden Message *****
Part 1: 购卡踩雷
在采购E10M20-T1适配卡时,对群晖限制第三方网卡使用已有所耳闻,因此还特意去官网看了DS1821兼容列表,原打算是买E10G18-T2的,在京东搜索群晖万兆网卡时,1800元的价格真心觉得不便宜,正在犹豫不决时,看到了E10M20-T1的推荐,相同的价格可以同时获得10G网卡和M.2 SSD缓存,是不是觉得群晖产品还蛮良心了{:7_193:},网上搜了搜评测文章,看到E10M20-T1跟E10G18-T2采用了相同的Aquantia AQtion 107芯片,感觉问题不大就下了单,没想到历经30来天的恶梦就此展开了....
板卡送到时,第一时间就拆包上机,原想着很快就能体验到10G高速网络啦,然而进到DSM控制面板网络界面,局域网5并没有出现,再查看NAS才发现网卡指示灯都不亮,重新拔插一次通电,故障依旧,此时才意识到麻烦来了。
赶紧联系客服,说板卡不能使用该怎么办,能不能找技术人员给发个驱动呀。客服没说别的,问了Nas型号后就要求拍摄网卡照片,看到已拆包装就一再说不能退货。在群晖官网发了一份技术支持工单,第2天工程师回复了,说E10M20-T1不在DS1821+兼容列表中,无法识别,也不能提供驱动,建议我跟商家协商换货。
这下我就彻底懵了,生怕买了第三方(便宜)网卡群晖不兼容,花高价买你群晖原厂产品,用在群晖NAS上反倒不行,商家不退货,技术不支持,把咱消费者的利益放在那里了?这事儿不能就这么算,必须讨个说法。先是在京东投诉,商家一直推责,京东客服说商家在产品页面上提示了开封不能退,从普通客服到交易纠纷专员,说来说去也没解决问题。拖了2周以后,到12315网站以产品厂家不提供驱动技术支持,商家不履行三包义务为由发起了维权投诉,目前相关单位正在受理中...
在漫长的维权过程中,正值疫情蔓延,快递停运,板卡想出闲鱼也都发不了货,反正也有时间,就来折腾一下吧。
Part 2: 认知板卡
将板卡取下来插台式机上,Windows 10到是直接识别到新网卡了,不过仔细一看,型号识别为E10G18-T1了?
硬件ID 07B1 10017053
想起DS1821+的兼容列表中是有E10G18-T1的,既然芯片相同却不能识别,应该就是硬件ID 被限制了。根据多年折腾Windows系统的经验,感觉原厂aqc107网卡可以使用,只要找到适合E10M20的驱动,问题应该就能解决。于是乎,开启了四处搜索E10M20-T1资料的漫漫长路。
先在这里看到板卡的拆机图,确定网卡芯片是Aquantia AQtion 107 B1
然后看到有网友成功编译E10M20-T1驱动的贴子,就厚起脸皮去取经,他转发了一个英文论坛的贴子,
看起来好像并不复杂,确实是群晖通过PID VID限制了atlantic驱动程序的兼容性。
这位大佬在原贴里分享了自己编译好的驱动,看介绍,驱动里面包含了非常多的硬件ID,我的板卡应该也能驱动!
将下载的atlantic.ko传到Nas /lib/modules,使用insmod命令加载,始终报Invaild module format,再搜了几位大佬编译好的aqc107驱动,也是同样的报错,拣现成驱动的想法搁浅~
虽然暂时没有成功,但有大佬成功案例指引,让我觉得还是蛮有希望的。
Part 3: Dsm编译环境搭建困难重重
既然拣现成的不行,那就得自己动手啦~
在Marvell网站找来aqc107的Linux驱动源码,在DSM界面开启SSH,Putty连接Nas,再用Winscp把驱动上传到Nas里,在Dsm下自行编译,感觉驱动很快就能成功啦!
然而理想是美好的,现实却总是残酷,好不容易通过SSH进入到DSM后台界面,第一条命令就碰壁了!
make :command not found
找熟悉Linux的朋友远程协助,不仅make命令无法执行,安装工具apt也没有,应该是群晖Dsm里作了限制,删除了一些基本命令,他说搭建编译环境蛮复杂的,建议我别再折腾啦!
不死心网上到处搜索资料,找到通过添加IPKG安装工具,为DSM安装软件;
详细步骤参考这里:https://blog.csdn.net/qq_37946291/article/details/108421382
安装好IPKG工具后,给DSM装上了make automake等组件
make驱动可以执行了,然而执行过程总是报错
No rule to make target 'modules' stop
我这个Linux小白想不明白问题在那,找朋友询问,还是说编译环境有问题, 到了这一步就困住了{:7_211:}
网上搜索No rule to make target 'modules'的资料,也大多说是编译环境的问题
查看Marvell驱动里的readme说明,放在第一条的也是说要确保具备Linux头文件和编译工具
然而看似简单的一条命令,在群晖DSM里却走成死胡同
由于apt命令被删除,通过IPKG安装make gcc都顺利,却无法安装linux-headers build-essential
接下来的好几天里,都在网上搜索linux-headers和build-essential相关资料,添加源、离线包都尝试个遍,始终无法突破。
这个时候,想起朋友说的话,NAS里搭建编译开发环境真的不容易!
或许真的应该放弃?
Part 4: Ubuntu交叉编译格式不匹配
在DSM里直接编译不成,归结为环境受限,因此对于具备折腾精神的我来说还不死心 。
在这几天里,也看了不少关于编译相关的资料,DSM里不行,就搭个虚拟机试试吧。
为了尽量接近群晖Dsm的内核版本,我还把ubuntu虚拟机重新安装了好几版,
unbuntu 16.04在Win10 Hyper-v下安装过程中重启时会卡住,强制关机都不行,放弃;
unbuntu 16.04.01内核版本4.4.0-31-generic安装到是顺利,但编译网卡驱动时会有好多waring警告;
unbuntu 16.04.02安装完内核版本4.8.0-52-generic,编译网卡驱动时也有waring警告;
unbuntu 16.04.03安装完内核版本4.13.26-generic,编译网卡驱动时没有waring警告,但又有其它报错;
unbuntu 18.04 lts内核版本5.4.0-97-generic,版本在编译过程一切顺利,以为胜券在握。
但编好的驱动,传到Nas里insmod加载报错invalid module format,
这个环节卡住了很长时间,后面查看这个贴子时得到启发,
http://www.gebi1.com/thread-264733-1-1.htmlhttps://blog.csdn.net/ymangu666/article/details/22872439
通过下面的方法得到解决
**** Hidden Message *****
比较了群晖官方自带的驱动,编译后的atlantic.ko内核版本一致
到了这一步,虽然编译得到的atlantic.ko insmod加载时不再报Invalid module format,
但又出来新的报错unknown symbol in module{:7_185:}
在这里卡了好多天,搜索资料应该是依赖的驱动未加载
从modinfo atlantic.ko驱动里的depends看到,依赖crc-itu-t,ptp
在Ubuntu虚拟机里测试
先执行modprobe crc-itu-t
再modprobe ptp
insmod atlantic.ko成功,
然而相同的方法在群晖Nas里却不行,因为找不到ptp驱动
又费了好多时间,在Nas下使用源码单独编译ptp驱动,编译虽然成功,却又开始报invalid format了....
心中一万个~~~飘过,该死的群晖,你到底作了什么手脚,想编译个驱动咋就这么难呀{:7_211:}
Part 5: Linux 4.4.180内核编译
随着查阅资料的增多,开始仔细审视每一步的细节,Marvell网卡驱动的源码里,include引用了不少linux源文件,编译成功的大佬们都在说一件事,linux下编译驱动,内核版本、config配置尽量相同才能成功。看到好几个贴子都有采用群晖源码编译linux内核的步骤,虽然不大明白为啥要连同linux内核一起编译,前面编译环境是在ubuntu 16.04和18.04下,内核版本跟4.4.180+均不相同,在没找到问题所在之前,不如也来一次尝试。
费不少时间找到了Linux 4.4.180的源码,
http://ftp.sjtu.edu.cn/sites/ftp ... inux-4.4.180.tar.gz
又开始四处找linux内核编译资料、B站看视频,一步一步照着教程
将下载的源码包传到/opt目录,然后运行tar zxvf linux-4.4.180.tar.gz解压缩,得到linux-4.4.180目录
make x86_64_defconfig
make menuconfig
make -j4
make modules_install
make install
好不容易完成了,unbuntu重启系统,
uname -a 显示内核版本自动升级为4.4.180,满怀希望地编译驱动,过程一切顺利
然而放到Nas里面insmod加载,仍然报unkown symbol in module错误{:7_209:}
Part 6:走捷径偏方
在论坛苦苦搜索资料的期间,看到这位大佬分享的经验,
http://www.gebi1.com/thread-300727-1-1.html
依葫芦画瓢,尝试一下居然成功!
**** Hidden Message *****
Winscp传入魔改后的KO文件,激动人心的时刻到了
SSH命令行insmod atlantic.ko,修改后的驱动居然加载成功!
再ifconfig eth4 up,控制面板网络界面,也出现了局域网5的网卡,
手动设置IP后,Web页面访问、ssh连接一切正常,再SMB共享文件拷贝一部79G的4K电影,一切正常。
至此,E10M20-T1这片板砖,终于不用砸自己手里啦~~~
Part7:DSM手动添加headers顺利编译看到希望
在虚拟机里折腾好多天以后,虽然使用 5.4.0-97-generic的头文件能顺利编译,但得到的atlantic.ko报unkown symbol in module的错误始终无法解决。
感觉在Nas原始环境下编译成功的几率会高一些,所以再次进行了尝试。
由于群晖Dsm里删除了很多linux命令,没有apt安装工具, 添加IPKG后,也始终无法添加linux-headers及build-essential,
尝试手动下载apt的离线安装包,在dpkg -i时始终报签名错误,没有进展...
后来在某篇贴子里提及把Linux源文件直接拷贝到相应目录的方法得到启示,
尝试把5.4.0-97-generic里面的所有文件通过winscp工具,拷贝到/lib/modules/4.4.180+/build目录里(Marvell驱动的Makefile里引用到这个位置),make 编译时不再报错,成功得到atlantic.ko。
不过跟在Ubuntu下一样,使用insmod atlantic.ko时仍然报错unkown symbol in module,
http://www.gebi1.com/forum.php?mod=image&aid=118256&size=300x300&key=1659d46d7bf6ee2f&nocache=yes&type=fixnone&ramdom=aRZIr
真是个磨人的小妖精....搞得我人都快崩溃了{:7_184:}
Part 8: 群晖linux内核编译失败但意外得到可用的Linux headers头文件
春节期间休息了几天...
有空的时候还在继续查看linux驱动编译相关的贴子,其中有一篇提到,驱动编译最好要保障linux内核版本、Linux 头文件、.config配置文件都要完全相同...
梳理一下前面所有的动作,在ubuntu不同版本下,编译时表现均不相同,只有5.4.0-97-generic编译顺利,但最终仍然不能使用,看来想要在群晖DSM下使用,还得找到官方源代码;
其实前期也找过群晖源代码,不过由于群晖官网改版,GPL Source目录非常多,一开始没看到找到Linux-4.4.x的源文件下载,后来仔细查看,终于在官网GPL Source里找到了Linux-4.4.x的源码。https://global.download.synology ... 000/linux-4.4.x.txz小小激动了一下http://www.gebi1.com/static/image/smiley/comcom/27.gif
虚拟机还原到刚安装的状态,把下载的linux-4.4.x.tar使用Winscp传到/lib/modules/4.4.180+/里,解压缩后再把linux-4.4.x目录修改为build
进入aqc107源码目录开始编译...这次又报错了
在Winscp里反复查看linux源码,再跟ubuntu虚拟机进行比对,发现include目录下少了generated目录,把ubuntu里的generated目录拷过来,安装会报其它错,看来还是不行;
思来想去,只能在ubuntu下编译群晖内核这条路了;
根据这篇贴子的指引:http://www.gebi1.com/forum.php?mod=viewthread&tid=84086
群晖的内核编译跟linux 4.4.180稍有不同,群晖源码里多了一个synoconfigs的目录,里面有很多架构的配置文件
在make menuconfig之前,先拷贝Ds1821对应的v1000作为配置文件
cp synoconfigs/v1000 .config
再make menuconfig,按默认设置保存
make -j4 CROSS_COMPILE=x86_64-pc-linux-gnu-
内核编译开始了...不过很快就开始报错了,
网上查找hydrogen.h无果,有贴子说是内核源码需要签名,看来群晖公布的源码并不完整
下一步make modules_install
根据前面linux 4.4.180内核编译的经验,到这里应该又进行不下去了...
柳暗花明
在查阅资料的间隙,Winscp查看源代码目录,无意间发现前面缺失的generated目录出现了
那再来试试网卡驱动编译呢?
修改utsrealse.h里的版本号为4.4.180+后,将linux-4.4.x整个目录拷贝到/usr/src,然后修改为Ubuntu现有内核对应的头文件目录(linux-headers-4.4.0.31-generic)
再一次进到网卡驱动目录/opt/Marvell_Linux_2.4.15/Linux
make CROSS_COMPILE=x86_64-pc-linux-gnu-
编译过程顺利
把编译后的ko驱动传到Nas里,
insmod atlantic.ko居然没有报错,卡壳这么多天的问题,居然我误打误撞的搞成功啦!
看来相同的linux-headers头文件和.config配置才是关键中的关键!!!
折腾过程总结
(等我研究明白了,再慢慢完善)
1、在虚拟机里安装Ubuntu 16.04.01,设置ssh访问并开通root用户登录
2、在官网查看,Ds1821+对应V1000 x86_64架构
下载对应版本的群晖Toolchain开发工具包,解压缩到一个目录
添加开发包路径
查验gcc版本,如下提示代表成功
3、修改群晖源码Makefile版本号
如编译后报invaild module format,就再修改Vermagic.h
4、群晖内核编译,得到可用的linux-headers头文件
进入linux-4.4.x源码目录
make -j4CROSS_COMPILE=x86_64-pc-linux-gnu-
中途会报错,但不影响linux-headers头文件的生成,执行完毕可以将整个linux-4.4x目录拷贝到linux-headers对应的的目录;
ubuntu下是/usr/src/
群晖Dsm下对应/lib/modules
在/lib/modules下新建4.4.180+,再新建子目录build,将提取好的linux-headers文件解出来,
文件拷贝到/lib/modules/4.4.180+/build
(提取好的Linux-headers文件已发网盘)
5、下载、编译网卡源代码
将网卡源代码传到/opt/aqc107
makeCROSS_COMPILE=x86_64-pc-linux-gnu-
编译得到驱动文件atlantic.ko
6、网卡驱动加载及自启动脚本
备份官方原始驱动/lib/modules/atlantic.ko,然后删除
将编译好的atlantic.ko拷贝到/lib/modules,
(对于winhex修改官方atlantic.ko,需要先卸载已加载的驱动rmmod atlantic,自行编译的不需要)
insmod atlantic.ko
执行后无报错,即为加载成功
加载驱动后,控制面板还不会出现局域网5
需要再执行ifconfig eth4 up ,控制面板才会识别到第5块网卡;
(其中eth4的4,是由网卡数量-1排序得到,比如我的Ds1821+原本就有4个1000M,排序分别是eth0..eth1...eth3,新加的10G网卡是第5块,所以是eth4)
上面的命令可以通过在控制面板新建一个脚本,加NAS重新启动时自动运行。
强大,感谢分享 因为是白裙,只能编译
不是白裙可以考虑
其他虚拟系统平台上使用,再安装黑群晖
-------
还有另外一种思路:ubuntu 编译 entware-,编译你要的驱动
群晖安装 entware,通过安装opkg install 网卡驱动.ipk 支持楼主 好东西,谢谢分享!!! 感谢分享 谢谢楼主分享 不知道 黑群可不可以用 感谢分享! 谢谢楼主分享 不知道 黑群可不可以用 好东西6666666 谢谢楼主分享 你好,请问有1821可以编译好的驱动吗? 强大,感谢分享 看下。折腾精神可嘉
生命在于折腾 sungo1000 发表于 2022-2-8 17:13
你好,请问有1821可以编译好的驱动吗?
等我把贴子整理完,可以把编译好的aqc107驱动发上来 非常感谢你提供这个啊 学习一下,这个很好 感谢楼主的分享! 学习学习,真是技术贴