跳转至内容

USB/IP

来自 ArchWiki

来自 USB/IP 网站

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

安装

安装 usbip 包。

用法

服务器设置

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

列出已连接的设备

$ usbip list -l

绑定所需设备。例如,共享总线 ID 为 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

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

客户端设置

确保 vhci_hcd 内核模块已加载。

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

$ usbip list -r server_IP_address

挂接所需设备。例如,挂接总线 ID 为 1-1.5 的设备

$ usbip attach -r server_IP_address -b 1-1.5
提示 要连接到备用 TCP 端口,请使用 --tcp-port 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 提供了用于按厂商/设备 ID 绑定的 systemd 服务文件,以及用于按主机名和厂商/设备 ID 连接的服务文件。

服务器设置

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

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

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

客户端设置

对于每个主机/设备,在 /etc/usbip/remote-devices/ 中创建一个 device.conf 文件,并将 HOSTUSBIP_DEVICE 设置为厂商/产品 ID,例如

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

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

参见