Regulaarselt tekib vajadus ĂŒhendada USB-seade kaug-PC-ga ĂŒle kohaliku vĂ”rgu. Tagapool olen kirjeldanud oma otsingute ajalugu selles suunas ja teed valmislahendusele avatud lĂ€htekoodiga projekti alusel. kuna sellel teel on erinevad inimesed hoolikalt paigaldatud takistused ja nende ĂŒletamise viisid.
Esimene osa, ajalooline
Kui masin on virtuaalne, pole see keeruline. USB edastamise funktsionaalsus hostilt virtuaalmasinasse ilmus juba VMWare 4.1-s. Kuid minu puhul tuli kaitse vĂ”tme, mis tuvastatakse kui WIBU-KEY, erinevatel aegadel ĂŒhendada erinevatesse masinatesse, mitte ainult virtuaalsetesse.
Esmane otsing 2009. aastal viis mind seadme juurde nimega
Plussid:
- mÔnikord töötab isegi
Miinused:
- kuid ei tööta alati. NÀiteks kaitse vÔtme Guardant Stealth II kaudu see ei kÀivitunud, andes veateate 'seadet ei saa kÀivitada'.
- Juhtimisprogramm (loe: USB-seadmete mountimine ja unmountimine) on ÀÀrmiselt vilets. KĂ€skude read, automatiseerimine â ei, pole kuulnud. KĂ”ik kĂ€ib ainult kĂ€sitsi. Kohutav.
- Juhtimisprogramm otsib seadet vĂ”rgus laia levikuga, seega töötab see ainult ĂŒhe broadcast-segmendi ulatuses. Seadme IP-aadressi ei saa kĂ€sitsi mÀÀrata. Kui seade on teises alavĂ”rgus? Siis on teil probleem.
- Arendajad on seadme puhul kĂ€ed ĂŒles tĂ”stnud, vigade aruande saatmine on mĂ”ttetu.
Teine voor juhtus juba mitte nii kaugel minevikus ja viis mind artikli teemani â . Selle avatus tĂ”mbab tĂ€helepanu, seda enam, et ReactOS-i mehed on sellele Windowsi draiveri alla kirjutanud, nii et nĂŒĂŒd töötab kĂ”ik isegi x64 all ilma igasuguste testreĆŸiimi kĂ€tetuksideta. Selle eest on ReactOS meeskonnale suur tĂ€nu! KĂ”ik kĂ”lab kenasti, proovime vĂ€lja selgitada, kas see on tĂ”esti nii? Kahjuks on projekt ka natuke kĂ”rvale jÀÀnud ja toetusele ei tasu loota â aga kus meie kaotame, allikas on olemas, saame aru! Teine osa, serveri ja Linuxi jagamine
USB/IP server, mis jagab USB-seadmeid ĂŒle vĂ”rgu, saab ĂŒles seada ainult Linuxi-pĂ”histel operatsioonisĂŒsteemidel. No mis siis, Linux ongi Linux, paigaldame virtuaalmasinale Debian 8 minimaalset konfiguratsiooni, standardne kĂ€te liikumine:
sudo apt-get update sudo apt-get upgrade sudo apt-get install usbip
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbipPaigaldasid. Edasi ĂŒtleb internet, et peaks laadima usbip mooduli, aga â tere, esimesed takistused. Sellist moodulit ei ole. KĂ”ik on tingitud sellest, et enamik juhendeid internetis viitab vanemale 0.1.x harule, samas kui viimases 0.2.0 versioonis on usbip moodulitel teised nimed.
Seega:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbipNĂŒĂŒd lisame failisse /etc/modules jĂ€rgmised read, et laadida need automaatselt sĂŒsteemi kĂ€ivitamisel:
usbip-core
usbip-host
vhci-hcdKĂ€ivitame usbip serveri:
sudo usbipd -DEdasi ĂŒtleb meile universaalne tarkus, et koos usbip-ga tulevad skriptid, mis vĂ”imaldavad serverit juhtida â nĂ€idata, millist seadet jagatakse vĂ”rgu kaudu, vaadata staatust jne. Siin ootab meid veel ĂŒks takistus â need skriptid on 0.2.x harus taas ĂŒmber nimetatud. Saame kĂ€su loendi kasutades
sudo usbipKĂ€skude kirjeldust lugedes saab selgeks, et selleks, et jagada soovitud USB-seadet, tahab usbip teada selle Bus ID-d. Kallid vaatajad, areenil on kolm erinevat takistust: see Bus ID, mille annab meil lsusb (tundub, et kĂ”ige ilmselgem tee) â ei sobi! Asi on selles, et usbip ignoreerib seadmestikke, nagu USB-hubid. SeetĂ”ttu kasutame sisseehitatud kĂ€sku:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)MÀrkus: siin ja edaspidi kirjeldan loetelusid minu konkreetse USB-mÀlupulga nÀite pÔhjal. Teie seadme nimi ja paar VID:PID vÔivad erineda. Minu seade on Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
NĂŒĂŒd saame jagada meie seadet:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: completeHurraa, tovaroosid!
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)Kolm korda hurraa, tovaroosid! Server jagas seadet vĂ”rgu kaudu, ja me saame selle ĂŒhendada! JĂ€rgmine, tuleb kirjutada usbip deemonisse autostart failis /etc/rc.local
usbipd -DKolmas osa, kliendi ja keeruline
Jagatud seadet proovisin vĂ”rgu kaudu ĂŒhendada Debianiga masina peal samal serveril, ja kĂ”ik ĂŒhendas suurepĂ€raselt:
sudo usbip attach --remote=localhost --busid=1-1Liigume Windowsi juurde. Minu puhul oli see Windows Server 2008R2 Standard Edition. Ametlik juhend palub kÔigepealt installida draiveri. Protseduur on suurepÀraselt kirjeldatud Windowsi kliendi README-s, teeme kÔik, nagu seal on kirjutatud, ning kÔik toimib. XP puhul töötab samuti ilma igasuguste raskusteta.
Pakendist vÀlja vÔttes proovime meie vÔtme monteerida:
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) seadet ei leitudOh-oh. Midagi lĂ€ks valesti. Kasutame Google'i oskuseid. Kohtame katkendlikke mainimisi, et midagi on seal konstanditega valesti, serveri poolel muutis arendajatel versioon 0.2.0 puhul protokolli versiooni, kuid Windowsi kliendi jaoks unustati see muuta. Pakutud lahendus on â vahetage konstandi allika koodis ja kompileerige klient uuesti.
Aga ma ei soovi Visual Studiot selle protseduuri jaoks laadida. KĂŒll aga on mul vana hea Hiew. Allikas defineerib konstandi kui topelt-sĂ”na. Otsime failist 0Ń 00000106, vahetades selle 0Ń 00000111 vastu. Ărge unustage, et baitide jĂ€rjekord on vastupidine. Tulemus â kaks vastet, patĆĄime:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11Ja⊠jah!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
uus USB-seade on ĂŒhendatud usbvbus porti 1Sellega vĂ”iks jutu lĂ”petada, kuid muusika ei mĂ€nginud kaua. Serveri taaskĂ€ivitamisel avastasin, et seade ei monteeru kliendil!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) seadet ei leitudJa kĂ”ik. Sellele ei osanud isegi kĂ”iketeadev Google vastata. Samas kuvab kĂ€sk seadmete loendi serveris tĂ€ielikult korrektselt â siin on see, vĂ”tme saate monteerida. Proovin monteerida Linuxist â töötab! Aga kui nĂŒĂŒd proovida Windowsist? Oh Ă”udust â see toimib!
Viimased takistused: midagi on serverikoodis puudu. Seadet jagades ei loeta seadmest USB-deskriiptorite arvu. Kuid seadme monteerimisel Linuxist tĂ€idetakse see vĂ€li. Kahjuks olen Linuxi arendamisega tuttav ainult "make && make install" tasemel. Seega on probleem lahendatud pĂ€ris rĂ€pase hĂ€kkimisega â lisades /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00LÔpuosa
PĂ€rast mĂ”ningaid katsumusi töötab see. Soovitud on saavutatud, nĂŒĂŒd saab vĂ”tme kinnitada igasse arvutisse (ja loomulikult ka eemaldada), sealhulgas - vĂ€ljaspool vĂ”rgusegmenti. Kui soovite - saate seda teha kĂ€surea skripti abil. Mis on tore - see on tĂ€iesti tasuta.
Loodan, et minu kogemus aitab Habr-i lugejatel vÀltida neid karide, mis on mulle meelde jÀÀnud. AitÀh tÀhelepanu eest!
Allikas: habr.com
