WSL2使用USB设备

2023-05-16

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、WSL2是什么?
  • 二、编译内核
    • 1.查看自己的内核
    • 2.准备工作
    • 3.下载适合自己的内核版本
    • 4.开始编译
    • 4.使用内核
    • 5.绑定设备
  • 总结


前言

WSL2现在虽然称不上完美,但是绝对秒杀一众虚拟机,再加上WSL-GUI的出现,让我重新燃起了对WSL的信心,美中不足的是不支持USB设备,特别是诸如USB Camera这样的必需品,本文章我就介绍i怎么在WSL2中使用USB设备,Camera后面的文章再探讨。


一、WSL2是什么?

这里就不赘述了,直接百度搜就行了。原生的WSL2是不支持USB设备的,要想使用需要特别编译一个内核。

二、编译内核

1.查看自己的内核

不同的内核需要下载不同的分支,查看内核的方法如下:

uname -a
Linux DESKTOP-G21E46A 5.10.102.1-microsoft-standard-WSL2 #1 SMP Mon Sep 5 11:12:40 CST 2022 x86_64 x86_64 x86_64 GNU/Linux

注意看5.10.102.1-microsoft-standard-WSL2,这个就是我的内核分支,你的也一样,记住这个名字后面会用到。

2.准备工作

Running uname -a from within WSL should report a kernel version of 5.10.60.1 or later. You’ll need to be running a WSL 2 distro.
让自己的内核版本大于5.10.60.1,或者干脆和我一样使用5.10.102.1这个版本,我是成功的,按照这个教程你也会成功。

  1. 查看自己的分支
    打开一个terminal(Windows Terminal和PowerShell都行),输入如下的指令:

    wsl --list -v
    NAME            STATE           VERSION
    * Ubuntu-20.04    Stopped         2
    Ubuntu-18.04    Running         2
    

    具体显示什么主要看你安装了什么版本,这里我们以Ubuntu-18.04为范例,保证可以成功。其它的分发版请自行测试,不保证一定的那个成功。

  2. 备份自己的分发版
    由于操作有风险,如果不小心出错可能会导致WSL被污染或毁坏的可能,请注意备份重要数据,或 者干脆备份整个分发版,方法如下:

    wsl --export <current-distro> <temporary-path>\wsl2-usbip.tar
    

    最好找一个足够大的磁盘空间备份。

  3. 还原分发版
    前提是已经备份过分发版,从备份的分发版中恢复数据。使用如下命令:

    wsl --import wsl2-usbip <install-path> <temporary-path>\wsl2-usbip.tar
    

    如果遇到报错就先取消注册分发版,再重新导入即可。

    wsl --unregister <distro>
    
  4. 相关教程
    希望大家一把成功,如果出了意外可以参考我的另一篇教程,里面有详细的备份还原操作,前提是你需要先备份,否则出了错就麻烦了。
    WSL2备份还原教程

3.下载适合自己的内核版本

借用上面的查看内核版本的命令,我们需要到github下载适合我们的分支,由于github需要挂代理,我们选择到gitee网站下载,内容一模一样。这里不要去fork,因为项目很大,受gitee的限制,是不能fork成功的,除非你是企业付费客户。
WSL2内核分支

接下来找到我们的那个分支,内核版本一定要对应上。不要clone主分支,直接去tag里面找。
在这里插入图片描述

在这里插入图片描述

画红框的是我的分支5.10.102.1,直接点后面的下载就可以了,国内的网速度还可以。

4.开始编译

先更新下源和系统。

sudo apt update
sudo apt upgrade

安装必要的软件环境

sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool

切换工作目录到WSL的内核目录里

cd WSL2-Linux-Kernel
cp /proc/config.gz config.gz
gunzip config.gz
mv config .config

这一步是把系统当前的内核配置拷贝进去,只增加相关的配置,不要改变WSL本来的配置。

sudo make menuconfig

