Kroćenje USB/IP

Redovito se javlja zadatak povezivanja USB uređaja s udaljenim računalom putem lokalne mreže. Pod rezom je prikazana povijest mojih traženja u ovom smjeru i put do gotovog rješenja temeljenog na projektu otvorenog koda USB/IP s opisom prepreka koje razni ljudi pažljivo postavljaju na tom putu, kao i načinima kako ih zaobići.

Prvi dio, povijesni

Ako je stroj virtualni - sve je to jednostavno. Funkcionalnost USB prosljeđivanja s hosta na virtualni stroj pojavila se u VMWare 4.1. Ali u mom slučaju, sigurnosni ključ, prepoznatljiv kao WIBU-KEY, morao je biti povezan u različito vrijeme s različitim strojevima, a ne samo virtualnim.
Prvi krug potrage davne 2009. godine doveo me do komada željeza tzv TrendNet TU2-NU4
Pros:

  • ponekad čak i uspije

Cons:

  • ne radi uvijek. Pretpostavimo da se zaštitni ključ Guardant Stealth II ne pokreće kroz njega, psujući s pogreškom "uređaj se ne može pokrenuti".
  • Softver za upravljanje (čitaj - montiranje i demontiranje USB uređaja) je jadan do krajnjih granica. Prekidači naredbenog retka, automatizacija - ne, nisam čuo. Sve je samo ručno. Noćna mora.
  • upravljački softver traži sam komad željeza u mreži putem emitiranja, tako da ovo radi samo unutar jednog segmenta mreže za emitiranje. Ne možete ručno odrediti IP adresu komada željeza. Komad željeza u drugoj podmreži? Onda imate problem.
  • programeri postigli bodove na uređaju, beskorisno je slati izvješća o pogreškama.

Drugi krug dogodio se u ne tako davnim vremenima i doveo me do teme članka - USB/IP projekt. Privlači otvorenošću, tim više što dečki iz ReactOS potpisali su drajver za Windows, pa sad sve radi i na x64 bez ikakvih štaka kao test mod. Za što veliko hvala ReactOS timu! Sve lijepo zvuči, pokušajmo to osjetiti, je li stvarno tako? Nažalost, sam projekt je također napušten, a na podršku ne možete računati - ali gdje naši nisu nestali, izvor je tu, shvatit ćemo!

Drugi dio, server-linux

USB/IP poslužitelj koji dijeli USB uređaje preko mreže može se postaviti samo na OS-u temeljenom na Linuxu. Pa Linux je Linux, instaliramo Debian 8 na virtualni stroj u minimalnoj konfiguraciji, standardni pokret ruke:

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

Naselili. Nadalje, Internet sugerira da biste trebali preuzeti usbip modul, ali - zdravo, prva rake. Ne postoji takav modul. A sve zato što se većina priručnika na mreži odnosi na stariju granu 0.1.x, au najnovijoj 0.2.0 usbip moduli imaju drugačija imena.

Stoga:

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

Pa, dodajmo sljedeće retke u /etc/modules da ih automatski učitamo pri pokretanju sustava:

usbip-core
usbip-host
vhci-hcd

Pokrenimo usbip server:

sudo usbipd -D

Nadalje, univerzalni um nam govori da usbip dolazi sa skriptama koje nam omogućuju upravljanje poslužiteljem - pokazuju koji će uređaj dijeliti preko mreže, vide status i tako dalje. Ovdje nas čeka još jedan vrtni alat - ove skripte u grani 0.2.x, opet, su preimenovane. Možete dobiti popis naredbi s

sudo usbip

Nakon čitanja opisa naredbi, postaje jasno da usbip želi znati njegov Bus ID kako bi podijelio traženi USB uređaj. Dragi gledatelji, grablje broj tri su u areni: Bus ID koji će nam dati lsusb (činilo bi se najočigledniji način) - ne pristaje joj! Činjenica je da usbip zanemaruje hardver poput USB čvorišta. Stoga ćemo koristiti ugrađenu naredbu:

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

Napomena: u daljnjem tekstu u popisima ću sve opisati na primjeru svog specifičnog USB ključa. Vaš naziv hardvera i VID:PID par mogu se i razlikovat će se. Moj se zove Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Sada možemo dijeliti naš uređaj:

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

Hura, drugovi!

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 puta ura, drugovi! Poslužitelj je podijelio komad željeza preko mreže i možemo ga spojiti! Ostaje samo dodati autostart usbip demona u /etc/rc.local

usbipd -D

Treći dio, na strani klijenta i zbunjujući

Pokušao sam spojiti dijeljeni uređaj preko mreže na Debian stroj odmah na istom poslužitelju, i sve je dobro povezano:

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

Prijeđimo na Windows. U mom slučaju to je bio Windows Server 2008R2 Standard Edition. Službeni vodič traži da prvo instalirate upravljački program. Procedura je savršeno opisana u readme-u priloženom Windows klijentu, radimo sve kako je napisano, sve funkcionira. Na XP također radi bez problema.

Nakon raspakiranja klijenta, pokušavamo montirati 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

Oh oh. Nešto je pošlo po zlu. Koristimo se vještinom Googlea. Postoje fragmentarne napomene da nešto nije u redu s konstantama; u poslužiteljskom dijelu programeri su promijenili verziju protokola pri prelasku na verziju 0.2.0, ali su to zaboravili učiniti u Win klijentu. Predloženo rješenje je promijeniti konstantu u izvornom kodu i ponovno izgraditi klijenta.

Ali stvarno ne želim preuzimati Visual Studio radi ovog postupka. Ali imam dobrog starog Hiewa. U izvornom kodu, konstanta je deklarirana kao dvostruka riječ. Pogledajmo u datoteci 0x00000106, zamijenivši ga s 0x00000111. Zapamtite, redoslijed bajtova je obrnut. Rezultat su dvije utakmice, patch:

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

Eeeee... da!

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

Time je prezentacija mogla završiti, ali glazba nije dugo svirala. Nakon ponovnog pokretanja poslužitelja, ustanovio sam da uređaj na klijentu nije montiran!

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

I to je to. Čak mi ni sveznajući Google nije mogao odgovoriti na ovo pitanje. I u isto vrijeme, naredba za prikaz uređaja dostupnih na poslužitelju sasvim ispravno pokazuje - evo ga, ključ, možete ga montirati. Pokušavam montirati iz Linuxa - radi! A ako sada pokušate iz sustava Windows? O sranje - radi!

Posljednji rake: nešto nije dodano u kod poslužitelja. Prilikom dijeljenja uređaja, ne čita broj USB deskriptora s njega. A kada montirate uređaj iz Linuxa, ovo polje je popunjeno. Nažalost, upoznat sam s razvojem pod Linuxom na razini "make && make install". Stoga je problem riješen prilično prljavim hackom - dodavanjem u /etc/rc.local

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

Završni dio

Nakon malo petljanja, radi. Željeni rezultat je postignut, sada se ključ može montirati na bilo koje računalo (i demontirati, naravno), uključujući i izvan segmenta mreže za emitiranje. Ako želite, možete to učiniti pomoću skripte ljuske. Ono što je lijepo - užitak je apsolutno besplatan.
Nadam se da će moje iskustvo pomoći habrazhiteli da zaobiđu grablje koje su mi utisnute na čelu. Hvala na pozornosti!

Izvor: www.habr.com

Dodajte komentar