Zkrocení USB/IP

Pravidelně vyvstává úkol připojit USB zařízení ke vzdálenému PC přes lokální síť. Pod řezem je nastíněna historie mého hledání tímto směrem a cesta k hotovému řešení založenému na open-source projektu USB/IP s popisem překážek, které různí lidé na této cestě pečlivě kladou, a také způsoby, jak je obejít.

Část první, historická

Pokud je stroj virtuální - to vše je snadné. Funkce přesměrování USB z hostitele na virtuální počítač se objevila ve VMWare 4.1. Ale v mém případě musel být bezpečnostní klíč, rozpoznatelný jako WIBU-KEY, připojen v různých časech k různým strojům, a to nejen virtuálním.
První kolo hledání ve vzdáleném roce 2009 mě přivedlo ke kusu železa tzv TrendNet TU2-NU4
výhody:

  • někdy to dokonce funguje

nevýhody:

  • nefunguje vždy. Předpokládejme, že ochranný klíč Guardant Stealth II se přes něj nespustí a nadává s chybou „zařízení nelze spustit“.
  • Software pro správu (čtení - připojování a odpojování USB zařízení) je žalostný až do extrému. Přepínače příkazového řádku, automatizace - ne, neslyšel. Vše je jen od ruky. Noční můra.
  • řídicí software sám vyhledává kus železa v síti vysíláním, takže to funguje pouze v rámci jednoho segmentu vysílací sítě. Nemůžete zadat IP adresu kusu železa ručně. Kus železa v jiné podsíti? Pak máte problém.
  • vývojáři na zařízení bodovali, je zbytečné posílat hlášení o chybách.

Druhé kolo se odehrálo v dobách ne tak vzdálených a přivedlo mě k tématu článku - Projekt USB/IP. Přitahuje otevřeností, zvláště od kluků z ReactOS podepsali ovladač pro Windows, takže nyní vše funguje i na x64 bez jakýchkoli berliček jako testovací režim. Za což patří velký dík týmu ReactOS! Všechno zní krásně, zkusme to cítit, je to opravdu tak? Bohužel je opuštěný i samotný projekt a nemůžete počítat s podporou – ale tam, kde nezmizel ten náš, tam je zdroj, my na to přijdeme!

Část druhá, server-linux

Server USB/IP, který sdílí zařízení USB přes síť, lze nastavit pouze na operačním systému založeném na Linuxu. Linux je Linux, takže nainstalujte na virtuální stroj Debian 8 v minimální konfiguraci, standardní pohyb ruky:

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

Usazeno. Internet dále naznačuje, že byste si museli stáhnout modul usbip, ale - ahoj, první rake. Žádný takový modul neexistuje. A to vše proto, že většina příruček v síti odkazuje na starší větev 0.1.xa v nejnovější 0.2.0 mají moduly usbip jiné názvy.

Proto:

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

Přidejme do /etc/modules následující řádky, abychom je načetli automaticky při startu systému:

usbip-core
usbip-host
vhci-hcd

Spustíme usbip server:

sudo usbipd -D

Univerzální mysl nám dále říká, že usbip přichází se skripty, které nám umožňují spravovat server – ukazují, které zařízení bude sdílet v síti, stav a tak dále. Zde nás čeká další zahradní nástroj - tyto skripty ve větvi 0.2.x byly opět přejmenovány. Seznam příkazů můžete získat pomocí

sudo usbip

Po přečtení popisu příkazů je jasné, že pro sdílení požadovaného USB zařízení chce usbip znát jeho Bus ID. Vážení diváci, hra číslo tři je v aréně: Bus ID, které nám dá lsusb (zdálo by se to nejviditelněji) - nesluší jí to! Faktem je, že usbip ignoruje hardware, jako jsou rozbočovače USB. Proto použijeme vestavěný příkaz:

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

Poznámka: dále ve výpisech vše popíšu na příkladu mého konkrétního USB klíče. Název vašeho hardwaru a pár VID:PID se mohou a budou lišit. Můj se jmenuje Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nyní můžeme sdílet naše zařízení:

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

Hurá, soudruzi!

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)

Třikrát na zdraví, soudruzi! Server sdílel kus železa po síti a můžeme ho připojit! Zbývá pouze přidat autostart démona usbip do /etc/rc.local

usbipd -D

Část třetí, na straně klienta a matoucí

Okamžitě jsem zkusil připojit sdílené zařízení přes síť k počítači Debian na stejném serveru a vše se připojilo v pořádku:

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

Pojďme k Windows. V mém případě to byl Windows Server 2008R2 Standard Edition. Oficiální průvodce vás nejprve požádá o instalaci ovladače. Postup je perfektně popsán v readme přiloženém ke klientovi windows, vše děláme jak je napsáno, vše klape. Na XP to taky funguje bez problémů.

Po rozbalení klienta se pokusíme připojit náš klíč:

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

OH oh. Něco se pokazilo. Využíváme dovednosti Google. Jsou útržkovité zmínky o tom, že něco není v pořádku s konstantami, v serverové části vývojáři při přechodu na verzi 0.2.0 změnili verzi protokolu, ale ve Win klientovi to zapomněli udělat. Navrhovaným řešením je změnit konstantu ve zdrojovém kódu a znovu sestavit klienta.

Ale kvůli tomuto postupu opravdu nechci stahovat Visual Studio. Ale mám starého dobrého Hiewa. Ve zdrojovém kódu je konstanta deklarována jako dvojité slovo. Podívejme se v souboru na 0x00000106 a nahradíme ho 0x00000111. Pamatujte, že pořadí bajtů je obrácené. Výsledkem jsou dva zápasy, patch:

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

Eeeee... ano!

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

Tím mohla prezentace skončit, ale hudba nehrála dlouho. Po restartu serveru jsem zjistil, že zařízení na klientovi není připojeno!

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

A to je vše. Ani vševědoucí Google mi na to nedokázal odpovědět. A zároveň příkaz k zobrazení zařízení dostupných na serveru ukazuje docela správně - tady to je, klíč, můžete jej připojit. Snažím se připojit pod Linuxem - funguje to! A když teď zkusit z Windows? Sakra - funguje to!

Poslední rake: něco není přidáno do kódu serveru. Při sdílení zařízení z něj nečte počet USB deskriptorů. A při montáži zařízení z prostředí Linuxu je toto pole vyplněno. Bohužel znám vývoj pod Linuxem na úrovni „make && make install“. Proto je problém vyřešen poměrně špinavým hackem - přidáním do /etc/rc.local

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

Část závěrečná

Po chvilce šmejdění to jde. Požadovaného výsledku bylo dosaženo, nyní lze klíč připojit k libovolnému počítači (a samozřejmě také odpojit), a to i mimo segment vysílací sítě. Pokud chcete, můžete to udělat pomocí skriptu shellu. Co je hezké - potěšení je zcela zdarma.
Doufám, že moje zkušenost pomůže habrazhiteli obejít hrábě, které se mi otiskly na čelo. Děkuji za pozornost!

Zdroj: www.habr.com

Přidat komentář