Det oppstÄr ofte behov for Ä koble USB-enheter til en ekstern PC via et lokalt nettverk. Under finner du historien om min sÞken pÄ dette omrÄdet, og veien til en ferdig lÞsning basert pÄ et open-source prosjekt. med beskrivelser av de ulike hindringene som folk har lagt inn pÄ veien, samt mÄtene Ä omgÄ dem pÄ.
Del én, historisk
Hvis maskinen er virtuell, er dette ikke vanskelig. Funksjonaliteten for Ä dirigere USB fra vert til virtuell maskin dukket opp allerede i VMWare 4.1. Men i mitt tilfelle mÄtte beskyttelsesnÞkkelen, som er identifisert som WIBU-KEY, kobles til forskjellige maskiner pÄ forskjellige tidspunkter, og ikke bare virtuelle.
Den fĂžrste runden med sĂžk i det fjerne 2009 fĂžrte meg til en enhet kalt
Fordeler:
- noen ganger fungerer den faktisk
Ulemper:
- men fungerer ikke alltid. La oss si at beskyttelsesnÞkkelen Guardant Stealth II ikke starter via den, og gir feilmeldingen «enheten kan ikke startes».
- Programvaren for Ă„ administrere (lese â montere og demontere USB-enheter) er helt elendig. Kommandolinjeinnstillinger, automatisering â nei, har ikke hĂžrt om det. Alt mĂ„ gjĂžres manuelt. En mareritt.
- styringsprogramvaren leter etter selve enheten i nettverket via broadcasting, sÄ det fungerer bare innenfor ett broadcast-segment av nettverket. Det er ikke mulig Ä angi IP-adressen til enheten manuelt. Er enheten i et annet subnett? Da har du et problem.
- utviklerne har gitt opp med enheten, det er nyttelĂžst Ă„ sende inn feilrapporter.
Den andre runden skjedde i ikke sĂ„ avsides tid, og fĂžrte meg til temaet for artikkelen â . Det tiltrekker med Ă„penheten, spesielt siden gutta fra har signert driveren for Windows, sĂ„ nĂ„ fungerer det til og med pĂ„ x64 uten noen krinkelkroker som testmodus. Takk til ReactOS-teamet! Alt hĂžres bra ut, la oss prĂžve Ă„ sjekke om det er sĂ„nn i virkeligheten? Dessverre er ogsĂ„ selve prosjektet litt nedprioritert, og man kan ikke forvente stĂžtte â men hvor er vĂ„r vilje, koden er der, vi skal klare det!
Del to, server- og Linux-delen
USB/IP-serveren, som deler USB-enheter over nettverket, kan kun settes opp i Linux-baserte OS. Vel, Linux er Linux, sÄ vi installerer Debian 8 i minimal konfigurasjon pÄ virtuelt maskin, standard bevegelse med hendene:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbipVi har installert. Videre forteller internett oss at vi mĂ„ laste ned usbip-modulen, men â hei, fĂžrste hindring. Det finnes ikke en slik modul. Alt dette skyldes at de fleste veiledninger pĂ„ nettet refererer til en eldre versjon 0.1.x, mens i den nyeste 0.2.0 har usbip-modulene andre navn.
Derfor:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbipOg sÄ legger vi til disse linjene i /etc/modules for Ä laste dem automatisk ved systemstart:
usbip-core
usbip-host
vhci-hcdVi starter usbip-serveren:
sudo usbipd -DVidere forteller den kollektive intelligensen oss at det fĂžlger med skript for usbip, som lar oss administrere serveren â vise hvilket enhet den vil dele over nettverket, sjekke status, og sĂ„ videre. Her mĂžter vi et nytt problem â disse skriptene i versjon 0.2.x er ogsĂ„ omdĂžpt. For Ă„ fĂ„ en liste over kommandoene kan vi bruke
sudo usbipEtter Ă„ ha lest beskrivelsen av kommandoene, blir det klart at for Ă„ dele den nĂždvendige USB-enheten, Ăžnsker usbip Ă„ vite Bus ID-en. Mine damer og herrer, hindring nummer tre: den Bus ID-en som vil bli gitt til oss lsusb (tilsynelatende den mest Ă„penbare veien) â passer ikke! Problemet er at usbip ignorerer maskinvare som USB-huber. Derfor bruker vi den innebygde kommandoen:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)Merk: her og videre i opplistingene vil jeg beskrive alt med eksemplet mitt spesifikke USB-minne. Ditt maskinvare navn og VID:PID kan avvike. Min heter Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
NÄ kan vi dele enheten vÄr:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: completeHurra, kamerater!
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)Trekelt hurra, kamerater! Serveren har delt maskinvaren over nettet, og vi kan koble den til! Bare Ă„ legge til automatisk oppstart av usbip-demonen i /etc/rc.local
usbipd -DDel tre, klient og forvirrende
Jeg prÞvde Ä koble til den delte enheten over nettverket til en maskin som kjÞrer Debian umiddelbart pÄ den samme serveren, og alt koblet seg perfekt:
sudo usbip attach --remote=localhost --busid=1-1Vi gÄr videre til Windows. I mitt tilfelle var det Windows Server 2008R2 Standard Edition. Den offisielle veiledningen ber om at du fÞrst installerer driveren. Prosedyren er beskrevet grundig i vedlagte readme til Windows-klienten, vi gjÞr alt som beskrevet, og det fungerer perfekt. Det fungerer ogsÄ uten problemer pÄ XP.
Etter Ä ha pakket ut klienten, prÞver vi Ä montere vÄr USB-nÞkkel:
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) kan ikke finne enhetĂ nei. Noe gikk galt. Vi bruker Google-sĂžk. Det er sporadiske omtaler om at noe ikke er riktig med konstantene; utviklerne endret protokollversjonen i serverdelen til versjon 0.2.0, men glemte Ă„ gjĂžre det i klienten for Windows. Anbefalt lĂžsning â endre konstanten i kildekoden og kompilere klienten pĂ„ nytt.
Jeg vil helst ikke laste ned Visual Studio bare for denne prosedyren. Heldigvis har jeg den gamle gode Hiew. I kildekoden er konstanten erklĂŠrt som et dobbelt ord. La oss lete i filen 0x00000106, og erstatte med 0x00000111. Husk at byte-rekkefĂžlgen er omvendt. Resultatet â to treff, vi patcher:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11Og ja!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
ny usb-enhet koblet til usbvbus-port 1Dette kunne vÊrt slutten pÄ historien, men musikken spilte ikke lenge. Etter Ä ha startet serveren pÄ nytt, oppdaget jeg at enheten ikke monteres pÄ klienten!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) kan ikke finne enhetOg det er det. Ingen Google kunne gi meg et svar. Samtidig viser kommandoen for Ă„ vise tilgjengelige enheter pĂ„ serveren helt korrekt â der er den, nĂžkkelen, du kan montere den. Jeg prĂžver Ă„ montere fra Linux â det fungerer! Og hva om vi prĂžver fra Windows nĂ„? Ă h neida â det fungerer!
Siste utfordring: noe i serverkoden er ikke ferdigskrevet. Ved deling av enheten leser den ikke antallet USB-deskriptorer. Men nĂ„r enheten monteres fra Linux, fylles dette feltet. Dessverre er jeg bare kjent med Linux-utvikling pĂ„ nivĂ„et "make && make install". Derfor er problemet lĂžst med en litt dirty hack â ved Ă„ legge til i /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00Avsluttende del
Etter en del strev, fungerer det nÄ. Det Þnskede er oppnÄdd, nÄ kan nÞkkelen monteres til enhver PC (og demonteres selvfÞlgelig ogsÄ), inkludert utenfor det brede nettverkssegmentet. Hvis man Þnsker det, kan dette gjÞres med et kommandoskallskript. Det fine er at dette er helt gratis.
Jeg hÄper at min erfaring kan hjelpe hubaere Ä unngÄ de fallgruvene som har satt seg i pannen min. Takk for oppmerksomheten!
Kilde: habr.com
