Meitsje USB / IP

De taak fan it ferbinen fan in USB-apparaat oan in PC op ôfstân fia in lokaal netwurk komt geregeld foar. Under de besuniging is de skiednis fan myn sykopdrachten yn dizze rjochting, en it paad nei in klearmakke oplossing basearre op in iepen boarne projekt USB/IP mei in beskriuwing fan 'e obstakels soarchfâldich ynstallearre troch ferskate minsken lâns dit paad, likegoed as manieren om te omgean se.

Diel ien, histoarysk

As de masine firtueel is, is dit alles maklik. De funksjonaliteit fan USB-trochstjoering fan 'e host nei de firtuele masine ferskynde yn VMWare 4.1. Mar yn myn gefal moast de feiligenskaai, identifisearre as WIBU-KEY, op ferskillende tiden ferbûn wurde mei ferskate masines, en net allinich firtuele.
De earste syktocht werom yn 2009 late my ta in stik hardware neamd TrendNet TU2-NU4
Pros:

  • soms wurket it sels

Cons:

  • wurket net altyd. Litte wy sizze dat de beskermingskaai fan Guardant Stealth II der net troch begjint, en swarre mei de flater "it apparaat kin net wurde starte."
  • De software foar it behearen (lês: USB-apparaten yn- en útskeakelje) is ekstreem min. Kommandorigelskeakels, automatisearring - nee, wy hawwe net heard. Alles wurdt dien mei jo hannen. Nachtmerje.
  • De kontrôlesoftware siket nei de hardware sels op it netwurk troch útstjoeren, sadat it allinich wurket binnen ien útstjoersegment fan it netwurk. Jo kinne it IP-adres fan it stik hardware net manuell opjaan. Is it stik hardware op in oar subnet? Dan hawwe jo in probleem.
  • De ûntwikkelders hawwe it apparaat opjûn, it ferstjoeren fan brekrapporten is nutteloos.

De twadde ronde barde yn in tiid net sa fier, en late my nei it ûnderwerp fan it artikel - USB / IP projekt. Lokket mei syn iepenheid, benammen sûnt de jonges út ReactOS Se tekene in bestjoerder foar Windows, dus no sels op x64 wurket alles sûnder krukken lykas testmodus. Dêrfoar in protte tank oan it ReactOS-team! Alles klinkt moai, lit ús besykje it te fielen, is it echt sa? Spitigernôch is it projekt sels ek ferlitten, en jo kinne net rekkenje op stipe - mar wêr't ús net ferdwûn is, is de boarnekoade der, wy sille it útfine!

Diel twa, server-Linux

In USB / IP-tsjinner dy't USB-apparaten dielt oer in netwurk kin allinich ynstalleare wurde yn in Linux-basearre OS. No, Linux is Linux, ynstallearje Debian 8 op 'e firtuele masine yn in minimale konfiguraasje, standert hânbeweging:

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

Oprjochte. Dan suggerearret it ynternet dat jo de usbip-module moatte downloade, mar - hallo, earste rake. Der is gjin sa'n module. Dit komt om't de measte hânboeken op it netwurk ferwize nei de âldere branch 0.1.x, en yn 'e lêste 0.2.0 hawwe de usbip-modules ferskillende nammen.

Dêrom:

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

No, litte wy de folgjende rigels tafoegje oan /etc/modules om se automatysk te laden as it systeem begjint:

usbip-core
usbip-host
vhci-hcd

Litte wy de usbip-tsjinner begjinne:

sudo usbipd -D

Fierder fertelt de universele wiisheid ús dat usbip komt mei skripts wêrmei wy de tsjinner kinne beheare - lit sjen hokker apparaat it sil diele oer it netwurk, sjoch de status, ensfh. Hjir wachtet ús in oar túnark - dizze skripts yn 'e 0.2.x-tûke binne wer omneamd. Jo kinne in list mei kommando's krije mei help fan

sudo usbip

