USB/IP

来自 Arch Linux 中文维基

USB-IP 是一个将通用的USB设备通过IP网络进行共享的系统。为了在计算机之间共享具有全部功能的USB设备,USB-IP将“USB I/O消息”封装到 TCP/IP 中,并在计算机之间传输,以实现远程共享或访问USB设备。

安装[编辑 | 编辑源代码]

安装 usbip 包。

使用[编辑 | 编辑源代码]

服务端配置[编辑 | 编辑源代码]

服务端为提供USB设备映射端,所以请确保已连接上物理USB设备,并且加载 usbip_host USB-IP内核模块,下面命令为加载模块:

# modprobe usbip_host

然后使用systemctl来启用 usbipd.service 服务,服务默认监听TCP 3240端口。

注意: 默认情况下,USB-IP 需要监听端口 3240。如果防火墙正在运行,请确保允许这个端口访问。有关配置防火墙的详细说明,请转到 Category:防火墙
# systemctl enble --now usbipd.service

查看当前主机已连接的USB设备总线ID(busid):

$ usbip list -l

下面命令将USB设备 busid 为 1-1.5 绑定到服务中:

注意: 系统在休眠后需要重新进行绑定。
# usbip bind --busid=1-1.5

解除绑定:

# usbip unbind --busid=1-1.5

解除绑定后,客户端将无法访问改USB设备

使用systemd进行绑定[编辑 | 编辑源代码]

如果想让系统开机后自动挂载,可以使用systemd模块单元文件,添加下面配置文件到系统中:

/etc/systemd/system/usbip-bind@.service
[Unit]
Description=USB-IP Binding on bus id %I
After=network-online.target usbipd.service
Wants=network-online.target
Requires=usbipd.service
#DefaultInstance=1-1.5

[Service]
Type=simple
ExecStart=/usr/bin/usbip bind --busid=%i
RemainAfterExit=yes
ExecStop=/usr/bin/usbip unbind --busid=%i  
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后启用配置,如想将USB设备busid为1-1.5 自动绑定到服务中,只需使用systemclt命令启动/启用 usbip-bind@1-1.service

# systemctl enable --now usbip-bind@1-1.5.service

客户端配置[编辑 | 编辑源代码]

客户端为加载远程USB设备端,需要加载 vhci-hcd 内核模块命令如下:

# modprobe vhci-hcd

查看远程服务端可用的USB设备,如果一切顺利将列出远程服务已绑定服务的所有USB设备:

$ usbip list --remote=服务端IP

记录下需要连接USB设备,例如连接到busid为 1-1.5 的USB设备:

$ usbip attach --remote=服务端IP -b 1-1.5
提示:如果服务器监听的不是默认端口:3240,可使用参数指定端口 --tcp-port 端口号.

取消绑定设备[编辑 | 编辑源代码]

只有在客户端上断开设备后才能取消绑定

在客户端上查看已映射的USB端口:

$ usbip port

在客户端上断开某个已连接的USB端口:

$ usbip detach --port=端口号

在服务端上取消绑定USB设备r:

$ usbip unbind --busid=busid


提示和技巧[编辑 | 编辑源代码]

通过厂商/设备ID进行绑定[编辑 | 编辑源代码]

如果总线ID(busid)在每次系统重启后都不一样,则可以使用 厂商/设备ID 进行绑定,在服务端将下面配置文件配置保存到系统中:

/etc/systemd/system/usbip-bind@.service
[Unit]
Description=USB-IP Binding device id %I
After=network-online.target usbipd.service
Wants=network-online.target
Requires=usbipd.service

[Service]
Type=simple
ExecStart=/bin/sh -c "/usr/sbin/usbip bind --$(/usr/sbin/usbip list -p -l | grep '#usbid=%i#' | cut '-d#' -f1)"
RemainAfterExit=yes
ExecStop=/bin/sh -c "/usr/sbin/usbip unbind --$(/usr/sbin/usbip list -p -l | grep '#usbid=%i#' | cut '-d#' -f1)"
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

下面示例是将配置是将厂商/设备ID为 0924:3d68 设置开机自动绑定,

# systemctl start --now usbip-bind@0924:3d68.service
注意: 如果系统上存在多个同一个厂商同类型设备,即多个 vendor:product ID 重复的设备将无法正常工作。

在客户端的配置如下所示:

  • Linux客户端
$ usbip attach -r 服务端IP --$(usbip list -p -r 服务端IP | grep '#usbid=0924:3d68#' | cut -d# -f1)
注意: 如果上面命令执行失败, 使用 -p 参数测试是否正常,如: usbip list -p -r 服务端IP,如果不正常请改用下面命令:
$ usbip attach -r 服务端IP -b $(usbip list -p -r 服务端IP | grep '0924:3d68' | cut '-d:' -f1 | awk '{print $1}')
  • Windows客户端
c:\> for /f "tokens=1 delims=:, " %a in ('usbip list -r 服务端IP ^| findstr /r /c:"0924:3d68"') do start usbip attach -r 服务端IP -b %a

将配置存放至 /etc/..[编辑 | 编辑源代码]

usbip-systemdAUR 提供 systemd 服务文件,用于按供应商/设备 ID 进行绑定,以及按主机名和供应商/设备 ID 进行连接。

服务端配置[编辑 | 编辑源代码]

将USB设备的vendor/productID按照下面格式编写配置文件,并存放在/etc/usbip/bind-devices/ 目录下面。

/etc/usbip/bind-devices/example-device.conf
USBIP_DEVICE=0924:3d68

之后使用下命令启用服务:

# systemctl enable --now usbip-bind@example-device.service

客户端配置[编辑 | 编辑源代码]

将服务端USB设备的vendor/productID按照下面格式编写配置文件,并存放在/etc/usbip/remote-devices/ 目录下面。

/etc/usbip/remote-devices/example-device.conf
USBIP_HOST=example-host
USBIP_DEVICE=0924:3d68

确保服务端守护进程正在运行并且配置的设备已绑定, 然后下面命令启用服务:

# systemctl enable --now usbip@example-device.service

参见[编辑 | 编辑源代码]