文章

给Linux买无线网卡

给Linux买无线网卡

给 Linux 买外设不像 Windows,一定要注意驱动问题,否则可能会出现买回来了没驱动,插上去根本没反应的困境。在买了好几次网卡结果不能用的经历之后,我决定开始调研这个问题。

Linux 里的驱动

首先必须要了解一条背景知识,Linux 里的驱动分为两类:树内驱动树外驱动。前者的代码已经合并到了 Linux 官方的主线内核源码树中,后者则由厂商或第三方开发者独立维护,存放在他们自己代码仓库里。由于 Linux 不保证内核内部 API 的稳定性,非树内的驱动代码在内核迭代时不会由 Linux 官方确保更新,因此厂商提供的第三方驱动极有可能落后于内核版本,随着时间推移很快陷入无人维护、不可使用的状态。

Wi-Fi 芯片驱动

无线网卡里的 Wi-Fi 芯片才是决定内核驱动支持情况的关键。目前市场上只有三家厂商生产适配 USB 协议的 Wi-Fi 芯片:Mediatek(联发科), AIC Semiconductor(爱科微),Realtek(瑞昱)。

其中瑞昱(蓝色小螃蟹)的主要业务份额在 Windows 系统,因此其对 Linux 的支持并不是很积极,支持情况也不是很好,在 Linux 上能否工作大部分仰仗于开源社区的努力。若电脑开启安全启动(Secure Boot),必须选用内核原生驱动网卡;瑞昱第三方驱动网卡在安全启动开启时,会出现大量适配难题。

Linux Wi-Fi 网络栈

一个无线信号从空气中传到应用层,在 Linux 中要经过以下几层分工:

  1. 用户空间工具(iw、wpa_supplicant、NetworkManager等)

    我们在终端敲的命令或桌面的 Wi-Fi 图标。它们不直接和驱动说话,而是通过一个叫 nl80211(基于 Netlink 机制)的接口向内核发送配置请求(例如:“我要连接这个 Wi-Fi”)。

  2. 核心配置层(cfg80211)

    Linux 无线子系统的总管。负责接收用户空间的请求,管理系统里所有的无线设备列表,并把配置下发给具体的驱动或协议栈。

  3. 软 MAC 协议栈(mac80211)—— 核心主角

    一个内核框架,实现了几乎全套的 802.11 无线协议。它负责处理:Wi-Fi 帧的组装与拆解、速率控制(Rate Control)、信道扫描状态机、WPA/WPA2/WPA3 加密算法(CCMP/GCMP)的软件实现、AP(热点)模式的管理等。

    在 mac80211 出现(大约是 Linux 2.6)之前,内核中没有统一的内核框架,每个芯片厂商不仅要写如何控制自己的硬件芯片,还要在驱动内部自己去实现一套 802.11 无线协议栈,这导致代码重复、Bug 满天飞、驱动极不稳定、用户体验差等等问题。为了终结这种乱象,Linux 社区的大佬们出手了,他们把所有无线网卡公用的、与具体硬件无关的 802.11 协议处理逻辑全部抽离出来,放进了内核,这就是 mac80211。

  4. 硬件驱动层(Hardware Driver)

    有了 mac80211 撑腰,现在的驱动变得极其纯粹和简单。芯片厂商再出新网卡时,就不再需要再去研究怎么实现复杂的无线网络协议。他们只需要实现 mac80211 定义好的几个回调函数,剩下的脏活累活全部由 mac80211 在内核里自动完成。因此,兼容 mac80211 的 Wi-Fi 芯片会有最好的 Linux 用户体验。

    虽然 mac80211 很棒,但它只适用于 SoftMAC(软 MAC) 网卡——即硬件只负责射频,协议全靠 CPU 跑的网卡(市面上绝大多数 USB、PCIe 网卡都是这种)。还有一种网卡叫 FullMAC(硬 MAC) 网卡,例如树莓派板载的Broadcom(博通)芯片(brcmfmac)。这种网卡非常强悍,它自己芯片内部自带了一个微型处理器(CPU)和固件,把 802.11 协议栈直接烧录在网卡芯片里了。这类驱动在 Linux 里会绕过 mac80211,直接对接 cfg80211。因为它们不需要 Linux 内核帮它们处理协议,网卡自己就能搞定。

多模式免驱网卡

部分 USB 无线网卡内置私有 Windows 驱动,插电脑后会默认识别为 U 盘 / 虚拟光驱,自动弹窗安装 Windows 驱动。此类网卡无法直接在 Linux /macOS 等非 Windows 系统识别为无线网卡,需要切换硬件工作模式。

现代 Linux 发行版自带 usb-modeswitch 工具,可自动适配切换网卡模式,但仍存在兼容故障风险。电商标注「免驱版」「无需安装驱动」的网卡,基本都是多模式网卡。非 Windows 系统(Linux /macOS/ UNIX)优先选购单模式网卡;即使用户只用 Windows,也不建议买多模式网卡,内置驱动永久不会更新,后续系统升级极易失效。

参考评价时忽略 Windows 用户的吐槽:单模式原生驱动网卡,Windows 用户常会抱怨需要装驱动,这恰恰是 Linux 友好款的特征。

参考资料

GitHub 上有一位叫 morrownr 的大神,几年如一日地维护着 Linux USB 网卡驱动指南,本文大部分内容翻译自他的工作,在此之上补充了一些 Linux 内核背景知识。

本文由作者按照 CC BY 4.0 进行授权