项目场景:

Ubuntu20.04 TL-WDN5200免驱版 芯片应该是RTL8811CU

驱动地址:Linux Driver for USB WiFi Adapters that are based on the RTL8811CU, RTL8821CU and RTL8731AU Chipsets - v5.12.0 Github

该驱动支持的Linux核心号:
Kernels: 4.14 - 5.11 (Realtek)
Kernels: 5.12 - 5.17 (community support)
我的核心号为:5.13.0-39-generic

参考安装步骤:ubuntu 安装usb免驱无线网卡TP-LINK WN726N


问题描述

在第二步执行

sudo modprobe 8821cu

后报错:
modprobe: ERROR: could not insert ‘8821cu’: Exec format error
而且右上角没有WiFi标志,说明安装失败。

而且输入lsusb -tv查看USB无线网卡项,它的Driver=,即无驱动。


原因分析:

采用Ubuntu16.04 modprobe: ERROR: could not insert ‘8821ce’: Exec format error所示方法重新编译安装后仍然不成功,报一样的错误。

查CSDN后发现此种报错很可能是由于版本号对不上,执行

modinfo 8821cu.ko

输出的vermagic行显示有mod_unload字样,应该意思是模块未加载
但以下两个命令均不能加载模块

sudo insmod 8821cu
sudo modprobe 8821cu

解决方案:

参考Ubuntu 台式机 usb WiFi 接收器设置方法第三步
主要是以下命令

sudo apt-get install --reinstall linux-headers-generic
sudo apt-get install --reinstall linux-headers-$(uname -r)
sudo apt-get install --reinstall build-essential

然后make clean再重新执行:

make
sudo make install
sudo modprobe 8821cu

最终modprobe成功执行,重启后右上角显示出WiFi,输入lsusb -tv后显示无线网卡对应的Driver=rtl8821cu。
(提一句:Ubuntu20.04可以在图形化界面配置WiFi,在终端输nm-connection-editor打开网络配置,第一次使用手动新增一个WiFi的SSID和密码)

起作用的应该是中间指定了版本号的命令sudo apt-get install --reinstall linux-headers-$(uname -r)$,有关指定版本号与否的区别参考Linux如何查看内核版本并安装内核头文件linux-headers-generic
其中指出二者会安装不同内核版本的头文件,我驱动一直安不上的原因很可能是sudo apt-get install --reinstall linux-headers-generic装的是5.4一个核心版本的Header,而我需要的是5.13.0-39-generic版本的,即本机最新Linux Core的Header。


后记

免驱USB网卡识别成存储型U盘的问题

重启后,又出现了WiFi不显示的问题,原因是Ubuntu系统把无线网卡识别成了存储设备。
进入/lib/udev/rules.d/文件夹,打开终端输入:

sudo vi ./40-usb_modeswitch.rules

按下I键进入插入模式,在文件末尾 LABEL=“modeswitch_rules_end” 前插入以下内容:

ATTR{idVendor}=="0bda", ATTR{idProduct}=="1a2b", RUN+="/usr/sbin/usb_modeswitch -K -v 0bda -p 1a2b"

输入:x保存并推出,然后重启即可。

升级核心了怎么办

上文我采用的是传统的编译安装驱动到内核的方式,所以该网卡驱动跟内核走;Linux内核一换,驱动不会自动再安装到新的内核中。
实际上,该驱动仓库的作者推荐使用自动方式,安装了DKMS后,执行:

sudo ./install-driver.sh

这样就不用手动在每次更新核心后重新安装驱动了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