WSL2使用USB设备

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

文章目录

  • 前言
  • 一、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里面找。
WSL2使用USB设备_第1张图片

WSL2使用USB设备_第2张图片

画红框的是我的分支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

注意是你的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
WSL2使用USB设备_第3张图片
上面就是列出来的所有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

你可能感兴趣的:(Arm,linux,ubuntu,linux,ubuntu,bash,运维,服务器)