USB/IP

来自 ArchWiki

来自 USB/IP 网站

USB/IP 项目旨在开发一个通用的 USB 设备通过 IP 网络共享系统。为了在计算机之间共享 USB 设备的全部功能,USB/IP 将 “USB I/O 消息” 封装到 TCP/IP 负载中,并在计算机之间传输。

安装

安装 usbip 软件包。

用法

服务器设置

服务器应连接物理 USB 设备,并加载 usbip_host USB/IP 内核模块。然后 启动启用 USB/IP systemd 服务 usbipd.service。守护进程将在 TCP 端口 3240 上接受连接。

列出已连接的设备

$ usbip list -l

绑定所需的设备。例如,要共享 busid 为 1-1.5 的设备

注意: 设备需要在挂起后重新绑定。
# usbip bind -b 1-1.5

要解绑设备

# usbip unbind -b 1-1.5

绑定后,可以从客户端访问该设备。

绑定到 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 -b %i
RemainAfterExit=yes
ExecStop=/usr/bin/usbip unbind -b %i  
Restart=on-failure

[Install]
WantedBy=multi-user.target

因此,例如,要共享 busid 为 1-1 的设备,应该 启动/启用 usbip-bind@1-1.service

客户端设置

确保 vhci-hcd 内核模块 已加载。

然后列出服务器上可用的设备

$ usbip list -r server_IP_address

连接所需的设备。例如,要连接 busid 为 1-1.5 的设备

$ usbip attach -r server_IP_address -b 1-1.5
提示: 要连接到备用 TCP 端口,请使用 --tcp-port 端口号

断开设备连接

只有在客户端分离设备后才能断开设备连接。

列出已连接的设备

$ usbip port

分离设备

$ usbip detach -p port_number

在服务器上解绑设备

$ usbip unbind -b busid
注意: 默认情况下,USB/IP 需要打开端口 3240。如果防火墙正在运行,请确保此端口已打开。有关配置防火墙的详细说明,请转到 Category:Firewalls

技巧与提示

通过供应商/设备 ID 绑定

如果总线 ID 不一致且在每次系统启动时动态分配,则可以替代地使用通过供应商/设备 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 的设备,应该 启动/启用 usbip-bind@0924:3d68.service

注意: 这种绑定方法对于具有相同供应商/设备 ID 的多个设备无法正常工作。

然后客户端设置将如下所示

  • Linux 客户端
$ usbip attach -r server_IP_address --$(/usr/sbin/usbip list -p -r server_IP_address | grep '#usbid=0924:3d68#' | cut '-d#' -f1)
注意: 如果之前的命令失败,请检查 usbip list -p -r server_IP_address 中的 -p 标志是否正常工作。如果不是,请改用以下行
$ usbip attach -r server_IP_address -b $(/usr/sbin/usbip list -p -r server_IP_address | grep '0924:3d68' | cut '-d:' -f1 | awk '{print $1}')
  • Windows 客户端
c:\> for /f "tokens=1 delims=:, " %a in ('usbip list -r server_IP_address ^| findstr /r /c:"0924:3d68"') do start usbip attach -r server_IP_address -b %a

共享通过 /etc/.. 中的文件配置的设备

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

服务器设置

对于每个设备,在 /etc/usbip/bind-devices/ 中创建一个 device.conf,并将 USBIP_DEVICE 设置为供应商/产品 ID,例如

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

要绑定配置的设备启动/启用 服务 usbip-bind@example-device.service

客户端设置

对于每个主机/设备,在 /etc/usbip/remote-devices/ 中创建一个 device.conf,并将 HOST 设置为主机名,USBIP_DEVICE 设置为供应商/产品 ID,例如

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

确保您的服务器正在运行并且配置的设备已绑定,然后 启动停止 服务 usbip@example-device.service

参见