馴服 USB/IP

通過本地網絡將 USB 設備連接到遠程 PC 的任務經常出現。 切下,列出了我在這個方向上的搜索歷史,以及基於開源項目的現成解決方案的路徑 優盤/網絡 描述了不同的人在這條道路上精心設置的障礙,以及繞過這些障礙的方法。

第一節,歷史

如果機器是虛擬的——這一切都很容易。 從主機到虛擬機的 USB 轉發功能出現在 VMWare 4.1 中。 但就我而言,安全密鑰(可識別為 WIBU-KEY)必須在不同時間連接到不同的機器,而不僅僅是虛擬機器。
在遙遠的 2009 年的第一輪搜索讓我找到了一塊鐵,叫做 趨勢網 TU2-NU4
優點:

  • 有時它甚至有效

缺點:

  • 並不總是有效。 假設Guardant Stealth II保護鎖沒有通過它啟動,提示“device cannot be started”。
  • 管理軟件(讀取 - 安裝和卸載 USB 設備)非常可悲。 命令行開關,自動化 - 沒有,沒聽說過。 一切都是手工完成的。 惡夢。
  • 控制軟件通過廣播在網絡中搜索鐵片本身,因此只能在一個廣播網段內工作。 您不能手動指定這塊鐵的 IP 地址。 其他子網中的一塊鐵? 那你就有問題了。
  • 開發人員在設備上得分,發送錯誤報告是沒有用的。

第二輪發生在不遠的時間,把我帶到了這篇文章的主題—— USB/IP項目. 以開放的態度吸引人,尤其是自從 ReactOS的 他們為 Windows 簽署了一個驅動程序,所以現在一切都可以在 x64 上運行,沒有任何像測試模式這樣的拐杖。 為此非常感謝 ReactOS 團隊! 一切聽起來都很美好,讓我們試著感受一下,真的是這樣嗎? 不幸的是,該項目本身也被放棄了,你不能指望得到支持——但我們的項目沒有消失,源就在那裡,我們會解決的!

第二部分,server-linux

通過網絡共享 USB 設備的 USB/IP 服務器只能在基於 Linux 的操作系統上設置。 好吧,Linux就是Linux,所以在Debian 8虛擬機上以最低配置安裝,標準手部動作:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

安頓下來。 此外,互聯網建議您需要下載 usbip 模塊,但是 - 你好,第一個耙子。 沒有這樣的模塊。 這一切都是因為網絡上的大多數手冊都引用了較舊的分支 0.1.x,而在最新的 0.2.0 中,usbip 模塊具有不同的名稱。

這就是為什麼:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

好吧,讓我們將以下行添加到 /etc/modules 以在系統啟動時自動加載它們:

usbip-core
usbip-host
vhci-hcd

讓我們啟動usbip服務器:

sudo usbipd -D

此外,普遍的想法告訴我們,usbip 帶有允許我們管理服務器的腳本 - 顯示它將通過網絡共享的設備、查看狀態等。 這裡還有另一個園林工具在等著我們——0.2.x 分支中的這些腳本再次被重命名。 您可以使用以下命令獲取命令列表

sudo usbip

閱讀命令的描述後,很明顯,為了共享所需的 USB 設備,usbip 想要知道它的總線 ID。 親愛的觀眾,第三個佣金在競技場上:給我們的巴士 ID 的lsusb (這似乎是最明顯的方式)——它不適合她! 事實上,usbip 會忽略 USB 集線器等硬件。 因此,我們將使用內置命令:

user@usb-server:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

注意:在後面的列表中,我將使用我的特定 USB 密鑰的示例來描述所有內容。 您的硬件名稱和 VID:PID 對可能會有所不同。 我的叫 Wibu-Systems AG:BOX/U,VID 064F,PID 0BD7。

現在我們可以共享我們的設備了:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

歡呼吧,同志們!

user@usb-server:~$ sudo usbip list -r localhost
Exportable USB devices
======================
 - localhost
        1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
           : /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)

三聲歡呼,同志們! 服務器通過網絡共享了這塊鐵片,我們可以連上了! 它仍然只是將 usbip 守護進程的自動啟動添加到 /etc/rc.local

usbipd -D

第三部分,客戶端和混淆

我嘗試立即通過網絡將共享設備連接到同一台服務器上的 Debian 機器,一切都連接正常:

sudo usbip attach --remote=localhost --busid=1-1

讓我們轉到 Windows。 在我的例子中,它是 Windows Server 2008R2 標準版。 官方指南要求您先安裝驅動程序。 該過程在 Windows 客戶端附帶的自述文件中得到了完美的描述,我們按照編寫的內容進行操作,一切正常。 在 XP 上它也可以毫無問題地工作。

解壓客戶端后,我們嘗試掛載我們的密鑰:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

哦哦。 出了些問題。 我們使用谷歌的技能。 零星提到常量有問題;在服務器部分,開發人員在切換到 0.2.0 版本時更改了協議版本,但他們忘記在 Win 客戶端中執行此操作。 建議的解決方案是更改源代碼中的常量並重建客戶端。

但我真的不想為了這個過程而下載 Visual Studio。 但我有一個很好的老 Hiew。 在源代碼中,常量被聲明為雙字。 讓我們在文件中查找 0x00000106,將其替換為 0x00000111。 請記住,字節順序是顛倒的。 結果是兩次匹配,patch:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

誒誒誒……對!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

這本可以結束演示,但音樂並沒有播放很長時間。 重啟服務器後,發現客戶端的設備沒有掛載!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

就是這樣。 即使是無所不知的谷歌也無法為我回答這個問題。 同時,用於顯示服務器上可用設備的命令非常正確地顯示 - 這就是密鑰,您可以安裝它。 我嘗試從 Linux 下掛載 - 它有效! 如果現在在 Windows 下嘗試? 哦操 - 它有效!

最後的抽成:服務器代碼中沒有添加一些東西。 共享設備時,它不會從中讀取 USB 描述符的數量。 當從 Linux 下安裝設備時,此字段將被填充。 不幸的是,我熟悉 Linux 下的“make && make install”級別的開發。 因此,這個問題是通過一個相當骯髒的 hack 解決的——添加到 /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

最終部分

經過一些擺弄後,它起作用了。 達到預期效果,現在密鑰可以掛載到任意一台PC(當然也可以卸載),包括廣播網段以外的PC。 如果需要,可以使用 shell 腳本來完成。 什麼是好的 - 樂趣是完全免費的。
我希望我的經歷能幫助 habrazithiteli 繞過印在我額頭上的耙子。 感謝您的關注!

來源: www.habr.com

添加評論