Ukroćujemo USB/IP

Redovito se javlja potreba za povezivanjem USB uređaja na udaljeni PC putem lokalne mreže. U nastavku je predstavljena moja potraga u tom smjeru i put do gotovog rješenja temeljenog na open-source projektu. USB/IP s opisom prepreka koje su razne osobe postavile na tom putu, kao i načina njihovog zaobilaženja.

Prvi dio, povijesni

Ako je mašina virtualna — sve to nije komplicirano. Funkcionalnost prosljeđivanja USB-a od hosta do virtualke pojavila se još u VMWare 4.1. No, u mom slučaju, zaštitni ključ, koji se prepoznaje kao WIBU-KEY, trebao se u različito vrijeme povezivati na različite mašine, i to ne samo virtualne.
Prvi krug potrage u dalekoj 2009. godini doveo me do uređaja pod imenom TrendNet TU2-NU4
Prednosti:

  • ponekad čak i radi

Mane:

  • ne radi uvijek. Recimo, zaštitni ključ Guardant Stealth II preko njega ne uspijeva, javljajući grešku 'uređaj se ne može pokrenuti'.
  • Softver za upravljanje (čitaj — montiranje i demontiranje USB uređaja) je ekstremno loš. Ključevi naredbenog retka, automatizacija — ne, nisu čuli. Sve ručno. Užas.
  • upravljajući softver traži sam uređaj u mreži putem broadcast-a, pa to radi samo unutar jednog broadcast segmenta mreže. Ručno postavljanje IP adrese uređaja nije moguće. Uređaj je u drugoj podmreži? Tada imate problem.
  • razvijači su odustali od uređaja, slanje bug reportova je besmisleno.

Drugi krug dogodio se u ne tako dalekoj prošlosti i doveo me do teme članka — USB/IP projekt. Privlači otvorenošću, tim više što su dečki iz ReactOS potpisali im drajver za Windows, tako da sada čak i na x64 sve radi bez ikakvih problema poput testnog načina. Za što timu ReactOS veliko hvala! Sve zvuči lijepo, probajmo vidjeti je li to tako u praksi? Nažalost, sam projekt je također malo zapostavljen, i na podršku se ne možemo osloniti — ali gdje je naš slučaj, izvorni kod postoji, snalazit ćemo se!

Drugi dio, serverno-linux

Server USB/IP, koji dijeli USB uređaje putem mreže, može se pokrenuti samo na Linux-based OS. Pa dobro, Linux je to, instaliram na virtualku Debian 8 u minimalnoj konfiguraciji, standardna postupak rukama:

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

Postavili smo. Zatim nam internet sugerira da bismo trebali učitati modul usbip, ali — zdravo, prvi problemi. Takvog modula nema. A sve to zbog toga što se većina vodiča na mreži odnosi na stariju verziju 0.1.x, dok u najnovijoj 0.2.0 moduli usbip imaju drugačije nazive.

Dakle:

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

Dodajmo u /etc/modules sljedeće redove kako bismo ih automatski učitali pri pokretanju sustava:

usbip-core
usbip-host
vhci-hcd

Pokrenimo usbip server:

sudo usbipd -D

Zatim nam svjetska mudrost sugerira da uz usbip dolaze skripte koje nam omogućuju upravljanje serverom — prikazivanje koje uređaje dijelimo preko mreže, pregled statusa i tako dalje. Tu nas čeka još jedan alat — te skripte u verziji 0.2.x su, opet, promijenile naziv. Popis komandi možemo dobiti pomoću

sudo usbip

Čitajući opis komandi, postaje jasno da, kako bismo podijelili potrebni USB uređaj, usbip želi znati njegov Bus ID. Cijenjeni gledatelji, na sceni imamo problem broj tri: taj Bus ID koji će nam dati lsusb (naizgled, najočigledniji put) — ne odgovara! Naime, USB hubovi usbip ignorira. Stoga, koristit ćemo ugrađenu komandu:

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

Napomena: ovdje i kasnije u popisima ću sve opisivati na primjeru mog konkretnog USB sticka. Vaša imena uređaja i razne VID:PID mogu se razlikovati. Moj se zove Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Sada možemo podijeliti 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
Izvozivi USB uređaji
======================
 - 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
           : Klasa specifična za proizvođača / nepoznata podklasa / nepoznati protokol (ff/00/ff)

Trostruko hura, drugovi! Server je podijelio uređaj preko mreže i možemo ga spojiti! Preostaje samo dodati automatsko pokretanje demona usbip u /etc/rc.local

usbipd -D

Treći dio, klijentski i zamršen

Pokušao sam odmah spojiti dijeljeni uređaj putem mreže na mašinu koja radi pod Debian-om, i sve se savršeno spojilo:

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

Prelazimo 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. Postupak je dobro opisalan u priloženom readme-u uz Windows klijent, radimo sve kako je napisano, sve ide glatko. Na XP također radi bez ikakvih poteškoća.

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) nemoguće pronaći uređaj

Oh-oh. Nešto je pošlo po zlu. Koristimo svoju vještinu googlanja. Pojavljuju se fragmentarni navodi da nešto nije u redu s konstantama, u server dijelu su programeri promijenili verziju protokola prilikom prelaska na verziju 0.2.0, dok su to u klijentu za Win zaboravili napraviti. Predloženo rješenje — promijenite konstantu u izvoru i ponovno kompajlirajte klijent.

Samo mi se ne da skidati Visual Studio zbog ovog postupka. Ali imam stari dobri Hiew. U izvoru je konstanta deklarirana kao dvojnog broja. Potražimo u datoteci 0x00000106, zamjenjujući je s 0x00000111. Ne zaboravite, redoslijed bajtova je obrnut. Rezultat — dva podudaranja, popravljamo:

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

Iiiiii… da!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
novi USB uređaj povezan na usbvbus port 1

Na ovome bismo mogli završiti izlaganje, ali muzika nije dugo svirala. Nakon ponovnog pokretanja servera, otkrio sam da se uređaj na klijentu ne montira!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) nemoguće pronaći uređaj

I to je to. Na ovo mi nije mogao odgovoriti čak ni svemoćni Google. A ipak, komanda za prikaz dostupnih uređaja na serveru sasvim korektno prikazuje — evo ga, ključ, možete montirati. Pokušavam montirati iz Linuxa — radi! A ako sada probam iz Windows-a? O užasu — to radi!

Zadnji problemi: nešto u kodu servera nije napisano do kraja. Prilikom dijeljenja uređaja ne očitava količinu USB-deskriptora. A kada se uređaj montira iz Linuxa, to se polje popunjava. Nažalost, s razvojem pod Linuxom sam upoznat na razini «make && make install». Stoga je problem riješen prilično prljavim hakom — dodavanjem u /etc/rc.local

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

Konačni dio

Nakon nekih muka, ovo radi. Željeno je postignuto, now ključ se može montirati na bilo koje računalo (i odmontirati, naravno), uključujući — izvan širokogrudnog segmenta mreže. Ako želite — to možete učiniti pomoću skripte naredbenog retka. Što je lijepo — zadovoljstvo je potpuno besplatno.
Nadam se da će moje iskustvo pomoći habržerima da izbjegnu one prepreke koje su mi ostavile trag na čelu. Hvala na pažnji!

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster