USB/IP kesyttäminen

USB-laitteen liittäminen etätietokoneeseen paikallisverkon kautta tulee säännöllisesti esiin. Leikkauksen alla hahmottuu tämänsuuntaisten hakujeni historia ja polku avoimeen lähdekoodiin perustuvaan valmiiseen ratkaisuun USB/IP kuvauksen esteistä, joita eri ihmiset ovat asettaneet huolellisesti tälle polulle, sekä tavoista ohittaa ne.

Ensimmäinen osa, historiallinen

Jos kone on virtuaalinen - kaikki tämä on helppoa. USB-välitys isännästä virtuaalikoneeseen ilmestyi VMWare 4.1:ssä. Mutta minun tapauksessani suojausavain, joka tunnistetaan nimellä WIBU-KEY, oli yhdistettävä eri aikoina eri koneisiin, ei vain virtuaalisiin.
Ensimmäinen etsintäkierros kaukaisessa 2009 johti minut raudanpalaan nimeltä TrendNet TU2-NU4
Plussat:

  • joskus se jopa toimii

Miinukset:

  • ei aina toimi. Oletetaan, että Guardant Stealth II -suojausavain ei käynnisty sen kautta ja vannoo virheellä "laitetta ei voida käynnistää".
  • Hallintaohjelmisto (lue - USB-laitteiden kiinnitys ja irrottaminen) on säälittävää äärimmäisyyksiin asti. Komentorivikytkimet, automaatio - ei, en ole kuullut. Kaikki on vain käsin. Painajainen.
  • ohjausohjelmisto etsii itse raudanpalaa verkosta lähettämällä, joten tämä toimii vain yhdessä lähetysverkkosegmentissä. Raudanpalan IP-osoitetta ei voi määrittää käsin. Raudanpala toisessa aliverkossa? Sitten sinulla on ongelma.
  • kehittäjät pisteyttivät laitteeseen, on turha lähettää virheilmoituksia.

Toinen kierros tapahtui aikoina, jotka eivät olleet niin kaukana, ja johti minut artikkelin aiheeseen - USB/IP-projekti. Houkuttelee avoimuudella, varsinkin kun kaverit ko ReactOS he allekirjoittivat ajurin Windowsille, joten nyt kaikki toimii jopa x64:llä ilman kainalosauvoja, kuten testitila. Siitä suuri kiitos ReactOS-tiimille! Kaikki kuulostaa kauniilta, yritetään tuntea se, onko se todella niin? Valitettavasti itse projekti on myös hylätty, etkä voi luottaa tukeen - mutta missä meidän omamme ei kadonnut, lähde on siellä, me selvitämme sen!

Osa kaksi, palvelin-linux

USB/IP-palvelin, joka jakaa USB-laitteita verkon kautta, voidaan määrittää vain Linux-pohjaisessa käyttöjärjestelmässä. No, Linux on Linux, asennamme Debian 8:n virtuaalikoneeseen minimikokoonpanolla, tavallisella käden liikkeellä:

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

Rajattu. Lisäksi Internet ehdottaa, että sinun pitäisi ladata usbip-moduuli, mutta - hei, ensimmäinen rake. Sellaista moduulia ei ole. Ja kaikki siksi, että suurin osa verkon käsikirjoista viittaa vanhempaan haaraan 0.1.x, ja uusimmassa 0.2.0:ssa usbip-moduuleilla on eri nimet.

siksi:

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

No, lisätään seuraavat rivit tiedostoon /etc/modules ladataksesi ne automaattisesti järjestelmän käynnistyksen yhteydessä:

usbip-core
usbip-host
vhci-hcd

Aloitetaan usbip-palvelin:

sudo usbipd -D

Lisäksi universaali mieli kertoo meille, että usbip sisältää komentosarjoja, joiden avulla voimme hallita palvelinta - näyttää minkä laitteen se jakaa verkossa, nähdä tilan ja niin edelleen. Täällä meitä odottaa toinen puutarhatyökalu - nämä skriptit 0.2.x-haarassa on jälleen nimetty uudelleen. Voit saada luettelon komennoista käyttämällä

sudo usbip

