群晖编译 RTL8821CU 驱动

在DS918+ 上使用Wi-Fi USB适配器

手上有个装黑苹果淘汰下来的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将文件上传到设备:

1
2
scp ./rtl8821CU-master/8821cu.ko [email protected]:~/
scp ./linux-4.4.x/net/wireless/cfg80211.ko [email protected]:~/

通过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}"

重新拔插一次无线网卡,即可在控制面板中找到无线设置: 群晖控制面板截图

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy