Suflasim USB/IP

Rregullisht lind nevoja për të lidhur një pajisje USB me një PC të largët përmes një rrjeti lokal. Nën këtë, është treguar historia e kërkimeve të mia në këtë drejtim dhe rruga drejt zgjidhjes përfundimtare mbi bazën e një projekti open-source. USB/IP me përshkrimin e pengesave që janë vendosur me kujdes nga njerëz të ndryshëm gjatë këtij procesi, si dhe mënyrat për t'i kaluar ato.

Pjesa e parë, historike

Nëse makina është virtuale - gjithçka është e thjeshtë. Funksionaliteti i kalimit të USB nga host-i në makinat virtuale u shfaq që në VMWare 4.1. Por në rastin tim, çelësi i sigurisë, i njohur si WIBU-KEY, kishte nevojë të lidhej në momente të ndryshme me makina të ndryshme, dhe jo vetëm virtuale.
Rrjedha e parë e kërkimit në vitin 2009 më çoi tek një pajisje e quajtur TrendNet TU2-NU4
Avantazhet:

  • ndonjĂ«herĂ« funksionon

Disavantazhet:

  • nuk funksionon gjithmonĂ«. PĂ«r shembull, çelĂ«si i sigurisĂ« Guardant Stealth II nuk ndizet pĂ«rmes saj, duke dhĂ«nĂ« njĂ« gabim «pajisja nuk mund tĂ« nisë».
  • Software pĂ«r menaxhim (lexo - montim dhe demontim tĂ« pajisjeve USB) Ă«shtĂ« ekstremisht i varfĂ«r. ÇelĂ«sat e komandave, automatizimi - jo, nuk e kanĂ« dĂ«gjuar. Gjithçka bĂ«het vetĂ«m manualisht. NjĂ« makth.
  • Software-i menaxhues e kĂ«rkon pajisjen nĂ« rrjet pĂ«rmes broadcasting, kĂ«shtu qĂ« funksionon vetĂ«m brenda njĂ« segmenti tĂ« vetĂ«m tĂ« rrjetit. Nuk mund tĂ« vendosĂ«sh IP-nĂ« e pajisjes manualisht. Pajisja Ă«shtĂ« nĂ« njĂ« subnet tjetĂ«r? AtĂ«herĂ« ke njĂ« problem.
  • Zhvilluesit e kanĂ« lĂ«nĂ« mĂ«njanĂ« pajisjen, dĂ«rgimi i raporteve pĂ«r gabimet Ă«shtĂ« i pafrytshĂ«m.

Rrjedha e dytë ndodhi në një periudhë jo shumë të largët, dhe më çoi tek tema e artikullit - projekti USB/IP. Tërheq me transparencën e tij, sidomos që ata nga ReactOS kanë nënshkruar një drejtues për Windows, kështu që tani madje edhe në x64 gjithçka funksionon pa ndihma si regjimi i provës. Faleminderit shumë ekipit të ReactOS! Dukesh mirë, le të shohim nëse është ashtu siç duket? Fatkeqësisht, vetë projekti gjithashtu është lënë pas dore, dhe nuk mund të presim mbështetje - por ku është e keqja? Burimi është atje, do ta kuptojmë!

Pjesa e dytë, serveri-linuks

Serveri USB/IP, që ndan pajisjet USB nëpër rrjet, mund të ngrihet vetëm në sistemet operative të bazuara në Linux. Mirë, nëse është Linux, le të instalojmë në një makinë virtuale Debian 8 në një konfigurim minimal, lëvizja standarde:

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

U vendosĂ«m. MĂ« pas interneti na sugjeron qĂ« tĂ« ngarkojmĂ« modulin usbip, por - pĂ«rshĂ«ndetje, pengesa e parĂ«. S’tĂ« Ă«shtĂ« njĂ« modul i tillĂ«. Dhe kjo pĂ«r shkak se shumica e udhĂ«zimeve nĂ« internet i pĂ«rkasin njĂ« dege mĂ« tĂ« vjetĂ«r 0.1.x, ndĂ«rsa nĂ« versionin mĂ« tĂ« fundit 0.2.0 modulat usbip kanĂ« emra tĂ« ndryshĂ«m.

Prandaj:

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

Tani, do të shtojmë në /etc/modules këto rreshta, për ta ngarkuar automatikisht gjatë fillimit të sistemit:

usbip-core
usbip-host
vhci-hcd

TĂ« nisim serverin usbip:

sudo usbipd -D

Më pas, mendja universale na sugjeron se me usbip vijnë skriptet që na lejojnë të menaxhojmë serverin - të shohim cilin pajisje do të ndajë në rrjet, të kontrollojmë statusin, dhe kështu me radhë. Këtu na pret një tjetër vegël kopshtarie - këto skripte në degën 0.2.x, po ashtu, janë ribërë. Lista e komandave mund të merret me anë të

sudo usbip

Pas leximit të përshkrimit të komandave, bëhet e qartë se për të ndarë pajisjen USB të kërkuar, usbip do të dojë të dijë ID-në e Bus-it. Të dashur shikues, në arenën e pengesave kemi numrin tre: ai Bus ID që do të na jepet nga lsusb (duket si rruga më e qartë) - nuk i përshtatet! Po, kjo sepse pajisjet si USB-hub për usbip injorohen. Prandaj, do të përdorim komandën e integruar:

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

