2021年4月10日 星期六

利用『USB/IP』將 USB 裝置『重導』至另一部電腦(2021修訂)

之前為了使用接在遠端電腦的 USB 裝置,整理紀錄下來的〝利用『USB/IP』將 USB 裝置『重導』至另一部電腦〞一文,最近找出來使用,發現內容有些不適用現在的版本,故修訂前文以更新紀錄。

使用 USB/IP 將接在遠端電腦的 USB 裝置透過網路『重導』到另一台電腦,已經不需要經由  RPM Fusion - Free 套件庫安裝了,Fedora 自己的套件庫已經有收錄。
  測試的結論先整理一下,免得有人像筆者一樣,試了半天才發現不合需求,而浪費時間。
  • 目前的版本兩台電腦都需以 root 權限設定,才可順利重導 USB 裝置。
  • 目前的版本只能『一對一重導』,尚不能『一對多分享』。
  • USB 裝置所在電腦或稱為 Server(伺服器),接收重導那台稱為 Client(客戶端)。
  • Client 端電腦若為「圖型化桌面環境」,重導後會『自動掛載』該 USB 裝置。

一、安裝 USB/IP

USB/IP 自 kernel 3.17 後已經加入 Linux 主線,所以沒有安裝 RPM Fusion 套件庫,也可以安裝。安裝前先切換到 Root 權限,命令為:
[root@Celeron-D ~]# dnf install usbip

註一:無論是 USB/IP 的伺服器或客戶端都要安裝這個套件。
註二:安裝的「usbip 套件」只是控制和服務程式,核心模組已經和 Linux 一起安裝了。

二、USB/IP 伺服器的設定

安裝、啟動的步驟很簡單,
[root@Core-i7 ~]# modprobe usbip-core
[root@Core-i7 ~]# modprobe usbip-host
[root@Core-i7 ~]# systemctl start usbip-server.service
前兩個命令是載入 USB/IP 伺服器所需的「核心模組」,第三個命令是啟動 USB/IP 伺服器。若有開啟「防火牆」,記得要打個洞 TCP/3240,詳細步驟請參考前文〝Fedora 18 的「防火牆」設定(一):開「通訊埠」〞。
  先用命令查詢一下在伺服器上,有哪些 USB 裝置可以被『重導』,
[root@Core-i7 ~]# usbip list --local
 - busid 1-1.1 (0cf3:3005)
   Atheros Communications, Inc. : AR3011 Bluetooth (0cf3:3005)

 - busid 1-1.2 (058f:a014)
   Alcor Micro Corp. : Asus Integrated Webcam (058f:a014)

 - busid 1-6 (0403:6001)
   Future Technology Devices International, Ltd : FT232 Serial (UART) IC (0403:6001)
假設欲將『FT232 Serial (UART) IC』重導至客戶端,記住它的 BUS ID,上例中為 1-6。
  再將查詢所得的 BUS ID 告知 USB/IP 伺服器程式。
[root@Core-i7 ~]# usbip bind --busid=1-6
usbip: info: bind device on busid 1-6: complete
最後出現『 complete 』表示重導功能已設定成功。

:完成 USB/IP 伺服器的設定後,若這個裝置(如:隨身碟)有掛載在這部電腦,將被『卸載』。

三、USB/IP 客戶端的設定

記得也要安裝 USB/IP,參考『一、安裝 USB/IP』的步驟。客戶端也要加載「核心模組」,命令如下:
[root@Celeron-D ~]# modprobe usbip-core
[root@Celeron-D ~]# modprobe vhci-hcd
[root@Celeron-D ~]# systemctl start usbip-client.service
接著,可以開始進行『接收重導』的操作。
  進行前,先查詢一下目前的 USB 裝置列表,
[root@Celeron-D ~]# lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 007: ID 0b05:1869 ASUSTek Computer, Inc. ITE Device(8910)
Bus 001 Device 006: ID 13d3:5666 IMC Networks USB2.0 HD UVC WebCam
  ‧ ‧ ‧ ‧ ‧
由查詢結果可以看到,這些 USB 裝置都是客戶端電腦的 USB 裝置。
  用另一個命令確認一下,查詢目前被重導的 USB 裝置的接收情形,
[root@Celeron-D ~]# usbip port
Imported USB devices
====================
可以看到查詢結果,沒有接收到任何被重導的 USB 裝置。
  在進行連線、綁定前,先看看被伺服器重導出來的 USB 裝置有哪些?
