概述
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-coresudo modprobe usbip-core #使用modprobe自动处理可载入模块vhci-hcdsudo modprobe vhci-hcd #使用modprobe自动处理可载入模块usbip-vudcsudo modprobe usbip-vudc #使用modprobe自动处理可载入模块usbip-hostsudo modprobe usbip-host
查看设备
usbip list --local
启动服务
# 记录 busid 的值,并依次执行以下命令,启动监听服务,指定 USB/IP 端口号,共享 USB 设备。sudo usbipd -D [--tcp-port PORT]
共享设备
# 查看设备的busidusbip list -lsudo 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_ipsudo usbip list -r [服务端地址]# attach 远程usb至本地usbip attach --remote=server_ip --busid=dev_busidsudo 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