USB/IP prisijaukinimas

Reguliariai kyla užduotis prijungti USB įrenginį prie nuotolinio kompiuterio per vietinį tinklą. Po pjūviu yra išdėstyta mano paieškų šia kryptimi istorija ir kelias į paruoštą sprendimą, pagrįstą atvirojo kodo projektu. USB/IP su įvairių žmonių šiame kelyje kruopščiai nustatytų kliūčių aprašymu, taip pat būdų, kaip jas apeiti.

Pirma dalis, istorinė

Jei mašina virtuali – visa tai paprasta. „VMWare 4.1“ pasirodė USB persiuntimo iš pagrindinio kompiuterio į virtualią mašiną funkcionalumas. Tačiau mano atveju saugos raktas, atpažįstamas kaip WIBU-KEY, turėjo būti jungiamas skirtingu metu prie skirtingų mašinų, o ne tik virtualių.
Pirmasis paieškų turas tolimais 2009 m. atvedė mane prie geležies gabalo, vadinamo TrendNet TU2-NU4
Argumentai "už":

  • kartais net pavyksta

Trūkumai:

  • ne visada veikia. Tarkime, kad „Guardant Stealth II“ apsaugos raktas neprasideda per jį, prisiekdamas su klaida „įrenginio negalima paleisti“.
  • Valdymo programinė įranga (skaitykite – USB įrenginių montavimas ir atjungimas) yra apgailėtina iki kraštutinumo. Komandinės eilutės jungikliai, automatika – ne, negirdėjau. Viskas tik rankomis. Košmaras.
  • valdymo programinė įranga ieško pačios geležies gabalo tinkle transliavimo būdu, todėl tai veikia tik viename transliavimo tinklo segmente. Negalite ranka nurodyti geležies gabalo IP adreso. Geležies gabalas kitame potinklyje? Tada turite problemų.
  • kūrėjai surinko balus įrenginyje, nenaudinga siųsti klaidų ataskaitas.

Antrasis turas įvyko ne taip tolimais laikais ir atvedė mane prie straipsnio temos - USB/IP projektas. Traukia atvirumu, juolab kad vaikinai iš ReactOS jie pasirašė tvarkyklę Windows, todėl dabar viskas veikia net x64 be jokių ramentų kaip bandomasis režimas. Už tai labai ačiū ReactOS komandai! Viskas skamba gražiai, pabandykime tai pajausti, ar tikrai taip? Deja, pats projektas taip pat apleistas, o jūs negalite tikėtis paramos - bet ten, kur mūsų nedingo, šaltinis yra, mes tai išsiaiškinsime!

Antra dalis, serveris-Linux

USB / IP serverį, kuris bendrina USB įrenginius tinkle, galima nustatyti tik „Linux“ OS. Na, „Linux“ yra „Linux“, todėl įdiekite „Debian 8“ virtualią mašiną minimalia konfigūracija, standartiniu rankos judesiu:

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

Įsikūrė. Toliau internetas siūlo, kad reikėtų parsisiųsti usbip modulį, bet – sveiki, pirmas grėblys. Tokio modulio nėra. Ir viskas todėl, kad dauguma tinkle esančių žinynų nurodo senesnę šaką 0.1.x, o naujausioje 0.2.0 versijoje usbip moduliai turi skirtingus pavadinimus.

Todėl:

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

Na, pridėkime šias eilutes prie /etc/modules, kad jos būtų įkeltos automatiškai paleidžiant sistemą:

usbip-core
usbip-host
vhci-hcd

Pradėkime usbip serverį:

sudo usbipd -D

Be to, universalus protas mums sako, kad usbip yra su scenarijais, kurie leidžia valdyti serverį – parodyti, kurį įrenginį jis bendrins tinkle, pamatyti būseną ir pan. Čia mūsų laukia dar vienas sodo įrankis – šie 0.2.x šakos scenarijai vėl buvo pervadinti. Komandų sąrašą galite gauti naudodami

sudo usbip

