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 hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS 🔥 Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS - ProHoster