Personal Blog

轶哥

轶哥的头像

妄图改变世界的全栈程序员。

Article

Linux安装无线网卡驱动通用方法

目录
  1. 分清网卡是什么接口
  2. 判断网卡是否在Linux下免驱
    1. ifconfig: command not found
    2. 其它判断方法
  3. 到网卡官网下载驱动
  4. 到对应Linux发行版Wiki中查找固件
    1. Debian
    2. Ubuntu
  5. 查看网卡芯片型号
    1. PCI无线网卡
    2. USB无线网卡
    3. BCM无线网卡
  6. 根据网卡芯片型号查找驱动
  7. 编译Linux网卡驱动
    1. 安装编译工具和内核头文件
      1. 树莓派
      2. Nano Pi
      3. ORange Pi
      4. CentOS
      5. 其它发行版
    2. 编译无线网卡技巧
      1. 相近内核头文件用于编译
      2. 内核模块版本和内核版本不一致的处理方法
  8. 查看驱动加载报错信息

本文将阐述Linux环境下安装WIFI驱动的常规思路。网络上绝大多数教程对新手极其不友好,现在咱们就用简单一点的方式来搞定无线网卡驱动安装。

本文的安装思路在UbuntuDebianDeepinCentOSKali等不同Linux发行版通用。无论使用Raspberry PiNano PiOrange PiARM开发板还是x86架构的设备,安装思路大体一致。

分清网卡是什么接口

主流的接口有两种:

  1. 直接插在主板上的是PCI接口(包括MINI-PCIPCIE)。
  2. 插在USB接口上的USB无线网卡

如果还没有购买,购买前到网卡官网搜一下,看官方提供的驱动是否兼容你的设备。MacOS(包括黑苹果)的驱动和Linux驱动不通用。需要特别注意Linux驱动Linux内核版本发行版设备架构的要求,一般在驱动下载界面会有明确说明。

部分无线网卡只兼容x86架构的设备,因此对于ARM开发板,可以到对应官方提供的文档手册,查看官方系统已经兼容的无线网卡型号,官方测试过的型号通常更加稳定和易用。需要注意的是,文档中列明的型号未必和销售标识的型号一致,此情况后文有说明。

查看内核信息:

uname -a

判断网卡是否在Linux下免驱

ifconfig -a

查看是否有wlan开头的网卡信息。例如:wlan0。当然,部分网卡也会显示为eth1wlx803f5d150c4cusb0之类。可以在插入网卡前执行一次ifconfig -a,插入网卡后再执行一次命令,对比前后差异。

ifconfig: command not found

部分发行版,例如CentOS 7默认已不再安装此命令,可以用ip addr替代或安装相应的net-tools软件包。

例如,CentOS下,安装net-tools

yum install net-tools -y

net-tools包括了ifconfigroutearpnetstat命令。

其它判断方法

也可以用iwconfig命令,查看当前无线网卡信息。

iwconfig

同样的,如果出现iwconfig: command not found,需要安装wireless-tools这个包。

apt install wireless-tools

请将apt替换为对应发行版的包管理工具。

如果上述方式已经可以获取到相应的无线网卡信息,则说明已经驱动了网卡。

到网卡官网下载驱动

根据所购买的网卡型号,到对应的网卡官网,下载驱动并按说明进行安装。只有运气非常好,才有可能遇到所购买的无线网卡兼容Linux平台的情况😂。否则我们可能需要先获取网卡芯片型号,然后再搜搜对应芯片的Linux驱动程序驱动源文件

到对应Linux发行版Wiki中查找固件

如果你的PCI无线网卡USB WIFI无法正常工作,大概率是因为系统中缺少了对应的网卡固件。

Debian

对于Debian系统, 可以在Debian-Wiki里找到并安装USB无线网卡芯片的固件。

Ubuntu

对于Ubuntu系统, 可以通过下列命令安装所有的USB无线网卡固件:

apt-get install linux-firmware

通常情况下, 各类WiFi芯片的固件都存放在/lib/firmware目录下。

查看网卡芯片型号

无线网卡型号芯片型号通常不一致。例如电商平台显示的型号TL-WN725N型号可能对应芯片型号rtl8188eurtl8188eus。不同版本的无线网卡对应的芯片型号可能不同,例如水星MW150US对应rtl8188eu,而MW150US(免驱版) V2.0对应芯片rtl8188gu。不同生产批次对应的芯片型号也有可能不同,例如2019的批次可能对应一个型号,而2020可能对应另外的型号。这是因为本身网卡芯片也在不断迭代升级,提供更多的功能,而厂商为了销售的方便,会统一制定一个网卡型号。不同品牌相似功能的产品可能用的是同一个芯片,为了准确定位当前硬件的芯片,可以通过lspcilsusb查看。

PCI无线网卡

apt install pciutils

查看网卡信息:

lspci -v

如果信息太多,可以使用lspci -v|grep network过滤一些信息,方便查找。

通常PCI无线网卡的芯片型号信息会直接显示在设备名称中。

USB无线网卡

apt install usbutils

查看网卡信息:

lsusb