Perskaičius komandų aprašymą aiškėja, kad norėdamas pasidalinti reikiamu USB įrenginiu usbip nori žinoti savo Bus ID. Mieli žiūrovai, arenoje yra trečias grėblys: autobuso ID, kurį mums duos lsusb (atrodytų akivaizdžiausias būdas) – jai tai netinka! Faktas yra tas, kad usbip nepaiso aparatinės įrangos, tokios kaip USB šakotuvai. Todėl naudosime įmontuotą komandą:

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

Pastaba: toliau sąrašuose viską aprašysiu naudodamas savo konkretaus USB rakto pavyzdį. Jūsų aparatinės įrangos pavadinimas ir VID:PID pora gali skirtis ir skirsis. Manasis vadinasi Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Dabar galime dalytis savo įrenginiu:

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

Ura, draugai!

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)

Trys sveikinimai, bendražygiai! Serveris pasidalino geležies gabalėliu per tinklą, ir mes galime jį prijungti! Belieka tik pridėti automatinį usbip demono paleidimą į /etc/rc.local

usbipd -D

Trečia dalis, kliento pusės ir paini

Bandžiau sujungti bendrinamą įrenginį per tinklą prie Debian mašinos iš karto tame pačiame serveryje ir viskas susijungė gerai:

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

Pereikime prie „Windows“. Mano atveju tai buvo „Windows Server 2008R2 Standard Edition“. Oficialus vadovas prašo pirmiausia įdiegti tvarkyklę. Procedūra puikiai aprašyta prie windows kliento pridėtame readme, viską darome kaip parašyta, viskas pavyksta. XP taip pat veikia be jokių problemų.

Išpakavę klientą, bandome pritvirtinti savo raktą:

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

Oi oi. Kažkas nutiko. Mes naudojame Google įgūdžius. Yra fragmentiškai paminėta, kad kažkas negerai su konstantomis, serverio dalyje kūrėjai perjungdami į 0.2.0 versiją pakeitė protokolo versiją, bet pamiršo tai padaryti Win kliente. Siūlomas sprendimas yra pakeisti šaltinio kodo konstantą ir atkurti klientą.

Bet aš tikrai nenoriu atsisiųsti „Visual Studio“ dėl šios procedūros. Bet aš turiu seną gerą Hiew. Šaltinio kode konstanta deklaruojama kaip dvigubas žodis. Pažiūrėkime į failą 0x00000106, pakeisdami jį 0x00000111. Atminkite, kad baitų tvarka yra atvirkštinė. Rezultatas – dvi rungtynės, pataisas:

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

Eeeee... taip!

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

Tuo pristatymas galėjo baigtis, tačiau muzika skambėjo neilgai. Perkrovęs serverį, radau, kad kliento įrenginys nėra prijungtas!

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

Štai ir viskas. Net viską žinanti „Google“ negalėjo man į tai atsakyti. Ir tuo pačiu metu komanda rodyti serveryje esančius įrenginius rodo gana teisingai - čia yra raktas, galite jį prijungti. Bandau montuoti iš Linux – veikia! O jei dabar pabandyk iš Windows? O velnias - veikia!

Paskutinis grėblys: kažkas neįrašyta į serverio kodą. Bendrinant įrenginį, jis neskaito USB deskriptorių skaičiaus. O montuojant įrenginį iš Linux, šis laukas užpildomas. Deja, esu susipažinęs su kūrimu Linux sistemoje „make && make install“ lygiu. Todėl problema išspręsta gana purvinu įsilaužimu – pridedant prie /etc/rc.local

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

Dalies finalas

Šiek tiek pasmukdžius tai veikia. Norimas rezultatas gautas, dabar raktas gali būti pritvirtintas prie bet kurio kompiuterio (ir, žinoma, ir atjungtas), įskaitant tuos, kurie nėra transliavimo tinklo segmente. Jei norite, galite tai padaryti naudodami apvalkalo scenarijų. Kas yra malonu - malonumas yra visiškai nemokamas.
Tikiuosi, kad mano patirtis padės habrazhiteli apeiti grėblį, kuris įspaustas ant kaktos. Ačiū už dėmesį!

Šaltinis: www.habr.com

Добавить комментарий