USB/IP megszelídítése

Rendszeresen felmerül az a feladat, hogy egy USB-eszközt csatlakoztassunk egy távoli számítógéphez helyi hálózaton keresztül. A vágás alatt kirajzolódik ez irányú kereséseim története, és egy nyílt forráskódú projekten alapuló kész megoldáshoz vezető út. USB/IP a különböző emberek által ezen az úton gondosan felállított akadályok leírásával, valamint azok megkerülésének módjaival.

Első rész, történelmi

Ha a gép virtuális - mindez egyszerű. A VMWare 4.1-ben megjelent a gazdagépről a virtuális gépre történő USB-továbbítás funkciója. De az én esetemben a WIBU-KEY néven felismerhető biztonsági kulcsot különböző időpontokban kellett csatlakoztatni különböző gépekhez, és nem csak virtuálisakhoz.
A távoli 2009-es keresés első köre egy vasdarabhoz vezetett, az úgynevezett TrendNet TU2-NU4
Előnyök:

  • néha még működik is

Hátrányok:

  • nem mindig működik. Tegyük fel, hogy a Guardant Stealth II védelmi kulcs nem ezen keresztül indul el, „az eszközt nem lehet elindítani” hibával esküdni.
  • A kezelőszoftverek (az USB-eszközök be- és leszerelése) a végletekig szánalmasak. Parancssori kapcsolók, automatizálás - nem, nem hallottam. Minden csak kézzel történik. Lidércnyomás.
  • a vezérlőszoftver műsorszórás útján magát a vasdarabot keresi a hálózatban, így ez csak egy broadcast hálózati szegmensen belül működik. Nem adhatja meg kézzel a vasdarab IP-címét. Egy vasdarab a másik alhálózatban? Akkor van egy probléma.
  • A fejlesztők pontozták az eszközt, hiába küldenek hibajelentéseket.

A második kör nem olyan távoli időkben történt, és elvezetett a cikk témájához - USB/IP projekt. Nyitottsággal vonz, főleg mivel a srácok a ReactOS aláírtak egy illesztőprogramot a Windowshoz, így most már x64-en is minden működik, mankók nélkül, mint egy tesztmód. Ezért köszönet a ReactOS csapatának! Minden gyönyörűen hangzik, próbáljuk meg érezni, tényleg így van? Sajnos maga a projekt is félbemaradt, és nem számíthatsz támogatásra - de ahol a miénk nem tűnt el, ott a forrás, ott kitaláljuk!

Második rész, szerver-linux

Az USB-eszközöket hálózaton keresztül megosztó USB/IP-kiszolgáló csak Linux-alapú operációs rendszeren állítható be. Nos, a Linux az Linux, tehát telepítse a Debian 8 virtuális gépre a minimális konfigurációban, normál kézmozdulattal:

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

Letelepedett. Továbbá az internet azt sugallja, hogy le kell töltenie az usbip modult, de - helló, az első rake. Nincs ilyen modul. És mindez azért, mert a hálózaton található kézikönyvek többsége a régebbi 0.1.x ágra hivatkozik, a legújabb 0.2.0-s verzióban pedig az usbip moduloknak más a neve.

ezért:

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

Nos, adjuk hozzá a következő sorokat az /etc/modules fájlhoz, hogy automatikusan betöltsék őket a rendszer indításakor:

usbip-core
usbip-host
vhci-hcd

Indítsuk el az usbip szervert:

sudo usbipd -D

Továbbá az univerzális elme azt mondja nekünk, hogy az usbip olyan szkriptekkel érkezik, amelyek lehetővé teszik számunkra a szerver kezelését – megmutatja, melyik eszközt fogja megosztani a hálózaton, megnézni az állapotot stb. Itt egy újabb kerti eszköz vár ránk – a 0.2.x ágban lévő szkriptek ismét át lettek nevezve. A parancsok listáját a segítségével kaphatja meg

sudo usbip