通常usb无线网卡显示的芯片信号信息不一定在名称中。例如:

root@raspberrypi:~# lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0846:9053 NetGear, Inc.

部分已经安装了驱动程序的网卡,显示信息可能如下:

root@NanoPi-NEO2:~# lsusb
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 004: ID 0bda:8812 Realtek Semiconductor Corp. RTL8812AU 802.11a/b/g/n/ac WLAN Adapter

这种情况,芯片信号一目了然,就是RTL8812AU。但其实第一种情况也可以查找芯片信号,根据ID 0846:9053到相应的网卡厂商官网进行查找。

例如水星MW150US2.0

Bus 005 Device 012: ID 0bda:b711 Realtek Semiconductor Corp.

根据ID 0bda:b711,到下述网站查找型号,可以找到对应的网卡芯片型号RTL8188GU

USB ID查询站点:

除了水星MW150US 2.0免驱版的网卡芯片为RTL8188GU普联TL-WN726N(免驱版) TL-WN725NCF-WU815N V2也可能使用的是这款芯片。

BCM无线网卡

目前很多笔记本电脑的用的是BCM的无线网卡和蓝牙模块集成模块,上述两个命令是无法找到网卡信息的。

dmesg | grep brcm

dmesg.png

可以看到类似上图所示内容,则型号为BCM4343A0,蓝牙和WIFI共用一个模块。

根据网卡芯片型号查找驱动

知道了网卡芯片型号后,可以搜索到的资料就很多了。只要芯片型号匹配的驱动理论上都可以用。

查找驱动除了百度Google,还有俩常规方案:

  1. 到对应的芯片厂商官网搜索。
  2. 到万能的github搜索。

通常芯片厂商会提供部分Linux网卡驱动的源代码,需要自行编译安装,也可能只提供对应发行版的安装文件(一定要确认一下内核版本和驱动要求的版本是否匹配、架构是否匹配。x86的驱动程序是不能用于arm64架构的,反之亦然)。

这里给出部分Linux驱动地址。

rtl8188guLinux驱动:

https://github.com/lwfinger/rtl8188gu

rtl8188euLinux驱动:

https://github.com/lwfinger/rtl8188eu

rtl8821cuLinux驱动(ID 0bda:1a2b):

https://github.com/MingxuZhang/rtl8821cu

编译Linux网卡驱动

驱动编译命令一般在README.md中都已经有介绍,在此不再赘述。但是在执行编译命令前,需要先确保对应内核的linux-headers包已经安装。

安装编译工具和内核头文件

通常编译驱动也需要gitgccmakeautoconfbuild-essential等依赖,请根据需要自行研究。

如果执行make编译时提示/lib/modules/....../build does not exist,通常由于对应的内核头文件(kernel header)没有安装。

树莓派

由于Raspberry Pi具有超大的用户群,在Raspbian中安装常见驱动比其他Linux系统方便得多。

sudo apt install git bc bison flex libssl-dev make raspberrypi-kernel-headers

如果您的Raspberry Pi内核非常新,则您需要等待几个周的时间才能通过apt安装到对应的kernel-headers。或者通过https://github.com/raspberrypi/linux获取内核源文件。

关于树莓派内核编译:https://www.raspberrypi.org/documentation/linux/kernel/building.md

Nano Pi

内核源码:https://github.com/friendlyarm/linux

git clone https://github.com/friendlyarm/linux -b sunxi-4.14.y --depth 1

其中4.14应替换为uname -r对应的版本。

参考文档:http://wiki.friendlyarm.com/wiki/index.php/Building_U-boot_and_Linux_for_H5/H3/H2%2B/zh

编译内核或模组的方法,请参考对应平台的说明文档。

ORange Pi

内核源码:https://github.com/orangepi-xunlong?tab=repositories

CentOS

yum install kernel-devel

其它发行版

apt-get install linux-headers-$(uname -r)

编译无线网卡技巧

相近内核头文件用于编译

通常下载内核的方式获取linux-headers非常耗时耗力,而某些情况无法通过包管理工具直接安装现行版本的内核linux-headers。这种情况下,可以安装与当前内核版本号非常接近的kernel headers版本,然后进入对应当前版本的modules文件夹下,通过软连接ln -sbuild文件连接到相近版本,然后再编译。

cd /lib/modules/`uname -r`
ln -s build ../相近版本

内核模块版本和内核版本不一致的处理方法

如果在dmesg中看到类似下面的信息(version magic):

[ 4496.876553] 8188gu: version magic '4.15.0-99-generic SMP mod_unload aarch64' should be '4.14.111 SMP mod_unload aarch64'

说明驱动编译时候的内核模块版本和当前内核版本不一致。

这种情况通常发生在你拿不到用户当前使用的kernel但需要给他对应驱动的时候。

cd /usr/src/linux-headers-当前内核
vim include/linux/vermagic.h

UTS_RELEASE修改为uname -r对应的版本号。注意后面的空格。

例如,修改前:

...
#define VERMAGIC_STRING 						\
	UTS_RELEASE "	"						\
	MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT 			\
	MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS	\
...

修改后:

