Krotenje USB/IP

Redno se pojavlja naloga povezovanja naprave USB z oddaljenim računalnikom prek lokalnega omrežja. Pod rezom je prikazana zgodovina mojih iskanj v tej smeri in pot do že pripravljene rešitve, ki temelji na odprtokodnem projektu. USB/IP z opisom ovir, ki jih na tej poti skrbno postavljajo različni ljudje, ter načinov, kako jih obiti.

Prvi del, zgodovinski

Če je stroj virtualen - je vse to enostavno. Funkcionalnost posredovanja USB od gostitelja do virtualnega stroja se je pojavila v VMWare 4.1. Toda v mojem primeru je bilo treba varnostni ključ, prepoznaven kot WIBU-KEY, ob različnih časih povezati z različnimi stroji in ne samo z virtualnimi.
Prvi krog iskanja me je daljnega leta 2009 pripeljal do kosa železa, imenovanega TrendNet TU2-NU4
Profesionalci:

  • včasih celo deluje

Cons:

  • ne deluje vedno. Recimo, da se zaščitni ključ Guardant Stealth II ne zažene prek njega in prisega z napako »naprave ni mogoče zagnati«.
  • Programska oprema za upravljanje (beri - priklapljanje in odklapljanje USB naprav) je patetična do skrajnosti. Stikala ukazne vrstice, avtomatizacija - ne, nisem slišal. Vse je samo ročno. Nočna mora.
  • nadzorna programska oprema sama išče kos železa v omrežju z oddajanjem, tako da to deluje samo znotraj enega oddajnega omrežnega segmenta. Ne morete ročno določiti IP-naslova kosa železa. Kos železa v drugem podomrežju? Potem imaš problem.
  • razvijalcev na napravi, je neuporabno pošiljati poročila o napakah.

Drugi krog se je zgodil v ne tako oddaljenih časih in me pripeljal do teme članka - Projekt USB/IP. Pritegne z odprtostjo, sploh ker fantje iz ReactOS podpisali so gonilnik za Windows, tako da zdaj vse dela tudi na x64 brez kakršnih koli bergel kot testni način. Za kar se najlepše zahvaljujem ekipi ReactOS! Vse se sliši lepo, poskusimo začutiti, ali je res tako? Na žalost je tudi sam projekt opuščen in ne morete računati na podporo - a kjer naši niso izginili, je vir tam, bomo ugotovili!

Drugi del, server-linux

Strežnik USB/IP, ki deli naprave USB prek omrežja, je mogoče nastaviti samo v operacijskem sistemu Linux. No, Linux je Linux, Debian 8 namestimo na virtualni stroj v minimalni konfiguraciji, standardno gibanje roke:

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

Poravnano. Poleg tega internet nakazuje, da bi morali prenesti modul usbip, vendar - zdravo, prva rake. Tega modula ni. In vse zato, ker se večina priročnikov v omrežju nanaša na starejšo vejo 0.1.x, v najnovejši 0.2.0 pa imajo moduli usbip različna imena.

Zato:

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

No, dodamo naslednje vrstice v /etc/modules, da se samodejno naložijo ob zagonu sistema:

usbip-core
usbip-host
vhci-hcd

Zaženimo strežnik usbip:

sudo usbipd -D

Nadalje, univerzalni um nam pove, da usbip prihaja s skripti, ki nam omogočajo upravljanje strežnika - pokažejo, katero napravo bo delil prek omrežja, vidijo status itd. Tukaj nas čaka še eno vrtno orodje - te skripte v veji 0.2.x so spet preimenovane. Seznam ukazov lahko dobite z

sudo usbip

Po branju opisa ukazov postane jasno, da želi usbip za skupno rabo zahtevane naprave USB vedeti njen ID vodila. Dragi gledalci, rak številka tri je v areni: Bus ID, ki nam bo dal lsusb (zdi se najbolj očiten način) - ne ustreza ji! Dejstvo je, da usbip ignorira strojno opremo, kot so vozlišča USB. Zato bomo uporabili vgrajen ukaz:

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

Opomba: v nadaljevanju v seznamih bom vse opisal na primeru svojega specifičnega USB ključa. Vaše ime strojne opreme in par VID:PID se lahko razlikujeta in se bosta razlikovala. Moj 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: complete

Hura, 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)

Trikrat na zdravje, tovariši! Strežnik je kos železa delil prek omrežja in lahko ga povežemo! Ostaja le še dodati samodejni zagon demona usbip v /etc/rc.local

usbipd -D

Tretji del, na strani odjemalca in zmeden

Napravo v skupni rabi sem poskušal prek omrežja takoj povezati z računalnikom Debian na istem strežniku in vse je bilo dobro povezano:

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

Preidimo na Windows. V mojem primeru je bil Windows Server 2008R2 Standard Edition. Uradni vodnik zahteva, da najprej namestite gonilnik. Postopek je popolnoma opisan v readme-u, ki je priložen odjemalcu windows, naredimo vse, kot je napisano, vse deluje. Na XP tudi dela brez problemov.

Po razpakiranju odjemalca poskušamo namestiti 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 device

o o o Nekaj ​​je šlo narobe. Uporabljamo spretnost Googla. Obstajajo fragmentarne omembe, da je nekaj narobe s konstantami, v strežniškem delu so razvijalci ob prehodu na različico 0.2.0 spremenili različico protokola, vendar so to pozabili narediti v odjemalcu Win. Predlagana rešitev je sprememba konstante v izvorni kodi in ponovna izdelava odjemalca.

Vendar res ne želim prenesti Visual Studio zaradi tega postopka. Imam pa dobrega starega Hiewa. V izvorni kodi je konstanta deklarirana kot dvojna beseda. Poglejmo v datoteko 0x00000106 in jo nadomestimo z 0x00000111. Ne pozabite, da je vrstni red bajtov obrnjen. Rezultat sta dve tekmi, popravek:

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

Eeeee... ja!

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

S tem bi se predstavitev lahko končala, a glasba ni dolgo igrala. Po ponovnem zagonu strežnika sem ugotovil, da naprava na odjemalcu ni nameščena!

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

In to je to. Tudi vsevedni Google mi na to ni znal odgovoriti. In hkrati se ukaz za prikaz naprav, ki so na voljo na strežniku, povsem pravilno prikaže - tukaj je, ključ, lahko ga namestite. Poskušam namestiti iz Linuxa - deluje! In če zdaj poskusite iz sistema Windows? Oh sranje - deluje!

Zadnja rake: nekaj ni dodano v kodo strežnika. Pri souporabi naprave ne prebere števila deskriptorjev USB z nje. In ko nameščate napravo iz Linuxa, je to polje izpolnjeno. Na žalost sem seznanjen z razvojem pod Linuxom na ravni "make && make install". Zato je problem rešen s precej umazanim vdorom - dodajanjem v /etc/rc.local

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

Končni del

Po nekaj poigravanja deluje. Želeni rezultat je bil dosežen, zdaj je ključ mogoče namestiti na kateri koli računalnik (in ga seveda tudi odklopiti), tudi zunaj segmenta oddajnega omrežja. Če želite, lahko to storite s skriptom lupine. Kar je lepo - užitek je popolnoma brezplačen.
Upam, da bodo moje izkušnje pomagale habrazhiteli zaobiti grablje, ki so se mi vtisnile na čelo. Hvala za vašo pozornost!

Vir: www.habr.com

Dodaj komentar