打开内核编译配置模块,按照下面的配置项来改变配置。

Device Drivers -> USB Support
Device Drivers -> USB Support -> USB announce new devices
Device Drivers -> USB Support -> USB Modem (CDC ACM) support
Device Drivers -> USB Support -> USB/IP
Device Drivers -> USB Support -> USB/IP -> VHCI HCD
Device Drivers -> USB Support -> USB/IP -> Debug messages for USB/IP #这个如果打星号了就去除星号
Device Drivers -> USB Serial Converter Support
Device Drivers -> USB Serial Converter Support -> USB FTDI Single port Serial Driver

配置完一定要保存(Save),否则不产生效果

接下来开始编译,编译的核心数根据自身机器来定:

sudo make -j 8 && sudo make modules_install -j 8 && sudo make install -j 8

完成之后开始编译USB/IP tools.

cd tools/usb/usbip
sudo ./autogen.sh
sudo ./configure
sudo make install -j 8

拷贝编译出来的动态库,这个动态库是usbip tools需要用到的

sudo cp libsrc/.libs/libusbip.so.0 /lib/libusbip.so.0

安装usb.ids这样的话USB设备都是显示名字的,便于分辨,这个在后面可以看到。

sudo apt-get install hwdata

4.使用内核

拷贝编译好的内核到Windows用户目录,这样你在启动WSL的时候会自动加载

cp arch/x86/boot/bzImage /mnt/c/Users/<user>/usbip-bzImage

在Windows的/mnt/c/Users//目录下创建一个文件叫.wslconfig,里面添加以下的内容

[wsl2]
kernel=c:\\users\\<user>\\usbip-bzImage

注意<user>是你的windows账户,usbip-bzImage的路径一定要对。

接下来关闭当前的WSL,并重启新的WSL,这一步用于加载新内核。

wsl --shutdown #关闭所有的分发版
#只有Ubuntu-18.04执行
wsl
#多个分发版,指定执行
wsl -d Ubuntu-18.04

这个时候的分发版就是带USB/IP支持的了,这个时候还不算完,还要绑定,请继续往下看。

5.绑定设备

这个时候需要Windows端和Linux端协同操作,而且都需要管理员权限:
Windows端:
使用管理员打开一个PowerShell或Windows Terminal
在这里插入图片描述
上面就是列出来的所有USB设备,包括摄像头鼠标等,这里我们以摄像头为例BUSID 1-5

usbipd bind --busid=1-1

执行成功了后面的转台会变成shared

Linux端:
回到WSL里面,执行:

cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 192.168.32.1

注意nameserver后面跟着的地址,那是windows主机的地址,后面有用。

sudo usbip list --remote=192.168.32.1
Exportable USB devices
======================
 - 192.168.32.1
        1-1: NVidia Corp. : unknown product (0955:7c18)
           : USB\VID_0955&PID_7C18\00000
           : (Defined at Interface level) (00/00/00)
           :  0 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)

        1-5: Microdia : unknown product (0c45:671f)
           : USB\VID_0C45&PID_671F\5&F42D35A&0&5
           : Miscellaneous Device / ? / Interface Association (ef/02/01)
           :  0 - Video / Video Control / unknown protocol (0e/01/00)
           :  1 - Video / Video Streaming / unknown protocol (0e/02/00)

--remote后面跟的地址在/etc/resolve.conf里面看,就是windows主机的地址

这个时候看到的是所有主机已经shared的USB设备,还需要attatch才能使用。

sudo usbip attach --remote=192.168.32.1 --busid=1-5

需要哪一个就attatch哪一个,没有报错一般就是成功了,这个时候需要确认下,执行:

lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0955:7c18 NVidia Corp.
Bus 001 Device 002: ID 0c45:671f Microdia
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

这个时候usb.ids就发挥作用了,就是我们看到的类似于产品名的东西,NVidia Corp;前面的ID 0955:7c18是设备ID,这个是不变的,哪怕你拿到任何Ubuntu分发版上也是这个ID。

