LOADING

加载过慢请开启缓存 浏览器默认开启

为wsl 2添加USB网卡支持

2026/2/18 程序 技术性 Linux

前言

Windows下,NDIS标准驱动和其TCP/IP协议栈的严格限制,使网卡即便理论上可以进入监听模式,大部分的事情也无法完成。
例如deauth攻击,Windows系统会阻止与网络配置不符合的数据包,无法伪装MAC,也就使deauth攻击无法成功。除非你自己给网卡写驱动,通过驱动本身提供接口,但对于我们来说,太过困难。
而Linux系统由于其开放的设计,通常在硬件支持的情况下,可以轻松地利用网卡做大部分的事情。

但若非要在Windows上便捷地使用监听模式等高级网络功能…
想到WSL,Windows Subsystem for Linux是Microsoft官方支持的Linux子系统,可以方便地在Windows上启动一个Linux环境,
其启动速度比一般的虚拟机方案快很多,资源消耗更加少,而且与主机的文件交换也很方便(c盘等分区会被自动挂载至wsl中的/mnt,c盘的路径是/mnt/c/)。可以“轻量化“地使用Linux下强大的网络工具链和生态

接下来我们将使用我的MT9721u探讨如何在WSL中使用USB网卡(笔记本内置网卡一般在硬件上就不支持诸如监听模式等高级功能,因此不做考虑)。以下操作不支持旧的WSL,若需要按此操作,请使用WSL 2。

这里的分步不是严格的,你可以以别的正确步骤进行

1.将USB网卡连接至WSL

要在WSL中使用USB网卡,必须将USB网卡从主机逻辑移除并连接至WSL,为此,我们需要usbipd-win此处是Microsoft官方关于如何使用usbipd-win将USB设备连接至WSL的教程,因此这里我们只简要提一些。

首先你需要确保是WSL 2,旧的WSL版本不受支持,并确保:

  • 在x64的电脑上运行WSL 2
  • 最好操作系统为win11,较为新的win10也是可以的
  • 尽可能保持内核最新,较旧的内核可能不支持usbipd
  • 也尽可能保持WSL和usbipd最新,这样它们就会自动识别正确的模式来attach

接下来,打开powershell,使用Windows程序包管理器安装usbipd:

> winget install --interactive --exact dorssel.usbipd-win

在新的终端中或重启终端后,插入USB网卡,并执行(无需管理员,但后面将设备设置Shared必须使用管理员权限):

> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-2    152d:a853  USB Attached SCSI (UAS) 大容量存储设备                        Not shared
1-3    35d8:1496  FreeDSP, USB 输入设备                                         Not shared
2-1    13d3:5458  USB2.0 HD UVC WebCam, Camera DFU Device                       Not shared
2-2    0489:e0f6  MediaTek Bluetooth Adapter                                    Not shared
3-2    0e8d:7961  MediaTek Wi-Fi 6/6E Wireless USB LAN Card                     Not shared
4-1    0b05:19b6  USB 输入设备    

