Pravidelně vyvstává úkol připojit USB zařízení k vzdálenému počítači přes lokální síť. Pod tímto textem je popsána má zkušenost s hledáním v tomto směru a cesta k vyřešenému projektu založenému na open-source. s popisem různých překážek, které na této cestě pečlivě nastavili různí lidé, stejně jako způsobů, jak je obejít.
První část, historická
Pokud je stroj virtuální, není to složité. Funkcionalita přesměrování USB z hostitele do virtuálky se objevila už ve VMWare 4.1. Ale v mém případě bylo nutné klíč ochrany, identifikovaný jako WIBU-KEY, připojit v různých časových intervalech k různým strojům, a nejen virtuálním.
První pokus o nalezení řešení v roce 2009 mě přivedl k zařízení zvanému
Plusy:
- někdy dokonce funguje
Nevýhody:
- ale ne vždy. Předpokládejme, že klíč ochrany Guardant Stealth II se přes něj nenačítá, hlásí chybu „zařízení nelze spustit“.
- Software pro správu (to je, montování a odmontování USB zařízení) je krajně nedostatečný. Klíče příkazového řádku, automatizace — ne, neslyšeli. Všechno jen manuálně. Hrůza.
- řídicí software hledá samotné zařízení v síti širokým vysíláním, proto to funguje pouze v rámci jednoho broadcast segmentu sítě. Ručně nelze zadat IP adresu zařízení. Zařízení je v jiné podsíti? Pak máte problém.
- vývojáři zařízení se na něj vykašlali, posílat bug reporty je zbytečné.
Druhý pokus se odehrál v době, která už není tak dávno, a přivedl mě k tématu tohoto článku — . Přitahuje mě otevřeností, tím více, že kluci z podepsali ovladač pro Windows, takže teď funguje i na x64 bez jakýchkoli obcházení jako režim testování. Velké díky týmu ReactOS! Zní to vše hezky, zkusíme to vyzkoušet, zda je to tak skutečně. Bohužel, samotný projekt je také poněkud opuštěn, a na podporu se spoléhat nedá — ale kde naše nezmizela, zdrojový kód je k dispozici, poradíme si!
Druhá část, serverově-linuxová
Server USB/IP, který sdílí USB zařízení po síti, může být spuštěn pouze v operačních systémech založených na Linuxu. Dobře, Linux to tedy je, instalujeme na virtuální stroj Debian 8 v minimální konfiguraci, standardní postup:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbipNastavili jsme se. Dál internet radí, že je třeba stáhnout modul usbip, ale — dobrý den, první problém. Takový modul neexistuje. A všechno je to proto, že většina příruček na internetu se vztahuje na starší verzi 0.1.x, a v té poslední 0.2.0 mají moduly usbip jiná jména.
Proto:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbipA přidáme do /etc/modules takové řádky, aby se automaticky načítaly při startu systému:
usbip-core
usbip-host
vhci-hcdSpustíme server usbip:
sudo usbipd -DDále nám internet radí, že spolu s usbip přicházejí skripty, které nám umožňují spravovat server - ukázat, jaké zařízení bude sdílet přes síť, podívat se na stav a tak dále. Tady nás čeká další problém - tyto skripty ve verzi 0.2.x, opět, byly přejmenovány. Seznam příkazů lze získat pomocí
sudo usbipPo přečtení popisu příkazů je jasné, že k tomu, abychom mohli sdílet požadované USB zařízení, usbip chce znát jeho Bus ID. Vážení diváci, na scéně třetí problém: to Bus ID, které nám vrátí lsusb (zdálo by se, nejzřejmější cesta) — tomu nevyhovuje! Je to tím, že zařízení jako USB huby usbip ignoruje. Proto využ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: zde a dále v seznamech budu vše popisovat na příkladu mého konkrétního USB klíče. Vaše názvy zařízení a pár VID:PID se mohou lišit. Můj se nazývá Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
Teď 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: completeHurá, 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)Trojnásobné hurá, soudruzi! Server sdílel zařízení přes síť a můžeme jej připojit! Zbývá jen dopsat automatické spouštění démona usbip do /etc/rc.local
usbipd -DČást třetí, klientská a zamotaná
Připojit sdílené zařízení přes síť k stroji běžícímu na Debianu jsem zkusil hned na tom samém serveru a vše se krásně připojilo:
sudo usbip attach --remote=localhost --busid=1-1Přejdeme k Windows. V mém případě to bylo Windows Server 2008R2 Standard Edition. Oficiální příručka nejprve požaduje nainstalovat ovladač. Postup je krásně popsán v přiloženém README k Windows klientovi, děláme vše, jak je napsáno, a vše funguje. Na XP to také funguje bez jakýchkoliv problémů.
Po rozbalení klienta zkouší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) nelze najít zařízeníOu ou. Něco se pokazilo. Použijeme gugl na pomoc. Objevují se kusé zmínky, že něco není v pořádku s konstantami, na serverové straně vývojáři při přechodu na verzi 0.2.0 změnili verzi protokolu, ale klient pro Windows to zapomněl udělat. Navrhované řešení — změňte konstantu v zdrojovém kódu a znovu sestavte klienta.
Jenže se mi opravdu nechce stahovat Visual Studio kvůli tomuto postupu. Naštěstí mám starý dobrý Hiew. V zdrojovém kódu je konstanta deklarována jako dvojité slovo. Pojďme hledat v souboru 0x00000106, nahrazujeme 0x00000111. Nezapomeňte, pořadí bajtů je obrácené. Výsledek — dvě shody, patche:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11Aaa… ano!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
nové USB zařízení připojeno k usbvbus portu 1Na tomto bych mohl skončit, ale hudba netrvala dlouho. Po restartu serveru jsem zjistil, že zařízení na klientovi se nepřipojuje!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) nelze najít zařízeníA to je vše. Ani vševědoucí gugl mi na to nedokázal odpovědět. Přitom příkaz na zobrazení dostupných zařízení na serveru zcela korektně ukazuje — tady je, klíč, můžete připojit. Zkouším připojit z Linuxu — funguje! A co když teď zkusím z Windows? Au au — to funguje!
Poslední problém: něco v kódu serveru není dodělané. Při sdílení zařízení nedokáže načíst počet USB deskriptorů. A při připojování zařízení z Linuxu se toto pole vyplňuje. Bohužel, s vývojem pod Linuxem jsem obeznámen na úrovni „make && make install“. Proto byla problém vyřešena pomocí poměrně znečištěného hacku — přidáním do /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00Závěrečná část
Po několika peripetiích to funguje. Bylo dosaženo požadovaného výsledku, nyní lze klíč připojit k jakémukoli PC (a samozřejmě jej také odpojit), včetně připojení mimo širší síťový segment. Pokud je to žádoucí, můžete to provést pomocí skriptu příkazového řádku. Co je potěšující, je to, že to je zcela zdarma.
Doufám, že moje zkušenosti pomohou uživatelům Habr vyhnout se překážkám, které se mi na čele vryly. Děkuji za pozornost!
Zdroj: habr.com
