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. 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
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 - . Tërheq me transparencën e tij, sidomos që ata nga 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 usbipU 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 usbipTani, do të shtojmë në /etc/modules këto rreshta, për ta ngarkuar automatikisht gjatë fillimit të sistemit:
usbip-core
usbip-host
vhci-hcdTë nisim serverin usbip:
sudo usbipd -DMë 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 usbipPas 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ërfunduarUra, 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 -DPjesa 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-1Kalojmë 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 pajisjenOj-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 11Eee… po!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
pajisje USB e re e lidhur në portin usbvbus 1Kë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 pajisjenDhe ë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=00Pjesa 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
