WSL2连接USB存储设备(保姆级教程,真正做到你奶奶来了也能成功) |
您所在的位置:网站首页 › 如何检查usb驱动器是否正常使用 › WSL2连接USB存储设备(保姆级教程,真正做到你奶奶来了也能成功) |
最近在使用WSL2作为我的Linux开发环境,不过在我尝试将bin文件烧录到SD卡(这里我是通过USB读卡器连接到电脑上)上时,发现SD没有被挂载上,去网上找了下原因。发现主要是以下2个原因导致的: WSL2本质是一个虚拟机,无法直接访问宿主主机的USB设备。WSL2的内核没有加入USB存储设备的驱动。WSL2:WSL2本质上是一个虚拟化技术,它在Windows操作系统上创建了一个轻量级的虚拟机,其中运行了一个完整的Linux内核。这个Linux内核与Windows内核相互隔离,但可以通过WSL2与Windows系统进行通信和交互。WSL2使用了Linux内核虚拟机(VM)技术,通过Hyper-V虚拟化平台来实现,在Windows系统上运行Linux应用程序时提供了更好的性能和兼容性。虽然WSL2在本质上是一个虚拟化技术,但它与传统的虚拟机不同,它并不是运行完整的Linux发行版,它更加轻量级且无需额外的资源分配,提供了一个与Linux兼容的运行时环境。用户可以在WSL2中安装并运行各种Linux发行版,如Ubuntu、Debian、Fedora等。WSL2和Linux发行版之间的关系是,WSL2提供了一个运行Linux发行版的虚拟化环境,用户可以在WSL2中安装和运行各种Linux发行版,以获得Linux环境和运行Linux应用程序的能力。 知道了原因就好办了,先来解决第一个问题:让WSL2连接USB设备。这里用到了usbipd-win这个项目。 usbipd-win:USB/IP项目旨在开发一种通用的通过IP网络共享USB设备的系统。为了让计算机之间能够共享USB设备并完全发挥它们的功能,USB/IP将“USB I/O消息”封装到TCP/IP数据包中,并在计算机之间传输它们。说白了就是把USB封装在TCP中,通过网络传送。 先在windows中打开powershell使用以下命令来安装usbipd工具: winget install --interactive --exact dorssel.usbipd-win下载完后点击安装就好,安装完后还会要求你重启电脑。 再到WSL2中使用使用以下命令来安装usbipd工具: sudo apt install linux-tools-generic hwdata sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20到这里第一个问题就解决了,别忘了重启下电脑。 然后再来解决第二个问题:重新编译WSL2的内核,加入 USB 存储设备支持。 首先我们需要到WSL2的内核仓库中clone一份内核源码: git clone https://github.com/microsoft/WSL2-Linux-Kernel.git再把源码解压出来: unzip WSL2-Linux-Kernel-linux-msft-wsl-5.15.y然后再安装libncurses-dev: sudo apt install libncurses-devlibncurses-dev:libncurses-dev是一个开发库,用于在Linux系统上开发基于终端的用户界面(TUI)应用程序。它是ncurses库的开发版本,提供了编译和链接TUI应用程序所需的头文件和静态库文件。使用libncurses-dev,开发人员可以利用ncurses库的功能创建具有交互性和可视化效果的终端应用程序。 使用以下命令来编辑内核配置文件: make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl进入 Device Drivers -> USB support -> Support for Host-side USB ,选中 USB Mass Storage support( * 号是直接编译进内核,M 是编译为内核模块,内核模块需要手动加载),把下面弹出来的一堆驱动都选上,保存完之后就可以退出了。 在开始编译之前还需要安装build-essential、flex、bison、libssl-dev、libelf-dev、dwarves,这些工具是编译内核所需的常见工具和库。 sudo apt install build-essential flex bison libssl-dev libelf-dev dwarves这里我已经安装过了就不重新安装了,接下来就可以编译内核了,进入源码目录WSL2-Linux-Kernel-linux-msft-wsl-5.15.y,用下面这个命令将刚才的那些驱动全部编进内核中: cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.y make -j$(nproc) bzImage KCONFIG_CONFIG=Microsoft/config-wsl编译完成的内核是bzImage文件,和我们编译时指定的名称一致,文件在arch/x86/boot/文件夹下。 大家不嫌弃的话可以使用我编译好的这个: 链接:https://pan.baidu.com/s/1dfBIGh_a2nbN9QiXUPQtXg?pwd=WSL2 提取码:WSL2 把编译好的内核复制出来,放在 Windows 的用户目录(默认是 C:\Users\{username})下创建一个名为 .wslconfig 的文件,内容根据 微软官方文档 来: [wsl2] kernel=path\\to\\kernel以我的为例: 到这里第二个问题也解决完了。 最后就是验证成果了 打开powershell使用以下命令来查看内核版本号。 uname -r可以看到这是更换内核前的版本号是5.15.90.1,然后使用下面这个命令来关闭WSL2,再重新打开WSL2。 wsl --shutdown可以看到版本已经变成5.15.133.1了,说明内核更换成功,接下来使用usbipd-win来连接,usbipd-win的使用方法参考也是参考的微软官方文档,首先打开powershell,使用下面的第一个命令列出所有连接到 Windows 的 USB 设备,找到USB大容量存储设备对应的BUSID,然后使用这个BUSID替换下面第二个命令中的来使USB设备连接到WSL2,以我的为例: usbipd wsl list usbipd wsl attach --busid最后到WSL2中使用下面使用下面这2个命令来查看USB设备和SD卡的挂载情况: lsusb ls /dev/sd*可以看到WSL2已经成功地连接上了USB设备,SD卡也挂载成功✌️。 PS:有哪个地方写得不对的,欢迎各位指正。 参考连接 在WSL2中连接USB设备 HyperV和WSL2的USB直通 WSL2嵌入式开发随笔(2)——使用自己编译的WSL2系统内核 wsl系列内容:WSL2编译和使用自定义内核的方法 WSL support 连接USB设备 WSL support 连接USB设备 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |