USB/IP

出自 Arch Linux 中文维基

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 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
提示:如果服務器監聽的不是默認端口: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/productID按照下面格式編寫配置文件,並存放在/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/productID按照下面格式編寫配置文件,並存放在/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

參見[編輯 | 編輯原始碼]