通过网络转发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

解决!

1 个赞

debian parrot 默认内核有编译所有要用到的模块

1 个赞

Niu :+1::+1::+1:


服务器资源由ZeptoVM赞助

Partners Wiki Discord