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
新增話題