A parancsok leírásának elolvasása után világossá válik, hogy a szükséges USB-eszköz megosztásához az usbip tudni akarja a buszazonosítóját. Kedves nézők, az arénában van a harmadik számú gereblye: a buszazonosító, amit megadunk lsusb (ez tűnik a legkézenfekvőbb módnak) - ez nem illik hozzá! Az a tény, hogy az usbip figyelmen kívül hagyja a hardvereket, például az USB-elosztókat. Ezért a beépített parancsot fogjuk használni:

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

Megjegyzés: a továbbiakban a listákban mindent leírok az adott USB kulcs példáján. A hardvernév és a VID:PID pár eltérhet és eltérhet. Az enyém a Wibu-Systems AG neve: BOX/U, VID 064F, PID 0BD7.

Most megoszthatjuk készülékünket:

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

Hurrá elvtársak!

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)

Három éljenzés, elvtársak! A szerver megosztotta a vasdarabot a hálózaton keresztül, mi pedig csatlakoztathatjuk! Már csak az usbip démon automatikus indítását kell hozzáadni az /etc/rc.local fájlhoz

usbipd -D

Harmadik rész, ügyféloldali és zavaros

Megpróbáltam a megosztott eszközt a hálózaton keresztül egy Debian géphez azonnal csatlakoztatni ugyanazon a szerveren, és minden rendben volt:

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

Térjünk át a Windowsra. Az én esetemben Windows Server 2008R2 Standard Edition volt. A hivatalos útmutató arra kéri, hogy először telepítse az illesztőprogramot. Az eljárás tökéletesen le van írva a windows klienshez mellékelt readme-ben, mindent úgy csinálunk, ahogy le van írva, minden megy. XP-n is gond nélkül működik.

Az ügyfél kicsomagolása után megpróbáljuk felszerelni kulcsunkat:

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. Valami elromlott. Használjuk a Google tudását. Töredékesen említik, hogy valami nem stimmel a konstansokkal, a szerver részben a fejlesztők a 0.2.0-s verzióra váltáskor megváltoztatták a protokollverziót, de ezt a Win kliensben elfelejtették megtenni. A javasolt megoldás a konstans megváltoztatása a forráskódban és a kliens újraépítése.

De nagyon nem szeretném letölteni a Visual Studio-t ennek az eljárásnak a kedvéért. De van egy jó öreg Hiew-m. A forráskódban a konstans kettős szóként van deklarálva. Nézzük meg a 0x00000106 fájlban, és cseréljük le 0x00000111-re. Ne feledje, a bájtok sorrendje fordított. Az eredmény két meccs, patch:

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

Eeeee... igen!

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

Ezzel véget is érhetett volna a bemutató, de a zene nem szólt sokáig. A szerver újraindítása után azt tapasztaltam, hogy a kliens eszköze nincs csatlakoztatva!

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

És ez az. Erre még a mindent tudó Google sem tudott válaszolni nekem. És ugyanakkor a szerveren elérhető eszközök megjelenítésére vonatkozó parancs teljesen helyesen mutatja - itt van, a kulcs, csatlakoztathatja. Megpróbálom Linux alól felcsatolni - működik! És ha most megpróbálná Windows alól? Ó, a francba - működik!

Az utolsó rake: valami nincs hozzáadva a szerver kódjához. Eszköz megosztása esetén nem olvassa ki belőle az USB-leírók számát. És amikor Linux alatt telepíti az eszközt, ez a mező kitöltve van. Sajnos a Linux alatti fejlesztést a „make && make install” szinten ismerem. Ezért a probléma egy meglehetősen piszkos feltöréssel megoldódik - hozzáadva az /etc/rc.local fájlhoz

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

Rész döntő

Némi hegedülés után működik. A kívánt eredmény megszületett, immár a kulcs bármely PC-re felszerelhető (és természetesen le is szerelhető), beleértve a broadcast hálózati szegmensen kívülieket is. Ha akarod, megteheted shell szkript segítségével. Ami szép - az öröm teljesen ingyenes.
Remélem, hogy a tapasztalataim segítenek habrazhitelinek, hogy megkerülje a homlokomra nyomott gereblyét. Köszönöm a figyelmet!

Forrás: will.com

Hozzászólás