Lei_sjun 发表于 2022-2-6 22:30:42

历尽磨难,群晖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重新启动时自动运行。









简简单单 发表于 2022-2-7 14:10:09

强大,感谢分享

netusb 发表于 2022-2-7 14:46:37

因为是白裙,只能编译
不是白裙可以考虑
其他虚拟系统平台上使用,再安装黑群晖
-------
还有另外一种思路:ubuntu 编译 entware-,编译你要的驱动
群晖安装 entware,通过安装opkg install 网卡驱动.ipk

wu0lei 发表于 2022-2-7 16:49:44

支持楼主

金色之剑 发表于 2022-2-7 17:15:50

好东西,谢谢分享!!!

cheong0hk 发表于 2022-2-7 18:19:48

感谢分享

流云畅想的记忆 发表于 2022-2-8 00:05:07

谢谢楼主分享 不知道 黑群可不可以用

sddata 发表于 2022-2-8 08:38:09

感谢分享!

sanmylh 发表于 2022-2-8 16:22:13

谢谢楼主分享 不知道 黑群可不可以用

sungo1000 发表于 2022-2-8 16:38:40

好东西6666666

kv6u6p0m 发表于 2022-2-8 16:51:52

谢谢楼主分享

sungo1000 发表于 2022-2-8 17:13:23

你好,请问有1821可以编译好的驱动吗?

wuqiyu007 发表于 2022-2-8 17:13:30

强大,感谢分享

假大空 发表于 2022-2-8 19:51:15

看下。折腾精神可嘉

laddie 发表于 2022-2-8 20:00:50

生命在于折腾

Lei_sjun 发表于 2022-2-8 20:51:59

sungo1000 发表于 2022-2-8 17:13
你好,请问有1821可以编译好的驱动吗?

等我把贴子整理完,可以把编译好的aqc107驱动发上来

xcgf 发表于 2022-2-9 09:46:57

非常感谢你提供这个啊

觅凤的梧桐 发表于 2022-2-9 10:08:24

学习一下,这个很好

3008086 发表于 2022-2-9 11:54:58

感谢楼主的分享!

jinmaoluo 发表于 2022-2-10 14:52:23

学习学习,真是技术贴
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 历尽磨难,群晖Dsm7.0编译E10M20-t1(aqc107)网卡驱动,终获成功!