...
#define VERMAGIC_STRING 						\
	"4.14.111 "							\
	MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT 			\
	MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS	\
...

修改完成后,重新编译无线网卡驱动即可。

查看驱动加载报错信息

如果编译安装了无线网卡驱动并重启后仍然无法正常使用网卡。可以通过

dmesg

命令查看相关信息。插入和移除无线网卡都会有对应的信息显示。开机后WIFI固件加载的情况也有显示。

打赏
交流区(23)
foDDYY

感谢,ThinkPad Edge E40的无线网卡突然消失,看了很多文章,折腾了几次,终于在你这里找到了答案。

另外还有个小插曲:我装好8188GU驱动重启以后,还是死活不显示无线网卡,各种郁闷,后来又在网上翻阅,看到一篇文章里说如果网卡被识别成了CDROM,要先eject一下,突然灵机一动,打开文件管理器,挂载了一下Mercury,再断开......搞定了。

真不容易。

2021年7月12日 15:00回复
轶哥

恭喜🎉

2021年7月12日 23:26回复
🧶

虚拟机显示成Realtek802.11n了但是kali系统里并没有检测到,驱动已经安装了

2021年10月29日 06:19回复
轶哥

虚拟机显示成Realtek802.11n了但是kali系统里并没有检测到,驱动已经安装了

这种情况可能是驱动不对。

2021年10月29日 06:21回复
🧶

这种情况可能是驱动不对。

我是按照这个来弄的

https://www.icode9.com/content-3-1040844.html

操作和图片没差别,airmon-ng一直是空的 ifconfig -a也没有任何wlan的设备,不知道问题出在哪里,您看下这个网址指向github的驱动是否ok

%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%8720211029143034.png

2021年10月29日 06:32回复
杜平

如果usb网卡被识别为cdrom,可用usb_modeswitch命令切换回网卡状态。

sudo usb_modeswitch -KW -v 0bda -p 1a2b

参考 https://github.com/dluvnn/8188GU_for_Pi

2021年11月8日 03:42回复
🧶
[ 1710.706039] usb 1-1: USB disconnect, device number 5
[ 1731.786133] usb 1-1: new high-speed USB device number 6 using ehci-pci
[ 1732.141138] usb 1-1: New USB device found, idVendor=0bda, idProduct=b711, bcdDevice= 2.00
[ 1732.141146] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1732.141147] usb 1-1: Product: 802.11n WLAN Adapter
[ 1732.141148] usb 1-1: Manufacturer: Realtek
[ 1732.141149] usb 1-1: SerialNumber: 00E04CB82101
[ 1732.156321] 8188gu: disagrees about version of symbol module_layou
2021年10月29日 06:43回复
轶哥

不好意思,才看到。用楼下的资源试试呢?

2021年11月8日 03:41回复
🧶

我用的就是McMCCRU写的那个,我向作者提问,作者说不用kali不知道

2021年11月8日 03:44回复
🧶
2021年11月8日 03:45回复
轶哥

https://github.com/McMCCRU/rtl8188gu/issues/20

换个kali能用的网卡吧,也不贵,折腾驱动不划算。

2021年11月8日 03:49回复
🧶

例如呢 经济实惠的

2021年11月8日 03:56回复
杜平

换个kali能用的网卡吧,也不贵,折腾驱动不划算。

没错,给jetson nano装tplink wn725n驱动花了好几天,最后40块钱买了个免驱的,插上直接能用。

2021年11月8日 04:05回复
🧶

建议把右上角的菜单div加一个可以收起来的按钮

2021年11月10日 01:46回复
轶哥

建议把右上角的菜单div加一个可以收起来的按钮

嗯嗯,好的

2021年11月10日 01:54回复
轶哥

例如呢 经济实惠的

淘宝以kali为关键词搜索,有不少无线网卡。

2021年11月10日 01:55回复
轶哥

没错,给jetson nano装tplink wn725n驱动花了好几天,最后40块钱买了个免驱的,插上直接能用。

嗯嗯,我也有同样经历。有些驱动找到了就是跑不起来,有很多国内厂商都是原芯片魔改的。

2021年11月10日 01:55回复
杜平

文中 rtl8188gu驱动,lwfinger已经不支持了,我找到个新的可用 https://github.com/McMCCRU/rtl8188gu

2021年11月8日 03:37回复
轶哥

感谢🙏

2021年11月8日 03:39回复
纵横天下

/root/rtl8192du/core/没有这个文件夹。我尝试把内核里面的那个文件夹链接过来也是同样的效果,这怎么搞呀!大佬

2022年7月5日 05:07回复
轶哥

这个问题,需问一下驱动的作者。

2022年7月5日 06:36回复
Anonymous

大佬,我这里显示incompatible gcc/plugin versions 网上找了一圈没看到方法,咋办呢> 这个问题,需问一下驱动的作者。

2022年11月29日 08:56回复
轶哥

调整下gcc版本试试

2022年11月29日 13:20回复
尚未登陆
发布
  上一篇 (MacOS安装无线网卡驱动通用方法)
下一篇 (K个一组翻转链表)