我们可以看到输出,其中3-2 0e8d:7961 MediaTek Wi-Fi 6/6E Wireless USB LAN Card是我们的MT7921u网卡(名称可能不一样,但你可以通过VID:PID识别设备,MT7921u正是0e8d:7961

现在我们需要将其设置为Shared模式,使用busid指定,此时必须拥有管理员权限:

> usbipd bind --busid 3-2

再次执行usbipd list确认:

> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-2    152d:a853  USB Attached SCSI (UAS) 大容量存储设备                        Not shared
1-3    35d8:1496  FreeDSP, USB 输入设备                                         Not shared
2-1    13d3:5458  USB2.0 HD UVC WebCam, Camera DFU Device                       Not shared
2-2    0489:e0f6  MediaTek Bluetooth Adapter                                    Not shared
3-2    0e8d:7961  MediaTek Wi-Fi 6/6E Wireless USB LAN Card                     Shared
4-1    0b05:19b6  USB 输入设备                                                  Not shared

我们看到3-2 0e8d:7961 MediaTek Wi-Fi 6/6E Wireless USB LAN CardSTATEShared,现在它可以被连接至WSL,
请在WSL正在运行的时候执行(但不是在wsl终端内):


> usbipd attach --wsl --busid 3-2
usbipd: info: Using WSL distribution 'Ubuntu-22.04' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Loading vhci_hcd module.
usbipd: info: Detected networking mode 'mirrored'.
usbipd: info: Using IP address 127.0.0.1 to reach the host.

现在USB网卡已经连接在WSL并受WSL的全权控制,Windows下不能再访问。这里不赘述如何将其从WSL断开并交还Windows。

不过,先别急,你的WSL极大概率不能直接使用USB网卡,不只是MT7921u,微软没有在编译Linux内核时启用绝大部分内核模块。接下来我们将进行重新编译内核等操作,来添加对MT7921u的支持。

2.下载固件

这里比较简单,但注意需要下对固件

考虑到我们的wsl现在只想额外支持mt7921u,我们没必要安装Linux-firmware。
现在我们将下载固件,在wsl终端中:


$ cd /tmp
# 下载补丁固件
$ sudo wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
# 下载主固件
$ sudo wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/mediatek/WIFI_RAM_CODE_MT7961_1.bin?id=8336d64a043ef8c7037abaadf28c422a3589569a -O WIFI_RAM_CODE_MT7961_1.bin
#现在在固件文件夹创建存放固件的地方,并复制过去
$ sudo mkdir -p /lib/firmware/mediatek
$ sudo cp /tmp/WIFI_MT7961_patch_mcu_1_2_hdr.bin /lib/firmware/mediatek/
$ sudo cp /tmp/WIFI_RAM_CODE_MT7961_1.bin /lib/firmware/mediatek/

3.编译内核和驱动模块

Linux内核采用模块与对应内核严格匹配的机制,因此为了添加新的驱动,你必须重新编译内核,即便你采用模块的方式加载驱动。

现在,必须先检查你的wsl使用的Linux内核版本,
在wsl终端:


$ uname -a
Linux DESKTOP-CHAU 6.6.114.1-microsoft-standard-WSL2-add-MT7921USupport+ #1 SMP PREEMPT_DYNAMIC Sun Mar  1 16:44:20 CST 2026 x86_64 x86_64 x86_64 GNU/Linux
#因为我已经编译过并修改内核了,所以这里内核的名称和通常wsl内核有所不同

注意上面从 GitHub 上拉取 WSL 官方内核源码,严禁直接拉取主线,必须对应你当前使用的内核版本。

如何确定对应分支?注意上面命令的输出,只看内核版本号中的主版本号和次版本号(例如 6.6.114.1 → 6.6),然后在 WSL2-Linux-Kernel 仓库 中找到名为linux-msft-wsl-6.6.y的分支(即 linux-msft-wsl-<主>.<次>.y)。
例如我的内核版本是 6.6.114.1,那么就应该拉取 linux-msft-wsl-6.6.y

在wsl终端:


$ git clone --depth 1 -b linux-msft-wsl-6.6.y https://github.com/microsoft/WSL2-Linux-Kernel.git
$ cd WSL2-Linux-Kernel

接下来安装编译依赖


$ sudo apt update
$ sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev bc libncurses-dev python3 -y

现在开始调整配置文件,确认工作目录在WSL2-Linux-Kernel中:


$ cp Microsoft/config-wsl .config
#以官方配置为底板进行修改
$ make menuconfig

你可看见下图,是图形配置页面的样子
menuconfig的样子

⚠注意
Linux kernel只会在init namespace中的/lib/firmware寻找固件(函数kernel_read_file_from_path_initns())。但wsl中,init命名空间为一个通过9p协议挂载的特殊文件系统,不是发行版中的实际路径。因此wsl中工作的内核模块不能从/lib/firmware/找到任何固件。所以这里我们选择将固件内置进新的内核内。

从图上的菜单通过如下路径

  • Device Drivers
    • Generic Driver Options
      • Firmware loader
        • Build named firmware blobs into the kernel binary

修改Build named firmware blobs into the kernel binary的值为mediatek/WIFI_RAM_CODE_MT7961_1.bin mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin(注意空格,记得回车)
并确认Firmware blobs root directory的值为/lib/firmware

启用mt7921u的内核驱动模块

  • Device Drivers
    • Network device support
      • Wireless LAN
        • MediaTek devices
          • <M> MediaTek MT7921U (USB) support

MediaTek MT7921U (USB) support按M设置为<M>(模块)

添加cfg80211mac80211(若下面的选项已经是<M>,不用设置为<*>(按y))

  • Networking support
    • Wireless
      • <*> cfg80211 - wireless configuration API
      • <*> Generic IEEE 802.11 Networking Stack (mac80211)

选项调整完毕,保存并退出menuconfig
在wsl中执行:


$ make -j$(nproc)

开始编译内核和模块

全部编译完成后,你的make所有输出中应该有Kernel: arch/x86/boot/bzImage is ready或类似的消息

在wsl中执行:


$ sudo make modules_install

安装编译后的内核模块

并将编译后的内核移动到Windows下你喜欢的地方


$ cp arch/x86/boot/bzImage /mnt/c/Users/你的Windows用户名/wsl2-kernel-mt7921u

3.配置启动

现在可以关掉wsl了
请在Windows处的终端执行:


> wsl --shutdown

来彻底关掉wsl

在C:\Users\你的用户名\中创建或修改你的.wslconfig文件
内容


[wsl2]

kernel=你内核放在Windows侧的文件路径(如"C:\\Users\\你的Windows用户名\\wsl2-kernel-mt7921u",注意路径必须使用双斜杠)

现在会以你编译的新内核启动。

⚠注意
再次提醒,Linux内核模块通常与其一同编译出的内核严格匹配,内核会拒绝启动并非与其一起编译的内核模块,
所以千万不要偷懒只安装模块不更换内核,也不要只编译模块不编译内核。

现在重新启动wsl,并利用usbipd将USB网卡移交给wsl,
现在在wsl终端执行:


$ dmesg | grep -i "mt7921"

输出类似:


[    0.000000] Linux version 6.6.114.1-microsoft-standard-WSL2-add-MT7921USupport+ (xxx) (gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #1 SMP PREEMPT_DYNAMIC Sun Mar  1 16:44:20 CST 2026
[  223.271475] usbcore: registered new interface driver mt7921u
[  223.277858] mt7921u 2-1:1.0: WM Firmware Version: ____010000, Build Time: 20240219111038
[  224.950037] mt7921u 2-1:1.0 wlx90de80152995: renamed from wlan0

你还可以通过iwconfigip link show,若认出网卡(wlx…或wlan…),还有实际的应用(如,正常上网或airmon-ng)验证网卡是否正确工作

若一切正常,
恭喜你,成功为wsl添加mt7921u这USB网卡的兼容并成功使用

现在你可以以此类推,为更多非通用USB设备添加驱动支持。