到了这里USB的绑定可以说结束了,但是还有个问题,特别是对于USB Camera来说还没有结束,因为/dev里面没有出现譬如video0这样的描述符,我们是不能直接使用的,这篇文章先留着这个遗憾,等下一篇文章解决。

总结

1、对操作系统和内核没什么经验的人来说还是有一定的难度,但是只要跟着教程一步步来应该没有问题的。
2、如果实在不行的话可以安装和我一样的内核版本,只要操作正确理论上一定成功,除非出现不可抗力,可以在下面留言,我们一起解决。
3、这个阶段我还没有用到USB Camera

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WSL2使用USB设备 的相关文章

  • Android:与充当主机的 USB 设备通信

    我们制作了一个可以充当 USB 主机或从机并处理其接收到的数据的设备 我想使用Android手机通过USB向其发送数据 我的研究使我得出结论 如果不修改硬件或操作系统 我们就无法在 USB 主机模式下使用 Android 设备 这样做不是一
  • 如何在没有窗口句柄的情况下使用 RegisterDeviceNotification?

    我正在编写一个 DLL 库 该库使用 VB NET 中的 winusb 连接到 USB 设备 由于它是一个 DLL 所以我没有窗口 而且我的库的用户也可能没有窗口 例如命令行应用程序 我见过的检测设备连接和分离的示例都使用RegisterD
  • 如何在PyUsb中绑定/取消绑定USB设备?

    我需要在 python 脚本上打开 关闭多个 USB 设备 我可以使用 PyUsb 绑定和取消绑定 USB 设备吗 我可以使用 shell 命令来做到这一点 关闭电源 echo device nuber gt sys bus usb dri
  • libv4l2:打开流时出错:设备上没有剩余空间

    我尝试为 opencv 获取立体声对 我将 Logitech B910 和 Logitech C910 网络摄像头连接到 USB 但有这个错误 我玩弄了怪癖参数并设置outfmt mjpeg在mplayer中 但又出现此错误 在哪里可以找到
  • 使用 adb 连接到 LG 手机时出现问题 (Mac OS X 10.7.5)

    当我跑步时adb devices没有设备显示为已连接 我的设备是运行 4 4 2 的 LG Optimus Exceed 2 周围有很多这样的帖子 所以这就是我所做的 我正在使用电话附带的数据线 它会充电并尝试同步照片 因此这不是问题 切换
  • 使用Python直接向USB发送信号

    如何使用 Python 将 USB 端口连接设置为高或低 这可用于定制 USB 设备 例如 假设我有一个 LED 连接到 USB 端口 数据线 现在通过代码我想闪烁它或控制它 现在 这可以通过使用任何微控制器 Arduino Raspber
  • 如何查找USB盘符?

    我正在编写一个安装程序来将应用程序安装到 USB 驱动器 该应用程序只能从 USB 驱动器使用 因此它可以通过自动选择要安装的 USB 驱动器来为用户节省额外的步骤 我可能会尝试使用 Nullsoft 或 MSI 进行安装 但由于我最熟悉
  • c#.NET USB设备持久标识符

    我正在寻找一种在 C 中为 USB 插槽 更具体地说是 SD 卡读卡器 提供持久标识符 在最终用户拔下集线器 重新启动计算机时 的方法 驱动器号并不总是分配给同一个插槽 但我需要一种方法来物理识别插槽 A 一旦我能够识别它 我就可以连接到驱
  • 与本机 Windows NPM/Yarn 处理相比,为什么 WSL 极其缓慢?

    我最近经常使用 WSL 因为我需要一些本机 UNIX 工具 并且模拟器还不够好 我注意到使用 NPM Yarn 时的速度差异令人难以置信 我进行了一个简单的测试 证实了我的感受 测试正在运行npx create react app my t
  • 如何设置USB连接模式?

    我正在编写一个应用程序 该应用程序应该将数据转储到 SD 卡上 然后在 PC 上编写另一个应用程序 当设备连接到 PC 时 在光盘驱动器模式下 该应用程序应该读取数据 在我的 HTC Legend 上 有一个对话框可供选择 仅充电 HTC
  • 如何将 Android USB 连接模式更改为仅充电? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • WSL 发行版对 VSCode 或 IntelliJ IDE 不可见

    几周来我遇到了这个非常奇怪的问题并且无法解决 我通常在 WSL2 上编码 它曾经在这台机器和用户上运行良好 但现在 每当我尝试在 Visual Studio Code 中打开远程资源管理器或尝试在 IntelliJ IDE 中打开 现有文件
  • 使用 BeagleBone Black 内核 >= 3.8 打开/关闭 USB 电源

    我需要 关闭 gt 睡眠几秒钟 gt 打开 beaglebone black 的 USB 电源 能够对连接到 USB 的设备 华为 E220 调制解调器 进行硬件重置 已经尝试过软重置 使用取消绑定 绑定和授权0 1 但软件重置不足以使设备
  • 使用 Windows 原始访问 API 直接访问 USB 驱动器

    在USB物理驱动器的末尾 我想使用Windows原始访问API直接写入数据 我不想使用内核驱动程序来做到这一点 据我所知 出于安全原因 Windows XP SP2 或 SP3 阻止了 HDD 直接访问 我不确定 USB 驱动器是否如此 请
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • Android 10 中没有设备筛选器的 USB_DEVICE_ATTACHED

    我正在开发一个 Android 应用程序 它在清单中为 BroadcastReceiver 注册了四个意图过滤器 这些都是 android hardware usb action USB DEVICE ATTACHED android ha
  • 作为附件的 Android 设备

    我有 2 个 Android 设备 我想用 USB OTG 电缆连接它们 并在两个设备之间进行来回通信 据我了解 一台 Android 设备将充当 USB 主机 运行 4 4 的 Nexus 7 另一台 Android 设备将充当 USB
  • os.uname() 函数在 Windows 中不起作用

    当我在 WSL2 Ubuntu 20 04 中用 Python 编写以下代码时 gt gt gt import os gt gt gt os uname 输出是 posix uname result sysname Linux nodena
  • Android Honeycomb 3.2 通过 USB 检测 MTP 连接

    我看到其他关于检测 USB 连接的帖子 但他们没有具体讨论 MPT 只是更一般的检测 所以我想我应该具体询问 MTP 我通过 USB 将 Xoom 连接到计算机 并且希望我的应用程序在建立 MTP 连接时写出一个文件 当 USB 断开且 M
  • Docker镜像删除后占用空间

    我提交了一个现有的 Docker 容器来创建新镜像 但提交的镜像太大了 原始镜像为 3 GB 并且在容器中安装了一些其他内容 提交的镜像为 8 GB 我的空间不足 所以我决定删除提交的映像 但即使删除提交的映像后 我的磁盘空间也没有增加 然

