Tämja USB/IP

Uppgiften att ansluta en USB-enhet till en fjärrdator via ett lokalt nätverk uppstår regelbundet. Under klippet anges historiken för mina sökningar i denna riktning, och vägen till en färdig lösning baserad på ett projekt med öppen källkod USB/IP med en beskrivning av de hinder som noggrant satts upp av olika personer på denna väg, samt sätt att kringgå dem.

Del ett, historisk

Om maskinen är virtuell är allt detta enkelt. Funktionaliteten för USB-vidarebefordran från en värd till en virtuell maskin dök upp i VMWare 4.1. Men i mitt fall måste säkerhetsnyckeln, som känns igen som WIBU-KEY, vara ansluten vid olika tidpunkter till olika maskiner, och inte bara virtuella.
Den första omgången av sökning i det avlägsna 2009 ledde mig till en bit järn som heter TrendNet TU2-NU4
Fördelar:

  • ibland fungerar det till och med

Nackdelar:

  • fungerar inte alltid. Anta att skyddsnyckeln för Guardant Stealth II inte startar genom den, svär med felet "enheten kan inte startas".
  • Managementprogramvara (läs - montering och avmontering av USB-enheter) är patetisk till det extrema. Kommandoradsomkopplare, automation - nej, har inte hört. Allt är bara för hand. Mardröm.
  • kontrollmjukvaran söker efter själva järnbiten i nätverket genom att sända, så detta fungerar bara inom ett sändningsnätverkssegment. Du kan inte ange IP-adressen för järnbiten för hand. En bit järn i annat subnät? Då har du ett problem.
  • utvecklare gjorde poäng på enheten är det värdelöst att skicka felrapporter.

Den andra omgången hände i tider som inte var så långt borta och ledde mig till ämnet för artikeln - USB/IP-projekt. Lockar med öppenhet, speciellt eftersom killarna från ReactOS de signerade en drivrutin för Windows, så nu fungerar allt även på x64 utan några kryckor som ett testläge. För vilket stort tack till ReactOS-teamet! Allt låter vackert, låt oss försöka känna det, är det verkligen så? Tyvärr är själva projektet också övergivet, och du kan inte räkna med stöd - men där vårt inte försvann, källan finns där, vi kommer att reda ut det!

Del två, server-linux

En USB/IP-server som delar USB-enheter över ett nätverk kan endast konfigureras på ett Linux-baserat operativsystem. Tja, Linux är Linux, vi installerar Debian 8 på en virtuell maskin i minimikonfigurationen, standardhandrörelse:

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

Fast. Vidare föreslår Internet att du skulle behöva ladda ner usbip-modulen, men - hej, den första raken. Det finns ingen sådan modul. Och allt för att de flesta av manualerna på nätverket hänvisar till den äldre grenen 0.1.x, och i den senaste 0.2.0 har usbip-modulerna olika namn.

därför:

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

Tja, låt oss lägga till följande rader till /etc/modules för att ladda dem automatiskt vid systemstart:

usbip-core
usbip-host
vhci-hcd

Låt oss starta usbip-servern:

sudo usbipd -D

Vidare berättar det universella sinnet för oss att usbip kommer med skript som låter oss hantera servern - visa vilken enhet den kommer att dela över nätverket, se status och så vidare. Här väntar ett annat trädgårdsverktyg på oss - dessa skript i 0.2.x-grenen har återigen döpts om. Du kan få en lista över kommandon med

sudo usbip

Efter att ha läst beskrivningen av kommandona blir det klart att för att dela den erforderliga USB-enheten vill usbip veta dess buss-ID. Kära tittare, rake nummer tre är på arenan: Buss-ID som kommer att ge oss lsusb (det verkar vara det mest självklara sättet) - det passar inte henne! Faktum är att usbip ignorerar hårdvara som USB-hubbar. Därför kommer vi att använda det inbyggda kommandot:

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

Notera: nedan i listorna kommer jag att beskriva allt med exemplet på min specifika USB-nyckel. Ditt maskinvarunamn och VID:PID-par kan och kommer att skilja sig åt. Min heter Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nu kan vi dela vår enhet:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

Hurra, kamrater!

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)

Tre heja, kamrater! Servern delade järnbiten över nätverket och vi kan ansluta den! Det återstår bara att lägga till autostarten av usbip-demonen till /etc/rc.local

usbipd -D

Del tre, klientsidan och förvirrande

Jag försökte ansluta den delade enheten över nätverket till en Debian-maskin direkt på samma server, och allt ansluts bra:

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

Låt oss gå vidare till Windows. I mitt fall var det Windows Server 2008R2 Standard Edition. Den officiella guiden ber dig installera drivrutinen först. Förfarandet är perfekt beskrivet i readme som är bifogat till Windows-klienten, vi gör allt som det är skrivet, allt fungerar. På XP fungerar det också utan problem.

Efter att ha packat upp klienten försöker vi montera vår nyckel:

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) cannot find device

Åh åh. Något gick fel. Vi använder Googles skicklighet. Det finns fragmentariska omnämnanden om att något är fel med konstanterna, i serverdelen ändrade utvecklarna protokollversionen när de bytte till version 0.2.0, men de glömde att göra detta i Win-klienten. Den föreslagna lösningen är att ändra konstanten i källkoden och bygga om klienten.

Men jag vill verkligen inte ladda ner Visual Studio för den här procedurens skull. Men jag har en bra gammal Hiew. I källkoden deklareras konstanten som ett dubbelord. Låt oss titta i filen efter 0x00000106 och ersätta den med 0x00000111. Kom ihåg att byteordningen är omvänd. Resultatet är två matcher, patch:

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

Eeeee... ja!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

Detta kunde ha avslutat presentationen, men musiken spelade inte länge. Efter att ha startat om servern upptäckte jag att enheten på klienten inte är monterad!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Och det är allt. Inte ens allvetande Google kunde svara på detta åt mig. Och samtidigt visas kommandot för att visa enheter tillgängliga på servern helt korrekt - här är den, nyckeln, du kan montera den. Jag försöker montera från under Linux - det fungerar! Och om nu försöker från under Windows? Oh shit - det fungerar!

Den sista raken: något läggs inte till i serverkoden. När du delar en enhet läser den inte antalet USB-beskrivningar från den. Och när du monterar enheten från Linux är detta fält ifyllt. Tyvärr är jag bekant med utveckling under Linux på nivån "make && make install". Därför löses problemet med ett ganska smutsigt hack - lägg till /etc/rc.local

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

Delfinal

Efter lite pyssel så funkar det. Det önskade resultatet har uppnåtts, nu kan nyckeln monteras på vilken PC som helst (och avmonteras naturligtvis också), även utanför sändningsnätverket. Om du vill kan du göra det med hjälp av ett skalskript. Vad som är trevligt - nöjet är helt gratis.
Jag hoppas att min erfarenhet kommer att hjälpa habrazhiteli att komma runt krattan som präglade min panna. Tack för din uppmärksamhet!

Källa: will.com

Lägg en kommentar