Pogosto se pojavi naloga povezati USB napravo na oddaljeno računalnik prek lokalnega omrežja. V nadaljevanju je opisana moja zgodba iskanja v tej smeri in pot do končne rešitve na osnovi projekta odprte kode. s opisom različnih ovir, ki so jih skrbno postavili različni ljudje na tej poti, ter načinov za njihovo obvladovanje.
Prvi del, zgodovinski
Če je stroj virtualen, to ni preveč zapleteno. Funkcionalnost prehodnega USB iz gostitelja v virtualno okolje se je pojavila že v VMWare 4.1. Vendar pa sem moral v mojem primeru zaščitno ključno napravo, ki se prepozna kot WIBU-KEY, v različnih časovnih obdobjih priključevati na različne naprave, ne le virtualne.
Prvo iskanje me je v davnem letu 2009 pripeljalo do naprave imenovane
Prednosti:
- včasih celo deluje
Mane:
- vendar ne vedno. Na primer, zaščitni ključ Guardant Stealth II se skozi to napravo ne prepozna, z napako, da "naprava ne more biti zagnana".
- Programska oprema za upravljanje (beri - nameščanje in odstranitev USB naprav) je izjemno slaba. Ključne besede ukazne vrstice, avtomatizacija - ne, tega niso slišali. Vse je treba delati ročno. Groza.
- Upravljalna programska oprema napravo išče v omrežju preko širokotončnega sporočanja, zato deluje le znotraj enega broadcast-segmenta omrežja. IP-naslova naprave ne morete nastaviti ročno. Če je naprava v drugem podomrežju? Potem imate težave.
- Razvijalci so prenehali skrbeti za napravo, pošiljanje napak ni smiseln.
Drugo iskanje se je zgodilo v manj oddaljenem času in me pripeljalo do teme tega članka - . Privlači z odprtostjo, še posebej ker so fantje iz podpisali gonilnik za Windows, tako da sedaj deluje brez vseh nevšečnosti, kot je testni način, celo na x64. Ekipa ReactOS si zasluži veliko hvalo! Vse se sliši lepo, preizkusimo, ali je to res? Na žalost je sam projekt tudi malo zapostavljen in ne moremo računati na podporo - toda kjer je potreba, so viri, vse bomo razjasnili!
Drugi del, strežniški in Linux
Strežnik USB/IP, ki deli USB naprave prek omrežja, lahko postavimo le v sistemih, osnovanih na Linuxu. No, Linux to je, namestitev na virtualni stroj Debian 8 v minimalni konfiguraciji, standardno premikanje z rokami:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbipUstvarjeno. Naslednje, internet nam pove, da bi bilo dobro naložiti modul usbip, vendar — pozdravljeni, prvi kamni. Takšnega modula ni. Vse je zato, ker se večina vodnikov na spletu nanaša na starejšo različico 0.1.x, medtem ko v zadnji različici 0.2.0 moduli usbip nosijo drugačna imena.
Zato:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbipDodali bomo v /etc/modules take vrstice, da se bodo samodejno naložile ob zagonu sistema:
usbip-core
usbip-host
vhci-hcdZaženimo strežnik usbip:
sudo usbipd -DNadalje, svetovna pamet nam pove, da z usbip pridejo skripte, ki nam omogočajo upravljanje strežnika — prikazati, katero napravo bo delil preko omrežja, ogledati stanje itd. Tu nas čaka še en vrtnarski pripomoček — te skripte v različici 0.2.x so spet preimenovane. Seznam ukazov lahko dobimo s pomočjo
sudo usbipPo pregledu opisa ukazov je jasno, da za deljenje želene USB naprave, usbip želi vedeti njen Bus ID. Spoštovani gledalci, na prizorišču je kamen številka tri: tisti Bus ID, ki nam ga bo dal lsusb (zdelo bi se, da je to najbolj očitna pot) — mu ne ustreza! Dejstvo je, da usbip ignorira naprave, kot so USB hubi. Zato bomo uporabili vgrajeni ukaz:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)Opomba: tukaj in naprej v seznamih bom vse opisal na primeru moje konkretne USB naprave. Vaši imeni naprave in dvojice VID:PID se lahko razlikujeta. Moja se imenuje Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
Zdaj lahko delimo svojo napravo:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: completeUra, tovariši!
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)Tri kratka ura, tovariši! Strežnik je delil napravo po omrežju in lahko jo priključimo! Ostalo je le še, da dodamo samodejni zagon demona usbip v /etc/rc.local
usbipd -DTretji del, odjemalski in zapleten
Poskusil sem takoj povezati deljeno napravo prek omrežja na računalniku, ki deluje na Debiana in vse se je brez težav povezalo:
sudo usbip attach --remote=localhost --busid=1-1Pojdimo k Windows. V mojem primeru je to bila različica Windows Server 2008R2 Standard Edition. Uradno navodilo zahteva, da najprej namestite gonilnik. Postopek je odlično opisan v priloženem readme dokumentu za windows odjemalca, naredimo vse, kot je opisano, in uspe nam. Na XP prav tako deluje brez kakršnih koli težav.
Ko razpakiramo odjemalca, poskusimo priklopiti naš ključ:
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 deviceOj, oj. Nekaj je šlo narobe. Uporabimo znanje googlanja. Pojavljajo se razpršeni omembe, da je nekaj narobe s konstantami, v strežniški komponenti so razvijalci ob prehodu na različico 0.2.0 spremenili različico protokola, vendar so v odjemalcu za Win to pozabili. Predlagano rešitev — zamenjajte konstanto v izvorni kodi in ponovno sestavite odjemalca.
Samo, da se mi ne ljubi prenašati Visual Studia zaradi te procedure. A imam starodobnega Hiewa. V izvorni kodi je konstanta razglašena kot dvojno besedo. Iskali bomo v datoteki 0x00000106, zamenjujemo jo na 0x00000111. Ne pozabite, da je vrstni red bajtov obrnjen. Končni rezultat — dva ujemanja, patčamo:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11In iii… ja!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
nov USB naprava priključena na usbvbus priključek 1Na tem bi lahko zaključil pripoved, a glasba je igrala le kratek čas. Po ponovnem zagonu strežnika sem odkril, da naprava na odjemalcu ne prikaže!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find deviceIn to je vse. Na to mi ni mogel odgovoriti niti vsevedni google. Hkrati pa ukaz za prikaz razpoložljivih naprav na strežniku povsem korektno prikazuje — tukaj je, ključ, lahko ga priključite. Poskušam montirati iz Linuxa — deluje! A če zdaj poskusim iz Windows? O groza — to deluje!
Zadnji problem: nekaj v kodi strežnika ni zapisano. Pri deljenju naprave ne prebere števila USB-deskriptorjev. A pri montiranju naprave iz Linuxa se to polje zapolni. Na žalost sem z razvojem pod Linuxom seznanjen na ravni "make && make install". Tako je problem rešen s precej umazano rešitvijo — z dodajanjem v /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00Zaključni del
Po nekaterih preizkušnjah to deluje. Želeno je doseženo, zdaj lahko ključ priključite na katerikoli računalnik (in ga seveda tudi odklopite), tudi zunaj širokopasovnega segmenta omrežja. Če želite, lahko to storite s pomočjo skripta ukazne lupine. K temu je prijetno, da je užitek popolnoma brezplačen.
Upam, da bo moje izkušnje pomagale uporabnikom Habr, da se izognejo napakam, ki so se na moji čelu zapisale. Hvala za pozornost!
Izvor: habr.com
