DSM 7 内核模块编译环境部署 & 驱动编译实例
更新时间:2025.4.19
本文章使用本机docker部署debian来构建内核模块,在黑裙SA6400/923+/918+/上测试成功,理论上也适用白裙各种x86型号 参考资料:Installing the Coral dual edge TPU drivers on synology 编辑&整理&测试:隔壁网gebi1.com/gasment
部署前需要确认一些信息: 1.你的群晖DSM版本,可以在控制面板中查得,如7.2-72806 2.你的群晖linux内核版本,在ssh中使用uname -r查得,当前常见版本有5.10.55+和4.4.302+ 3.你的群晖平台代号,可以在官方系统包🔗下载页查得,按ctrl+f搜索型号,如918,得synology_apollolake_918+.pat,那么平台代号为apollolake,923+为synology_r1000_923+.pat,则平台为r1000,如此类推
编译过程分为工具链toolchain的编译,和具体的驱动编译
一、编译工具链toolchain
1.
部署docker容器,新增一个项目,使用compose配置,选一个目录作为数据目录,我这里为/volume1/docker/debian11-builder/data,映射为容器内/mnt/dsm_share,往下命令都以此路径为例,建议照抄
yaml
version: '3.8' services: debian11-builder: image: debian:11 container_name: debian11-builder stdin_open: true tty: true command: /bin/bash volumes: - /volume1/docker/debian11-builder/data:/mnt/dsm_share
2.
启动容器,进入容器(往下ssh命令如无声明,则全部为root用户):docker exec -it debian11-builder /bin/bash
3.
安装一些基础工具:apt update && apt install nano curl xz-utils -y
4.
进入挂载的数据目录:cd /mnt/dsm_share/
5.
下载对应版本、内核、平台的toolchain源码:
2.
根据DSM版本进入对应目录,按ctrl+f搜索linux-​,根据平台代号选择对应内核版本的linux-x.x.x.txz
比如SA6400为:linux-5.10.x.txz , 918+为linux-4.4.x.txz
3.
复制下载链接,执行curl -O 下载地址 ​进行下载,如:curl -O https://global.synologydownload.com/download/ToolChain/Synology%20NAS%20GPL%20Source/7.2-72806/r1000/linux-4.4.x.txz
6.
解压并重命名toolchain文件夹(这里的x.x.x版本号和<platform>换成自己的):
bash
tar -xvf linux-x.x.x.txz mv linux-x.x.x linux-x.x.x-syno-<platform> #<platform>换成自己的平台代号,如linux-4.4.x-syno-apollolake
7.
编辑编译选项(注意修改版本号和<platform>)
1.
拷贝配置文件:
1.
4.4.x版本为:cp linux-4.4.x-syno-<platform>/synoconfigs/<platform> linux-4.4.x-syno-<platform>/.config
2.
5.10.x版本为:cp linux-5.10.x-syno-<platform>/synology/synoconfigs/<platform> linux-5.10.x-syno-<platform>/.config
2.
修改makefile:nano linux-x.x.x-syno-<platform>/Makefile​,将第4行的EXTRAVERSION =​修改为EXTRAVERSION = +(nano保存方法为ctrl+x后按y,然后回车)
3.
安装一些依赖工具:apt update && apt install make bc libncurses-dev flex bison libelf-dev python3 gcc -y
8.
开始编译toolchain
1.
bash
cd linux-x.x.x-syno-<platform>/ make menuconfig
2.
会出现灰蓝色界面,按tab切换到下方的save后按回车保存,然后exit
3.
编译:make modules​,编译过程会持续数十分钟,结束后看到输出很多ko文件代表成功了
9.
将编译好的toolchain连接到系统内核源码目录
bash
mkdir -p /lib/modules/$(uname -r) ln -s /mnt/dsm_share/linux-x.x.x-syno-<platform>/ /lib/modules/$(uname -r)/build ls -l /lib/modules/$(uname -r)/build/ ##输出内容包含synology字眼文件代表连接成功
10.
将配置好的debian11容器导出为新镜像,方便以后使用
1.
bash
exit #退出容器 docker commit debian11-builder debian11-builder-923:20250418 #冒号前为新镜像名称,不要带大写和特殊符号,冒号后为版本,可以用日期表示
2.
停止debian11-builder项目,删掉debian11-builder的容器,编辑debian11-builder项目的yaml,将image改为刚才commit的新镜像名称如debian11-builder-923:20250418​,重新构建容器
3.
启动容器,检查之前的配置是否存在:
bash
docker exec -it debian11-builder /bin/bash ls -l /lib/modules/$(uname -r)/build/
✅现在已完成带工具链系统的构建,如果以后有需要编译的模块驱动,直接使用这个容器编译即可
二、尝试编译一些驱动
需要说明,相比编译驱动,编译toolchain反而是相较简单的那一部分,有些驱动源码并不合适群晖这个魔改内核,需要进行修改适配,这是个头疼的事,好在现在有AI帮助,遇到报错,扔给AI慢慢磨,编译的成功率还算是可以的
不同内核版本的编译情况不一,同一个驱动,可能在4.4.x上一次过,也能在5.10.x上非常折腾
下面是我本人的一些实战案例,驱动只是编译出来并成功加载了,由于没有对应设备,无法判断驱动是否能使硬件正常工作,不过能加载驱动,已是成功的一大步
编译螃蟹2.5G PCIE网卡 8125B/BG:
4.4.x/5.10.x内核
2.
解包源码:
bash
mkdir -p /mnt/dsm_share/module_build ##把r8125-9.xxx.xx.tar.bz2上传到module_build内,对应DSM路径为 /volume1/docker/debian11-builder/data/module_build cd /mnt/dsm_share/module_build apt install bzip2 -y tar -xvf r8125-9.xxx.xx.tar.bz2 cd r8125-9.xxx.xx make 或 make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
3.
输出:/mnt/dsm_share/module_build/r8125-x.xxx.xx/src/r8125.ko​为成功
4.
尝试加载驱动
bash
exit #退出容器 insmod /volume1/docker/debian11-builder/data/module_build/r8125-x.xxx.xx/src/r8125.ko #目录以自己为准 #如无报错,检查加载状态和硬件状态 lsmod | grep r8125 r8125 253952 0 - Live 0xffffffffa136f000 (OE)
编译intel 2.5G PCIE网卡 i225/i226
4.4.x内核:
1.
bash
docker exec -it debian11-builder /bin/bash mkdir -p /mnt/dsm_share/module_build cd /mnt/dsm_share/module_build apt update && apt install git -y git clone https://github.com/jim3ma/synology-igc.git ####使用jim的修改源码,适配低版本内核 cd synology-igc/ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
2.
输出:/mnt/dsm_share/module_build/synology-igc/igc.ko 成功
3.
尝试加载:
bash
exit #退出容器 insmod /volume1/docker/debian11-builder/data/module_build/synology-igc/igc.ko #目录以自己为准 #如无报错,检查加载状态和硬件状态 lsmod | grep igc igc 78592 0
5.10.x内核
1.
5.10.x内核自带了igc源码,只需要在toolchain目录编译即可
2.
bash
docker exec -it debian11-builder /bin/bash cd /mnt/dsm_share/linux-x.x.x-syno-<platform> make menuconfig ##按此菜单路径选择驱动:【Device Drivers】->【Network device support】->【Ethernet driver support】->【Intel devices】->【按空格选中I225LM/I225-V】 ##tab到save后回车保存,然后一路exit make modules_prepare make modules
3.
输出:/mnt/dsm_share/linux-x.x.x-syno-<platform>/drivers/net/ethernet/intel/igc/igc.ko
4.
尝试加载
bash
exit #退出容器 insmod "/volume1/docker/debian11-builder/data/linux-x.x.x-syno-<platform>/drivers/net/ethernet/intel/igc/igc.ko" #目录以自己为准 #如无报错,检查加载状态和硬件状态 lsmod | grep igc igc 106496 0 - Live 0xffffffffa136f000 (E)
编译AQC107 10G PCIE网卡
4.4.x/5.10.x内核
1.
bash
按以下选项搜索 CATEGORY:Marvell Public Drivers PLATFORM/OS:Linux PART NUMBER:AQC107
2.
打开压缩包,将atlantic.tar.gz导出。
3.
bash
docker exec -it debian11-builder /bin/bash mkdir -p /mnt/dsm_share/module_build cd /mnt/dsm_share/module_build ##将atlantic.tar.gz上传到此,对应DSM路径为 /volume1/docker/debian11-builder/data/module_build tar -xpzf atlantic.tar.gz mv Linux atlantic cd atlantic
4.
5.10.x内核直接执行make​编译,4.4.x内核需要做修改:
bash
nano aq_compat.h ###按ctrl+w搜索:page_ref_count,修改如下4行(前置//注释) //static inline int page_ref_count(struct page *page) //{ // return atomic_read(&page->_count); //} 保存后执行 make 编译
5.
输出:/mnt/dsm_share/module_build/atlantic/atlantic.ko
6.
尝试加载
bash
exit #退出容器 insmod "/volume1/docker/debian11-builder/data/module_build/atlantic/atlantic.ko" #目录以自己为准 #如无报错,检查加载状态和硬件状态 lsmod | grep atlantic atlantic 210612 0 crc_itu_t 1595 2 udf,atlanti
编译Coral Edge TPU AI加速模块(PCIE版)
4.4.x内核:
1.
bash
docker exec -it debian11-builder /bin/bash mkdir -p /mnt/dsm_share/module_build cd /mnt/dsm_share/module_build apt update && apt install git -y git clone https://github.com/google/gasket-driver.git cd gasket-driver/src/ ###不能直接编译,需要修改 nano gasket_page_table.c 在顶部一堆#include附近查找MODULE_IMPORT_NS(DMA_BUF);,修改为//MODULE_IMPORT_NS(DMA_BUF); 保存后执行 make
5.10.x内核:
1.
内核附带的gasket源码编译出来无法加载,需要修改,修改好的源码:📦gasket-driver-mod.tar.gz
2.
bash
docker exec -it debian11-builder /bin/bash cd /mnt/dsm_share/module_build ##将gasket-driver-mod.tar.gz上传到此,,对应DSM路径为 /volume1/docker/debian11-builder/data/module_build tar -xpzf gasket-driver-mod.tar.gz cd gasket-driver-mod/src/ make
3.
输出:/mnt/dsm_share/module_build/gasket-driver/src/apex.ko 和 /mnt/dsm_share/module_build/gasket-driver/src/gasket.ko
4.
尝试加载:
bash
exit #退出容器 insmod /volume1/docker/debian11-builder/data/module_build/gasket-driver/src/gasket.ko #目录以自己为准 4.4.x insmod /volume1/docker/debian11-builder/data/module_build/gasket-driver-mod/src/gasket.ko #目录以自己为准 5.10.x insmod /volume1/docker/debian11-builder/data/module_build/gasket-driver/src/apex.ko #目录以自己为准 4.4.x insmod /volume1/docker/debian11-builder/data/module_build/gasket-driver-mod/src/apex.ko #目录以自己为准 5.10.x #如无报错,检查加载状态和硬件状态 lsmod | grep gasket gasket 79026 1 apex lsmod | grep apex apex 10195 0 gasket 79026 1 apex
✅全篇完
测试条件有限,欢迎大家跟贴反馈,白裙用户多多尝试,祝大家实现驱动自由~