使用usbip网络转发usb设备到远程主机
环境:
两台Linux机器
客户机: Linux A
服务机: Linux B
例子为转发服务机 Linux B 的一个usb设备到客户机 Linux A
需要内核支持
安装
客户机和服务机都安装:
# sudo apt install usbip
# sudo apt install usbip
在使用之前
两台机器都加载内核模块
加载内核模块:
# modprobe usbip-core
# modprobe usbip-host
# modprobe usbip-vudc # 服务端非必须
# modprobe vhci-hcd
使用
服务机 Linux B:
# usbipd -D # 让usbipd在后台运行
# usbip list --local # 查看当前可用usb设备
# usbip bind --busid=ID # ID为看到的可用usb的id 比如: 1-1.1
比如我机器Linux B:
# usbipd -D
# usbip list --local # 可以看到我服务机有一个usb网卡和一个u盘
- busid 1-1.1 (0424:ec00)
Standard Microsystems Corp. : SMSC9512/9514 Fast Ethernet Adapter (0424:ec00)
- busid 1-1.2 (058f:6366)
Alcor Micro Corp. : Multi Flash Reader (058f:6366)
# usbip bind --busid=1-1.1 # 我将第一个usb网卡绑定到了程序
客户机 Linux A
# usbip list --remote=服务机ip # 查看服务机的bind绑定列表
# usbip attach --remote=服务机ip --busid=ID # id为查看到的id
在我的客户机 Linux A上:
我要连接服务机B共享出来的usb网卡
# usb list --remote=10.10.10.14 #我服务机ip为10.10.10.14
Exportable USB devices
======================
- 10.10.10.14
1-1.2: Alcor Micro Corp. : Multi Flash Reader (058f:6366)
: /sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2
: (Defined at Interface level) (00/00/00)
1-1.1: Standard Microsystems Corp. : SMSC9512/9514 Fast Ethernet Adapter (0424:ec00)
: /sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1
: Vendor Specific Class / unknown subclass / unknown protocol (ff/00/01)
: 0 - Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)
可以看到 usb网卡的id为 1-1.1
# usb attach --remote=10.10.10.14 --busid=1-1.1
这样客户机的服务机的网卡就映射到客户机的usb上了:
# dmesg
[16136.594990] usb 5-1: new high-speed USB device number 3 using vhci_hcd
[16136.721651] usb 5-1: SetAddress Request (3) to port 0
[16136.750182] usb 5-1: New USB device found, idVendor=0424, idProduct=ec00, bcdDevice= 2.00
[16136.750184] usb 5-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[16136.753349] smsc95xx v1.0.6
[16136.959378] smsc95xx 5-1:1.0 eth0: register 'smsc95xx' at usb-vhci_hcd.0-1, smsc95xx USB 2.0 Ethernet, ba:94:5e:4d:e3:79
用完之后呢?
客户机:
# usbip port # 查看所有连接设备
# usbip detach --port=ID # 卸载设备 id为上方命令看到的id
我的客户机Linux A:
# usbip port
Imported USB devices
====================
Port 00: <Port in Use> at High Speed(480Mbps)
Standard Microsystems Corp. : SMSC9512/9514 Fast Ethernet Adapter (0424:ec00)
5-1 -> usbip://10.10.10.14:3240/1-1.1
-> remote bus/dev 001/003
可以看到usb网卡的端口号为00
# usbip detach --port=00
usbip: info: Port 0 is now detached!
这样客户端就卸载完毕了.
服务端:
# usbip unbind --busid=ID #取消usb设备的bind挂载 id为bind挂载的usb设备id
# ps aux | grep usbipd # 找到进程pid
# kill PID # 杀掉usbipd的进程 PID为上面找到的
我的服务端机 Linux B :
# usbip unbind --busid=1-1.2 # 取消绑定我的usb网卡
usbip: info: unbind device on busid 1-1.1: complete
# ps aux | grep usbipd
root 1046 0.0 0.1 2768 1576 ? Ss 13:38 0:00 usbipd -D
root 1178 0.0 0.0 4372 524 pts/0 S+ 14:12 0:00 grep usbipd
可以看出usbipd 的pid为 1046
# kill 1046
ok 我的 usb网卡回来了
发现个问题:
usbipd 默认监听所有网卡并不能使用身份验证来连接设备
我自己的解决:
服务端监听 127.0.0.1 3240 (3240是默认端口)
客户端ssh转发服务端 127.0.0.1 3240 到 客户端: 127.0.0.1 3240
然后把客服务端ip替换为 127.0.0.1
解决!