Nei it lêzen fan 'e beskriuwing fan' e kommando's, wurdt it dúdlik dat om it fereaske USB-apparaat te dielen, usbip syn Bus-ID wol útfine. Beste sjoggers, rake nûmer trije yn 'e arena: de Bus ID dy't ús sil jaan lsusb (it liket de meast foar de hân lizzende manier) - past har net! It feit is dat usbip hardware negeart lykas USB-hubs. Dêrom sille wy it ynboude kommando brûke:

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

Opmerking: hjir en fierder yn 'e listings sil ik alles beskriuwe mei it foarbyld fan myn spesifike USB-kaai. Jo hardware namme en VID: PID pear kin en sil wêze oars. Myn hjit Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

No kinne wy ​​ús apparaat diele:

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

Hoera, kameraden!

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)

Trije jubelen, kameraden! De tsjinner hat dield de hardware oer it netwurk, en wy kinne ferbine it! Alles wat oerbliuwt is om autostart fan 'e usbip-daemon ta te foegjen yn /etc/rc.local

usbipd -D

Diel trije, client-side en betiizjend

Ik besocht fuortendaliks it dielde apparaat oer it netwurk te ferbinen mei in masine dy't Debian op deselde server draait, en alles ferbûn perfekt:

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

Litte wy nei Windows gean. Yn myn gefal wie it Windows Server 2008R2 Standard Edition. De offisjele hantlieding freget jo om de bestjoerder earst te ynstallearjen. De proseduere is perfekt beskreaun yn 'e readme opnommen mei de Windows-kliïnt, wy dogge alles lykas skreaun, alles wurket. It wurket ek op XP sûnder swierrichheden.

Nei it útpakken fan de klant, besykje wy ús kaai te montearjen:

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

Oh oh. Der is wat misgien. Litte wy de Google-feardigens brûke. D'r binne fragmintaryske fermeldingen dat der wat mis is mei de konstanten; yn it serverdiel hawwe de ûntwikkelders de protokolferzje feroare by it ferpleatsen nei ferzje 0.2.0, mar yn 'e Win-client fergeaten se dit te dwaan. De foarstelde oplossing is om de konstante yn 'e boarnekoade te feroarjen en de kliïnt opnij op te bouwen.

Mar ik wol echt Visual Studio net downloade foar dizze proseduere. Mar ik haw de goede âlde Hiew. Yn 'e boarnekoade wurdt de konstante ferklearre as in dûbel wurd. Litte wy nei 0x00000106 sykje yn it bestân, it ferfangen troch 0x00000111. Ferjit net, de bytefolchoarder is omkeard. It resultaat is twa wedstriden, wy patchje:

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

Aaaand... ja!

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

Dit koe de ein fan it ferhaal wêze, mar de muzyk spile net lang. Nei it herstarten fan de tsjinner, ûntduts ik dat it apparaat op 'e kliïnt net is monteard!

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

Da's alles. Sels de alwittende Google koe dit net foar my beantwurdzje. En tagelyk toant it kommando om de beskikbere apparaten op 'e tsjinner wer te jaan hiel goed - hjir is it, de kaai, jo kinne it montearje. Ik besykje te mount fan Linux - it wurket! Wat as wy no besykje fan Windows? Oh horror - it wurket!

De lêste rake: wat waard net skreaun yn 'e serverkoade. By it dielen fan in apparaat lêst it it oantal USB-beskriuwings derfan net. En by it montearjen fan in apparaat fan Linux, wurdt dit fjild ynfolle. Spitigernôch bin ik bekend mei Linux-ûntwikkeling op it nivo "meitsje && meitsje install". Dêrom waard it probleem oplost mei in nochal smoarge hack - tafoegjen oan /etc/rc.local

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

Finale diel

Nei wat beproeving wurket it. It winske is berikt, no kin de kaai op elke PC monteare wurde (en fansels ek ûntslein), ek bûten it útstjoersegment fan it netwurk. As jo ​​​​wolle, kinne jo dit dwaan mei in kommando-shell-skript. Wat moai is, is dat it genot absolút fergees is.
Ik hoopje dat myn ûnderfining de hackers sil helpe om de rake te krijen dy't op myn foarholle is printe. Tank foar jo oandacht!

Boarne: www.habr.com

Add a comment