随机推荐

  • C# 端口转发

    业务需要跳转ip xff0c 又不想迁移程序 xff0c 可以用此方法进行端口转发 span class hljs keyword static span span class hljs keyword void span Main spa
  • 列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少

    列数的规则如下 1 1 2 3 5 8 13 21 34 求第30位数是多少 分析 xff1a 从第二个数开始 xff0c 每位等于前两个数相加 递归 xff1a span class hljs keyword public span sp
  • dotnet core 使用传统Cookie

    dotnet core 使用传统Cookie 先在添加Cookie中间件 app UseCookiePolicy public void Configure IApplicationBuilder app IHostingEnvironme
  • dotnet core web IApplicationBuilder 中间件学习

    dotnet core web IApplicationBuilder 中间件学习 编写一个自己的中间件的模版 public static class MyApp public static IApplicationBuilder User
  • docker gitlib 搭建

    docker gitlib 搭建 1 docker 命令构建 sudo docker run v etc localtime etc timezone rw v etc localtime etc localtime rw d p 8443
  • net core Ocelot 网关 初使用(1)

    新建 net core webapi 项目 安装 nuget 包 96 96 96 Install Package Ocelot 96 96 96 配置 添加一个Ocelot json的文件用来添加Ocelot的配置 转发 http loc
  • net core Ocelot 网关 初使用(2)- 搭配 consul 服务使用 Ocelot

    搭配 consul 服务使用 Ocelot xff0c 自动路由配置 新建webapi 项目 xff0c 安装 nuget 包 install package Ocelot install package Ocelot Provider C
  • spring boot web开发(1)构建项目

    spring boot web开发 xff08 1 xff09 构建项目 1 构建项目 去 https start spring io 下载基础项目在pom xml 添加 web 依赖 lt dependency gt lt groupId
  • SpringBoot web开发(2)session登录注册

    SpringBoot web开发 xff08 2 xff09 session登录注册 新建 LoginController java 文件使用 session 控制登录 64 Autowired HttpSession session 添加
  • SpringBoot web开发 (3) 使用 mysql-jpa 登录验证

    3 使用 mysql jpa 构造 数据库实体类型 添加maven依赖 lt dependency gt lt groupId gt org springframework boot lt groupId gt lt artifactId
  • JAVA+Netty根据二级域名实现多租户内网穿透功能【设计实践】

    目录 背景 实践 项目结构 原理分析 代码实现 cc common项目 cc server项目 cc client项目 Nginx配置 使用 启动服务端 启动客户端 背景 上一篇JAVA基于Netty实现内网穿透功能 设计实践 殷长庆的博客
  • C++:stringstream格式化字符串

    C语言通过snprintf对字符串进行格式化 格式化前需要首先对字符串的长度预估 如果长度大于了字符数组的大小 格式化字符串会被截断 C 通过stringstream对字符串进行格式化 include lt sstream gt inclu
  • Ubuntu:apt软件包管理工具

    apt是Advanced Packaging Tool 是Ubuntu的安装包管理工具 主要的几个操作为 1 安装软件包 sudo apt install 软件包名 2 卸载软件包 而保留软件的配置文件 sudo apt remove 软件
  • CMake:message输出消息

    可以在执行cmkae的时候使用message输出信息 xff1a message lt mode gt 34 message text 34 其中mode有如下几个选项 xff08 优先级由低到高 xff09 xff1a TRACE xff
  • C++(11):通过underlying_type获取/输出枚举类的值

    C 11 枚举类 风静如云的博客 CSDN博客 c 11 枚举类 介绍了枚举类使用的好处 不过如果直接输出枚举类的值是不行的 include lt iostream gt using namespace std int main enum
  • gitlab-ce安装

    GitLab是一个利用 Ruby on Rails 开发的开源应用程序 xff0c 实现一个自托管的Git项目仓库 xff0c 可通过Web界面进行访问公开的或者私人项目 GitLab拥有与Github类似的功能 xff0c 能够浏览源代码
  • WSL2安装到其它目录下

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 WSL2是什么 xff1f 二 下载Ubuntu20 041 打开Mocrosoft Store2 导出发行版 总结 前
  • 解决Ubuntu20.04安装CUDA-11.2报256错误的问题

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 报错的原因是什么 xff1f 二 安装cuda 11 2三 安装nvidia driver 455四 再装cuda 11
  • ARM整形算力计算

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 RK3399规格 xff1f 二 开始计算1 参考2 计算 总结 前言 之前做人工智能使用RK3399的CPU去推理 x
  • WSL2使用USB设备

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 WSL2是什么 xff1f 二 编译内核1 查看自己的内核2 准备工作3 下载适合自己的内核版本4 开始编译4 使用内核