USBIP
USB/IP 是一个开源项目,已合入 Kernel,在 Linux 环境下可以通过使用 USB/IP 远程共享 USB 设备。
USB Client:使用USB的终端,将server共享的usb设备挂载到本地。
USB Server:分享本地的usb设备至远程。
USBIP的架构
主要部分也是两个,读取设备的主机端,设置一个虚拟的主机控制器接口VHCI,它不操纵底层的主机控制器,而是将上层的消息通过网络转发到另一个主机,在另一侧,实现一个USB设备驱动,它不是将USB Core的内容向上传递,同样是通过网络发送出去,叫做Stub端。
usbip分为两端:server端和client端,它们分别运行在不同的linux主机中,其中运行server端驱动的PC插入usb设备(如U盘等),用于共享。此时client端PC就可以attach到server端,此时client端的主机PC就能看到u盘,它以为真的有一个u盘插入本机,并为其安装驱动,效果跟在本机上直接插入U盘无异,实现了u盘共享,或者USB延长器的功效。
Linux 环境配置
配置 USB Server
加载驱动
-
Ubuntu
-
sudo apt-get install linux-tools-generic #安装包含USBIP的软件包 // 或者 sudo apt-get install usbip sudo modprobe usbip-core #使用modprobe自动处理可载入模块usbip-core sudo modprobe vhci-hcd #使用modprobe自动处理可载入模块vhci-hcd sudo modprobe usbip-vudc #使用modprobe自动处理可载入模块usbip-vudc sudo modprobe usbip-host #使用modprobe自动处理可载入模块usbip-host
-
-
centos
-
sudo apt-get install usbip sudo modprobe usbip-core sudo modprobe vhci-hcd sudo modprobe usbip_host
-
查看设备
插入 USB 设备,并执行以下命令,查询可用的 USB 设备。
usbip list --local
启动服务
记录 busid 的值,并依次执行以下命令,启动监听服务,指定 USB/IP 端口号,共享 USB 设备。
sudo usbipd -D [--tcp-port PORT]
共享设备
首先查看设备:
usbip list -l
- busid 4-1 (0627:0001)
Adomax Technology Co., Ltd : unknown product (0627:0001)
- busid 1-4.1 (0951:1666)
Kingston Technology : DataTraveler 100 G3/G4/SE9 G2 (0951:1666)
找到自己要分享设备的busid,之后执行
sudo usbip bind -b [busid]
sudo usbip bind -b 1-4.1
请输入密码:
验证成功
usbip: info: bind device on busid 1-4.1: complete
此时设备共享成功,可以在Client端查看Server共享的usb设备列表。
停止共享
找到你要停止共享的usb设备的busid,之后执行:
usbip unbind -b [busid]
sudo usbip unbind -b 1-4.1
usbip: info: unbind device on busid 1-4.1: complete
此时设备停止共享。
配置USB Client
加载驱动
-
ubuntu
-
sudo modprobe usbip-core #使用modprobe自动处理可载入模块usbip-core sudo modprobe vhci-hcd #使用modprobe自动处理可载入模块vhci-hcd sudo modprobe usbip-vudc #使用modprobe自动处理可载入模块usbip-vudc sudo modprobe usbip-host #使用modprobe自动处理可载入模块usbip-host
-
-
centos
-
yum -y install kmod-usbip usbip-utils modprobe usbip-core modprobe vhci-hcd modprobe usbip-host
-
查询可用设备
执行以下命令,查询云服务器可用的 USB 设备。
usbip list --remote server_ip
sudo usbip list -r 172.17.84.72
Exportable USB devices
======================
- 172.17.84.72
1-4.1: Kingston Technology : DataTraveler 100 G3/G4/SE9 G2 (0951:1666)
: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/0000:02:0b.7/usb1/1-4/1-4.1
: (Defined at Interface level) (00/00/00)
attach 远程usb至本地
执行以下命令,将 USB 设备绑定至本地中。
usbip attach --remote=server_ip --busid=dev_busid
sudo usbip attach -r 172.17.84.72 -b 1-4.1
执行以下命令,查看当前 USB 设备列表。
lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 008: ID 0951:1666 Kingston Technology DataTraveler 100 G3/G4/SE9 G2
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
断开连接
首先查看连接共享的端口号:
sudo usbip port #查看客户端连接usb设备的端口号
usbip port
Imported USB devices
====================
libusbip: error: fopen
libusbip: error: read_record
Port 00: <Port in Use> at High Speed(480Mbps)
Kingston Technology : DataTraveler 100 G3/G4/SE9 G2 (0951:1666)
3-1 -> unknown host, remote port and remote busid
-> remote bus/dev 001/006
之后,断开对应端口号的连接
sudo usbip detach -p 00 #断开port端口号为00的的远程USB连接
sudo usbip detach -p 00
usbip: info: Port 0 is now detached!
现在设备从本地断开了。
Windows环境配置
Windows端环境配置和Linux端大同小异,可以参考usbip-win项目:https://github.com/cezanne/usbip-win
参考
Linux 系统使用 USB/IP 远程共享 USB 设备
ubuntu20.04版USBIP2.0服务器端及客户端安装与使用命令
Tutorial – USB/IP
USB/IP
https://www.kernel.org/doc/html/latest/usb/usbip_protocol.html