Shënim: këtu dhe më pas në listime do ta përshkruaj gjithçka duke u bazuar në shembullin tim të pazakontë USB. Emrat e pajisjeve tuaja dhe paketa VID:PID mund të ndahen dhe do të jenë të ndryshëm. E imja quhet Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Tani mund të ndajmë pajisjen tonë:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: lidh pajisjen në busid 1-1: e përfunduar

Ura, shokë!

user@usb-server:~$ sudo usbip list -r localhost
Pajisje USB të ndara
======================
 - 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 Specifike e Furnizuesit / nënklasa e panjohur / protokolli i panjohur (ff/00/ff)

Ura të trefishta, shokë! Serveri ndau pajisjen në rrjet, dhe ne mund ta lidhim atë! Tani na mbetet vetëm të shtojmë fillimin automatik të demonit usbip në /etc/rc.local

usbipd -D

Pjesa e tretë, klienti dhe e komplikuar

Kam provuar të lidhem me pajisjen e ndarë në rrjet në makinën e drejtuar nga Debian menjëherë në atë server dhe gjithçka u lidh shkëlqyer:

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

Kalojmë në Windows. Në rastin tim, ishte Windows Server 2008R2 Edition Standard. Manuali zyrtar kërkon që fillimisht të instaloni driverin. Procedura është shkruar shkëlqyeshëm në readme që shoqëron klientin e Windows, bëjmë gjithçka siç thuhet, çdo gjë funksionon. Në XP gjithashtu funksionon pa asnjë pengesë.

Pasi të zbërthejmë klientin, provoni të lidheni me çelësin tonë:

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) nuk mund të gjeni pajisjen

Oj-oj. Diçka ka shkuar keq. PĂ«rdorim aftĂ«sinĂ« pĂ«r tĂ« gjetur nĂ« Google. Hasim pĂ«rmendje tĂ« fragmentuara qĂ« diçka nuk Ă«shtĂ« nĂ« rregull me konstantet, nĂ« pjesĂ«n server, zhvilluesit e ndryshuan versionin e protokollit ndĂ«rsa nĂ« klientin pĂ«r Win kĂ«tĂ« harroi ta bĂ«jĂ«. Zgjidhja e propozuar Ă«shtĂ« — ndryshoni konstantĂ«n nĂ« kod dhe rindizni klientin.

MegjithatĂ«, nuk mĂ« pĂ«lqen tĂ« shkarkoj Visual Studio pĂ«r kĂ«tĂ« procedurĂ«. Por kam Hiew-in e vjetĂ«r dhe tĂ« mirĂ«. NĂ« kod, konstanta Ă«shtĂ« shpallur si njĂ« fjalĂ« e dyfishtĂ«. Le tĂ« kĂ«rkojmĂ« nĂ« skedarin 0x00000106, duke e zamĂ« nĂ« 0x00000111. Mos harroni, rendi i byte-ve Ă«shtĂ« i kundĂ«rt. Rezultati — dy pĂ«rputhje, e patchojmĂ«:

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

Eee
 po!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
pajisje USB e re e lidhur në portin usbvbus 1

Këtu mund të mbyllja tregimin, por muzika nuk luajti për një kohë të gjatë. Pas rindezjes së serverit, kuptova se pajisja në klient nuk po lidhej!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) nuk mund të gjeni pajisjen

Dhe Ă«shtĂ« gjithçka. PĂ«r kĂ«tĂ« nuk mundi tĂ« pĂ«rgjigjej as Google-i gjithnjĂ« nĂ« dijeni. NdĂ«rkohĂ«, komandĂ«s pĂ«r tĂ« renditur pajisjet e disponueshme nĂ« server i tregon shumĂ« mirĂ« — ja ai, çelĂ«si, mund tĂ« lidhni. Provova tĂ« lidhem nga Linux — funksionon! Dhe nĂ«se tani provoj nga Windows? Oh, tmerr — kjo funksionon!

Gjobat e fundit: diçka nĂ« kodin e serverit Ă«shtĂ« e paplotĂ«. Kur ndash pajisjen, ai nuk lexon numrin e USB-deskriptorĂ«ve nga ajo. NdĂ«rsa kur lidhet pajisja nga Linux, ky fushĂ« plotĂ«sohet. FatkeqĂ«sisht, nĂ« zhvillimin nĂ«n Linux njoh vetĂ«m nivelin 'make && make install'. Prandaj problemi Ă«shtĂ« zgjidhur me njĂ« hack tĂ« mrekullueshĂ«m — duke shtuar nĂ« /etc/rc.local

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

Pjesa përfundimtare

Pas disa pĂ«rpjekjesh, kjo funksionon. Ajo qĂ« dĂ«shirohej Ă«shtĂ« arritur, tani çelĂ«si mund tĂ« lidhet me çdo PC (dhe gjithashtu tĂ« shkĂ«putet, natyrisht), pĂ«rfshirĂ« – jashtĂ« segmentit tĂ« shpĂ«rndarjes sĂ« rrjetit. NĂ«se dĂ«shiron – mund ta bĂ«sh kĂ«tĂ« pĂ«rmes njĂ« skripti tĂ« shell-it. E bukura Ă«shtĂ« se kjo Ă«shtĂ« absolutisht falas.
Shpresoj që përvoja ime t'i ndihmojë përdoruesit e Habra të evitojnë ato pengesa që më janë gjurmëzuar në ballë. Faleminderit për vëmendjen!

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster