USB/IP
USB-IP 是一个将通用的USB设备通过IP网络进行共享的系统。为了在计算机之间共享具有全部功能的USB设备,USB-IP将“USB I/O消息”封装到 TCP/IP 中,并在计算机之间传输,以实现远程共享或访问USB设备。
安装[编辑 | 编辑源代码]
使用[编辑 | 编辑源代码]
服务端配置[编辑 | 编辑源代码]
服务端为提供USB设备映射端,所以请确保已连接上物理USB设备,并且加载 usbip_host
USB-IP内核模块,下面命令为加载模块:
# modprobe usbip_host
然后使用systemctl来启用 usbipd.service
服务,服务默认监听TCP 3240端口。
# 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
--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)
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/product
ID按照下面格式编写配置文件,并存放在/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/product
ID按照下面格式编写配置文件,并存放在/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