[root@Celeron-D ~]# usbip list --remote=192.168.10.17
Exportable USB devices
======================
 - 192.168.10.17
      1-6: Future Technology Devices International, Ltd : FT232 Serial (UART) IC (0403:6001)
         : /sys/devices/pci0000:00/0000:00:14.0/usb1/1-6
         : (Defined at Interface level) (00/00/00)
         :  0 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)
上例中,伺服器的網路位址(IP)為 192.168.10.17,埠號(Port),確定是要連接、綁定的 USB 裝置,就可繼續進行下面的操作。
  將已被伺服器重導的 USB 裝置,與客戶端的 USB/IP 模組連結(即:連結、綁定『被重導』的 USB 裝置)。
[root@Celeron-D ~]# usbip attach --remote=192.168.10.17 --busid=1-6
上例中,「192.168.10.17」是伺服器的網路位址,「1-6」是被伺服器所重導的 USB 裝置的 BUS ID。
  查詢並確認在客戶端的 USB 裝置,
[root@Celeron-D ~]# usbip list --local
Local USB devices
=================
 - busid 2-1 (03ee:641f)
   Mitsumi : WIF-0402C Bluetooth Adapter (03ee:641f)
         2-1:1.0 -> btusb
         2-1:1.1 -> btusb

 - busid 3-1 (0458:0003)
   KYE Systems Corp. (Mouse Systems) : Genius NetScroll+ (0458:0003)
         3-1:1.0 -> usbhid

 - busid 5-1 (058f:6387)
   Alcor Micro Corp. : Flash Drive (058f:6387)
         5-1:1.0 -> usb-storage
咦!怎麼沒有,原來用這個命令只能查客戶端本機的 USB 裝置。要查詢由遠端電腦導到客戶端,且已經連接、綁定的 USB 裝置,要用另一個方式查詢:
[root@Celeron-D ~]# lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 007: ID 0b05:1869 ASUSTek Computer, Inc. ITE Device(8910)
Bus 001 Device 006: ID 13d3:5666 IMC Networks USB2.0 HD UVC WebCam
‧ ‧ ‧ ‧ ‧
可以看到被重導的裝置『FT232 Serial (UART) IC』,已經列出來了(第二項)。而 BUS ID 也被改成客戶端的編號,上例中為「Bus 003 Device 002」。
  用另一個命令再確認一次,查詢目前被重導的 USB 裝置的接收情形,
[root@Celeron-D ~]# usbip port
Imported USB devices
====================
Port 00: <Port in Use> at Full Speed(12Mbps)
       Future Technology Devices International, Ltd : FT232 Serial (UART) IC (0403:6001)
       3-1 -> usbip://192.168.10.17:3240/1-6
           -> remote bus/dev 001/003
由查詢結果可以看,被伺服器所重導的 USB 裝置,已經被客戶端所接收了。上例中的結果顯示出重導的 USB 裝置的各項參數,其中「Port 00」是該 USB 裝置在 USB/IP 核心模組中的埠號,等一下將 USB 裝置缷載、歸建時需要用它。

四、客戶端缷載 USB/IP 重導之裝置

  最後,當不再使用這個 USB 裝置時,要將它缷載、歸建,將使用權交還 USB/IP 伺服器。
[root@Celeron-D ~]# usbip detach --port=0
上例中,「0」是命令「usbip port」查詢結果中,該 USB 裝置在 USB/IP 核心模組中的埠號。

:完成重導 USB 裝置的缷載操作後,若這個設備(如:隨身碟)有掛載在客戶端電腦,將被『卸載』。

五、客戶端的『一般使用者』的權限設定

USB/IP 重導後的遠端 USB 裝置,若有要給客戶端的『一般使用者』使用(如:本上述例子中的『FT232 Serial (UART) IC』裝置),要根據裝置類型另外設定。以本例的 UART 裝置而言,設定的命令為:
[root@Celeron-D ~]# grep dialout /etc/group
dialout:x:18:
[root@Celeron-D ~]# usermod testuser-a -G dialout
[root@Celeron-D ~]# grep dialout /etc/group
dialout:x:18:testuser

已測試版本:

  • Fedora: 33

參考資料:

2 則留言:

  1. 請問前篇"不符合原先的需求"指的是哪部分? 看起來USB重導的基本功能應該還是有的

    回覆刪除
    回覆
    1. 新版本的 USBIP 以伺服器方式接受連接,使用上更方便。

      刪除

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)