2014年10月26日 星期日

利用『USB/IP』將 USB 裝置『重導』至另一部電腦


因為有某些需求,要將 USB 裝置透過網路『重導』到另一台電腦,就上網找了一下適當的工具套件。找到一個收錄在 RPM Fusion - Free 的開源碼套件 USB/IP,就來試試看這個套件是否合適。測試的結果雖然不符合原先的需求,不過,將來也許會用到,先將過程記錄下來。
  測試的結論先整理一下,免得有人像筆者一樣,試了半天才發現不合需求,而浪費時間。
  • 目前的版本兩台電腦都需以 root 權限設定,才可順利重導 USB 裝置。
  • 目前的版本只能『一對一重導』,尚不能『一對多分享』。
  • USB 裝置所在電腦或稱為 Server(伺服器),接收重導那台稱為 Client(客戶端)。
  • Client 端電腦若為「圖型化桌面環境」,重導後會『自動掛載』該 USB 裝置。

一、安裝 RPM Fusion 套件資料庫

這個 USB/IP 套件是收錄在 RPM Fusion - Free 這個套件資料庫,要先安裝它才可以繼續下面的步驟。詳細說明請參閱前文〝Fedora 一定要加裝的套件資料庫 – RPM Fusion〞,不在此贅述。

二、安裝 USB/IP 及相關套件

無論是 USB/IP 的伺服器或客戶端都要安裝這些套件,安裝前先切換到 Root 權限,命令為:
[root@Celeron-D ~]# yum install usbip kmod-staging
另外,會再加裝幾個關聯套件:staging-kmod-addons 和 kmod-staging-xxxx。其中,xxxx 為 Linux 核心的版本。

三、USB/IP 伺服器的設定

安裝、啟動的步驟很簡單,
[root@Core-i7 ~]# modprobe usbip-core
[root@Core-i7 ~]# modprobe usbip-host
[root@Core-i7 ~]# usbipd -4 -D
前兩個命令是載入 USB/IP 伺服器所需的「核心模組」,第三個命令是啟動 USB/IP 伺服器,其中的參數為:限制使用 IPv4 及背景執行。若有開啟「防火牆」,記得要打個洞 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 2-1.2 (058f:6387)
   Alcor Micro Corp. : Flash Drive (058f:6387)
假設欲設將『隨身碟(Flash Drive)』重導至客戶端,記住它的 BUS ID,上例中為 2-1.2。
  再將查詢所得的 BUS ID 告知 USB/IP 伺服器程式。
[root@Core-i7 ~]# usbip bind --busid=2-1.2
usbip: info: bind device on busid 2-1.2: complete
最後出現『 complete 』表示重導功能已設定成功。

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

四、USB/IP 客戶端的設定

USB/IP 客戶端也要加載「核心模組」,命令如下:
[root@Celeron-D ~]# modprobe usbip-core
[root@Celeron-D ~]# modprobe vhci-hcd.ko
接著,可以開始進行『接收重導』的操作。
  進行前,先查詢一下目前的 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
由查詢結果可以看到,這些 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
      2-1.2: Alcor Micro Corp. : Flash Drive (058f:6387)
           : /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
           : (Defined at Interface level) (00/00/00)
上例中,伺服器的網路位址(IP)為 192.168.10.17。確定是要接收的 USB 裝置,就可繼續進行下面的操作。
  接著,將被伺服器重導的 USB 裝置,與客戶端的 USB/IP 模組連結(即:接收『被重導』的 USB 裝置)。
[root@Celeron-D ~]# usbip attach --remote=192.168.10.17 --busid=2-1.2
上例中,「192.168.10.17」是伺服器的網路位址,「2-1.2」是被伺服器所重導的 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
可以看到被重導的裝置,已經列出來了(最後一項)。而 BUS ID 也被改成客戶端的編號,上例中為「5-1」。
  用另一個命令再確認一次,查詢目前被重導的 USB 裝置的接收情形,
[root@Celeron-D ~]# usbip port
Imported USB devices
====================
Port 00: <Port in Use> at High Speed(480Mbps)
       unknown vendor : unknown product (058f:6387)
       5-1 -> usbip://192.168.10.17:3240/2-1.2
           -> remote bus/dev 002/004
由查詢結果可以看,被伺服器所重導的 USB 裝置,已經被客戶端所接收了。上例中的結果顯示出重導的 USB 裝置的各項參數,其中「Port 00」是該 USB 裝置在 USB/IP 核心模組中的埠號,等一下將 USB 裝置歸建時需要用它。
  最後,當不再使用這個 USB 裝置時,要將它歸建,將使用權交還 USB/IP 伺服器。
[root@Celeron-D ~]# usbip detach --port=0
上例中,「0」是命令「usbip port」查詢結果中,該 USB 裝置在 USB/IP 核心模組中的埠號。

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

已測試版本:

  • Fedora: 19, 20

參考資料:

沒有留言:

張貼留言

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