tian051011的博客 - 2024年8月
type: channel
link: https://tian051011.me/2024/08/
items: 使用 USB IP 将 Windows 下的 USB 设备转发至远端 Linux 设备

使用 USB IP 将 Windows 下的 USB 设备转发至远端 Linux 设备
type: item
date: 2024-08-22T09:51:00+08:00
description: 前言项目需要在 Linux 私有云虚拟机上开发，但因为是嵌入式项目，涉及到烧录固件之类的操作，之前都是在 Linux 系统上编译好固件，之后用 WinSCP 下载到作为终端的 Windows 笔记本上，把开发板或者模组接在在笔记本上用 J-Flash 烧录，比较麻烦。如果是在本机开发，可以直接用 VSCode 开发环境一键烧录，调试也会方便点。开发板与模组都通过 J-Link 接 USB 与电脑通讯，于是就在想能不能将其转发到 Linux 开发机。之前摸索了一段时间，研究出了下面这个可行的方案。首先，从原理上讲，这个方案用的就是USB/IP。关于 USB/IP 技术就不做过多介绍了，一言以盖之就是将 USB 协议数据通过 IP 网络传输，感兴趣的话可以看下项目主页。Windows 笔记本端我在 Windows 上找到了两个可用的USBIP实现，usbip-win 和 usbipd-win。前者有客户端与服务端，但已经不再维护，且需要打开 Windows 的测试模式用于安装相关驱动，有一定风险，不过很多能在网上找到的老文章还在推荐它。我尝试了其服务端实现，但未能成功。后者仅有服务端，但是是微软官方文档推荐的将 Windows 上的 USB 设备转发至 WSL 的实现，且在持续更新，不过只支持 Windows 10 及以上系统版本。目前我们的需求只需要 Windows 笔记本端作为服务端，也就是向外提供 USB 设备的，最后我也选择了usbipd-win。我的笔记本上的操作系统为 Windows 11 23H2。首先前往项目官方仓库Release页面下载最新版本的 msi 安装包，并安装到 Windows 电脑上，有可能需要重启。安装完成后，启动一个管理员权限的终端（CMD 或者 Powershell 都行），确定服务已启动：sc.exe query usbipd如果安装正常的话，STATE 应该是 RUNNING。接下来将想转发的设备插入 Windows 设备的USB接口，有几个就接几个，用usbipd list命令列出所有设备。下面是我在电脑上接入JLink-OB与USB转串口设备后该命令的输出。PS C:\Users\tian051011> usbipd list Connected: BUSID VID:PID DEVICE STATE 2-1 10c4:ea60 Silicon Labs CP210x USB to UART Bridge (COM7) Not shared 2-2 1366:0105 JLink CDC UART Port (COM8), J-Link driver Not shared 2-3 1532:009a USB 输入设备, Razer Pro Click Mini Not shared 2-6 30c9:0057 Integrated Camera, Integrated IR Camera, APP Mode Not shared 2-10 8087:0026 英特尔(R) 无线 Bluetooth(R) Not shared接下来使用usbipd bind命令设置你想要转发的设备，你需要用到上面这个列表里的 BUSID：PS C:\Users\tian051011> usbipd bind --busid 2-1 PS C:\Users\tian051011> usbipd bind --busid 2-2如果转发被正常设置了，命令执行之后你应该不会看到任何输出。这时候再次执行usbipd list命令，可以看到设备的状态已经变成了 Shared：PS C:\Users\tian051011> usbipd list Connected: BUSID VID:PID DEVICE STATE 2-1 10c4:ea60 Silicon Labs CP210x USB to UART Bridge (COM7) Shared 2-2 1366:0105 JLink CDC UART Port (COM8), J-Link driver Shared 2-3 1532:009a USB 输入设备, Razer Pro Click Mini Not shared 2-6 30c9:0057 Integrated Camera, Integrated IR Camera, APP Mode Not shared 2-10 8087:0026 英特尔(R) 无线 Bluetooth(R) Not shared对特定设备的转发只需要设置一次，之后只要此设备连入，即可被转发。注意虽然我们设置转发时使用的参数是 busid，但并不是之后接入这个bus的设备就会被转发，程序不过是采用这个数据读取 VID …