手上有个装黑苹果淘汰下来的USB无线网卡,型号是CF-811AC
,芯片是RTL8821CU
。想给群晖用上,官方是没有驱动的,因此需要自行编译。搜索Synology wireless RTL
找到了RTL8152的驱动包,很明显这个不适合 8821CU,不过可以用来参考编译过程。又找到一篇很不错的文章,编译RTL8192EU。本次就参考这个进行编译。
信息收集
- 登陆 DSM 控制台,
控制面板 → 信息中心 → DSM 版本
,找到你的设备的DSM版本,我的是DSM 6.2.3-25426 Update 3
。
- 打开 SSH:
控制面板 → 终端机和 SNMP → 启动 SSH 功能
,通过ssh登陆你的设备,输入uname -a
获得你的设备的 Linux 版本,我的是Linux DS418Play 4.4.59+ #25426 SMP PREEMPT Mon Dec 14 18:48:50 CST 2020 x86_64 GNU/Linux synology_apollolake_418play
。其中 Linux 内核版本是4.4.59+
,Package Arch 是 apollolake
。
环境搭建
首先需要下载以下文件:
- rtl8821CU 源码(编译时分支 Commit Id 为:
deff094
)
- 交叉编译工具链,根据我的 Linux 版本,下载
DSM 6.2.3 Tool Chains / Intel x86 Linux 4.4.59 (Apollolake) / apollolake-gcc493_glibc220_linaro_x86_64-GPL.txz
。
- Linux 内核代码,根据我的 Linux 版本,下载
Synology NAS GPL Source / 24922branch / apollolake-source / linux-4.4.x.txz
。
下载完成后解压,这里将 ~/build
设置为工作目录:
1
2
3
4
5
6
7
8
|
$ ll
total 144M
-rw-r--r-- 1 echowxsy echowxsy 49M 1月 6 16:30 apollolake-gcc493_glibc220_linaro_x86_64-GPL.txz
drwxr-xr-x 27 echowxsy echowxsy 4.0K 1月 6 22:02 linux-4.4.x
-rw-r--r-- 1 echowxsy echowxsy 92M 1月 6 16:45 linux-4.4.x.txz
-rw-rw-r-- 1 echowxsy echowxsy 3.9M 1月 6 21:26 master.zip
drwxrwxr-x 8 echowxsy echowxsy 4.0K 12月 24 18:55 rtl8821CU-master
dr-xr-xr-x 9 echowxsy echowxsy 4.0K 8月 28 2017 x86_64-pc-linux-gnu
|
然后设置环境变量:
1
2
3
4
5
6
7
8
9
|
export CFLAGS="-I/home/echowxsy/build/x86_64-pc-linux-gnu/include"
export LDFLAGS="-I/home/echowxsy/build/x86_64-pc-linux-gnu/lib"
export RANLIB=/home/echowxsy/build/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu-ranlib
export LD=/home/echowxsy/build/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu-ld
export CC=/home/echowxsy/build/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu-gcc
export LD_LIBRARY_PATH=/home/echowxsy/build/x86_64-pc-linux-gnu/lib
export CROSS_COMPILE=/home/echowxsy/build/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu-
export KSRC=/home/echowxsy/build/linux-4.4.x
export ARCH=x86_64
|
编译驱动
因为我的 Linux 版本是4.4.59+
,因此需要修改 linux-4.4.x/Makefile
:
1
2
3
4
|
4c4
< EXTRAVERSION =
---
> EXTRAVERSION = +
|
如果不进行此步骤,编译完成之后加载模块时,会遇到insmod: ERROR: could not insert module /lib/modules/8821cu.ko: Invalid module format
的问题。
然后编译内核依赖:
1
2
3
4
5
|
cd linux-4.4.x
cp synoconfigs/apollolake .config
make oldconfig
make dep
make modules
|
可能会遇到这个问题:
1
|
scripts/sign-file.c:23:10: fatal error: openssl/opensslv.h: No such file or directory
|
需要安装libssl-dev
:
1
|
sudo apt install libssl-dev
|
编译完内核后,编译rtl8821cu
驱动:
1
|
cd build/rtl8821CU-master
|
首先需要对Makefile
进行改动:
1
2
3
4
5
6
|
1219,1220c1219,1220
< KVER := $(shell uname -r)
< KSRC := /lib/modules/$(KVER)/build
---
> KVER := 4.4.59+
> KSRC := /home/echowxsy/build/linux-4.4.x
|
然后直接make
。
检查模块的vermagic
:
1
2
|
$ modinfo 8821cu.ko | grep vermagic
vermagic: 4.4.59+ SMP preempt mod_unload
|
安装驱动
通过scp
将文件上传到设备:
通过ssh
登陆设备并把驱动拷贝至系统目录,加载驱动:
1
2
3
4
5
6
7
8
9
|
ssh [email protected]
sudo cp 8821cu.ko /lib/modules/
sudo cp cfg80211.ko /lib/modules/
sudo insmod /lib/modules/cfg80211.ko
sudo insmod /lib/modules/8821cu.ko
lsmod | grep 8821
|
插入无线设备,通过lsusb
查看:
1
2
|
$ lsusb
* 0bda:c811:0200 00 2.00 480MBit/s 500mA 1IF (Realtek 802.11ac NIC 123456)
|
将设备ID写入系统设备表:
1
|
echo "(0x0bda:0xc811,rtl8821cu)" |sudo tee -a /lib/udev/devicetable/usb.wifi.table
|
启用无线设置界面sudo vim /lib/udev/script/usb-wifi-util.sh
:
1
2
3
4
5
6
|
19a20
> RTL8821CU_MODULES="${COMPAT_MODULES} 8821cu"
136a138,140
> ;;
> rtl8821cu)
> modules="${RTL8821CU_MODULES}"
|
重新拔插一次无线网卡,即可在控制面板中找到无线设置: