USB/IP - Arch Linux 中文维基

跳转到内容

# USB/IP

来自 Arch Linux 中文维基
翻译状态：

- 本文（或部分内容）译自 USB/IP，最近一次同步于 2023-11-25，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

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 enable --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/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

## 参见

- USB-IP项目官方网站
- Linux Kernel中 "usbip-utils自述"
- "如何使用USB/IP"
- "Windows版本的USB/IP"
- usbip(8)
- usbipd(8)

分类：​

- 存储
- 网络

USB/IP
添加话题