概述
USB/IP 是一个开源项目,已合入 Kernel,在 Linux 环境下可以通过使用 USB/IP 远程共享 USB 设备。
USB Client:使用USB的终端,将server共享的usb设备挂载到本地。
USB Server:分享本地的usb设备至远程。
架构原理
主要部分也是两个,读取设备的主机端,设置一个虚拟的主机控制器接口VHCI,它不操纵底层的主机控制器,而是将上层的消息通过网络转发到另一个主机,在另一侧,实现一个USB设备驱动,它不是将USB Core的内容向上传递,同样是通过网络发送出去,叫做Stub端 。
usbip分为两端:server端和client端,它们分别运行在不同的linux主机中,其中运行server端驱动的PC插入usb设备(如U盘等),用于共享。此时client端PC就可以attach到server端,此时client端的主机PC就能看到u盘,它以为真的有一个u盘插入本机,并为其安装驱动,效果跟在本机上直接插入U盘无异,实现了u盘共享,或者USB延长器的功效。
环境搭建与测试验证
环境说明
本地debian
远端centos 云服务器
配置 USB Server
#安装包含USBIP的软件包
sudo apt-get install linux-tools-generic
// 或者
sudo apt-get install usbip
#使用modprobe自动处理可载入模块usbip-core
sudo modprobe usbip-core
#使用modprobe自动处理可载入模块vhci-hcd
sudo modprobe vhci-hcd
#使用modprobe自动处理可载入模块usbip-vudc
sudo modprobe usbip-vudc
#使用modprobe自动处理可载入模块usbip-host
sudo modprobe usbip-host
查看设备
usbip list --local
启动服务
# 记录 busid 的值,并依次执行以下命令,启动监听服务,指定 USB/IP 端口号,共享 USB 设备。
sudo usbipd -D [--tcp-port PORT]
共享设备
# 查看设备的busid
usbip list -l
sudo usbip bind -b [busid]
设备共享成功后就可以在client客户端查看
# 停止共享
usbip unbind -b [busid]
SSH隧道
ssh -Nf -R USB/IP指定端口号:localhost:USB/IP指定端口号 root@your_host
# your_host 表示云服务器的 IP 地址
# 例如,USB/IP 的端口号为3240端口,云服务器的 IP 地址为192.168.15.24,则执行以下命令
ssh -Nf -R 3240:localhost:3240 root@192.168.15.24
配置USB Client
# 安装
yum -y install kmod-usbip usbip-utils
modprobe usbip-core
modprobe vhci-hcd
modprobe usbip-host
# 查询可用设备
usbip list --remote server_ip
sudo usbip list -r [服务端地址]
# attach 远程usb至本地
usbip attach --remote=server_ip --busid=dev_busid
sudo usbip attach -r [服务端地址] -b [busid]
# 查看设备
lsusb
#断开连接
sudo usbip port #查看客户端连接usb设备的端口号
sudo usbip detach -p 00 #断开port端口号为00的的远程USB连接
sudo usbip detach -p 00
usbip: info: Port 0 is now detached!
开源地址:GitHub - usbip/implementations: USB/IP Server/Client/Userspace Implementations