Komentojen kuvauksen lukemisen jälkeen käy selväksi, että halutun USB-laitteen jakamiseksi usbip haluaa tietää väylätunnuksensa. Hyvät katsojat, rake numero kolme on areenalla: bussitunnus, joka meille antaa lsusb (se vaikuttaisi ilmeisimmältä) - se ei sovi hänelle! Tosiasia on, että usbip jättää huomioimatta laitteistot, kuten USB-keskittimet. Siksi käytämme sisäänrakennettua komentoa:

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

Huomautus: jäljempänä luetteloissa kuvailen kaiken käyttämällä esimerkkiä tietystä USB-avaimestani. Laitteistosi nimi ja VID:PID-pari voivat vaihdella. Omani on nimeltään Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nyt voimme jakaa laitteemme:

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

Hurraa, toverit!

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)

Kolme hurraaa, toverit! Palvelin jakoi raudan verkon yli, ja voimme yhdistää sen! On vain lisättävä usbip-daemonin automaattinen käynnistys tiedostoon /etc/rc.local

usbipd -D

Kolmas osa, asiakaspuolen ja hämmentävä

Yritin yhdistää jaetun laitteen verkon kautta Debian-koneeseen heti samalla palvelimella, ja kaikki liittyi hyvin:

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

Siirrytään Windowsiin. Minun tapauksessani se oli Windows Server 2008R2 Standard Edition. Virallinen opas pyytää sinua asentamaan ohjaimen ensin. Menettely on kuvattu täydellisesti Windows-asiakkaan liitetyssä readme-tiedostossa, teemme kaiken kuten on kirjoitettu, kaikki toimii. XP:ssä toimii myös ilman ongelmia.

Asiakkaan pakkauksesta purkamisen jälkeen yritämme kiinnittää avaimemme:

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

Voi voi. Jotain meni pieleen. Käytämme Googlen taitoa. Hajanaisia ​​mainintoja siitä, että vakioissa on jotain vialla, palvelinosassa kehittäjät vaihtoivat protokollaversiota vaihtaessaan versioon 0.2.0, mutta unohtivat tehdä tämän Win-asiakasohjelmassa. Ehdotettu ratkaisu on muuttaa lähdekoodin vakio ja rakentaa asiakas uudelleen.

Mutta en todellakaan halua ladata Visual Studiota tämän menettelyn vuoksi. Mutta minulla on vanha kunnon Hiew. Lähdekoodissa vakio ilmoitetaan kaksoissanana. Etsitään tiedostosta 0x00000106 ja korvataan se numerolla 0x00000111. Muista, että tavujärjestys on käänteinen. Tuloksena kaksi ottelua, patch:

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

Eeeee... kyllä!

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

Tämä olisi voinut lopettaa esityksen, mutta musiikki ei soinut kauan. Palvelimen uudelleenkäynnistyksen jälkeen huomasin, että asiakaskoneen laitetta ei ole asennettu!

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

Ja siinä se. Edes kaikkitietävä Google ei osannut vastata tähän minulle. Ja samaan aikaan komento näyttää palvelimella saatavilla olevat laitteet näyttää aivan oikein - tässä se on, avain, voit asentaa sen. Yritän asentaa Linuxin alta - se toimii! Ja jos nyt kokeillaan Windowsin alta? Voi vittu - se toimii!

Viimeinen rake: jotain ei ole lisätty palvelinkoodiin. Kun jaat laitteen, se ei lue siitä USB-kuvaajien määrää. Ja kun laite asennetaan Linuxin alta, tämä kenttä täytetään. Valitettavasti olen perehtynyt Linuxin kehittämiseen "make && make install" -tasolla. Siksi ongelma ratkaistaan ​​melko likaisella hakkeroinnilla - lisäämällä tiedostoon /etc/rc.local

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

Osa lopullinen

Pienen puuhastelun jälkeen se toimii. Haluttu tulos on saavutettu, nyt avain voidaan kiinnittää mihin tahansa tietokoneeseen (ja tietysti myös irrottaa), myös lähetysverkkosegmentin ulkopuolella. Jos haluat, voit tehdä sen käyttämällä shell-skriptiä. Mikä on mukavaa - ilo on täysin ilmaista.
Toivon, että kokemukseni auttaa habrazhiteli kiertämään otsaani painuneen haravan. Kiitos huomiostasi!

Lähde: will.com

Lisää kommentti