Gyakran felmerül a feladat, hogy USB-eszközt csatlakoztassunk egy távoli PC-hez helyi hálózaton keresztül. A cikkben bemutatom a kereséseim történetét ezen a téren, és az open-source projekt alapján készült végső megoldást. a különböző emberek által felállított akadályok leírásával, valamint az azok megkerülésének módjaival.
Első rész, történelmi
Ha a gép virtuális, akkor mindez nem nehéz. A USB-használat a gazdagépből a virtuális gépbe már VMware 4.1 óta létezik. De az én esetemben a WIBU-KEY néven azonosított védelmi kulcsot különböző gépekre kellett csatlakoztatni, nem csak virtuálisakra.
A keresés első köre 2009 táján vezetett egy eszközhöz, amelynek neve
Előnyök:
- néha még működik is
Hátrányok:
- nem mindig működik. Például a Guardant Stealth II védelmi kulcs nem indul el rajta, hibát jelezve, hogy „az eszköz nem indítható el”.
- A kezelő szoftver (értsd - USB-eszközök csatolása és leválasztása) rendkívül gyenge. Parancssori opciók, automatizálás - nem, erről hallani sem hallottak. Minden kézzel. Rémes.
- A kezelő szoftver széleskörű kereséssel Keresi az eszközt a hálózaton, tehát csak egy broadcast-szegmensen belül működik. Az eszköz IP-címét kézzel megadni nem lehet. Az eszköz más alhálózaton van? Akkor problémád van.
- A fejlesztők figyelmen kívül hagyták az eszközt, hibajelentéseket küldeni hasztalan.
A második kör a már nem olyan távoli időszakban történt, és a cikk témájához vezetett - . Vonzza a nyitottságával, különösen mivel a ReactOS csapata vezetett egy Windows-illesztőprogramot ehhez, így most már az x64-en is működik mindenféle hackelés nélkül, mint például a tesztmód. Nagy köszönet a ReactOS csapatának! Minden szépnek tűnik, próbáljuk ki, hogy valóban úgy van-e? Sajnos a projekt maga is elhanyagolt, és a támogatásra nem lehet számítani - de hol nem volt, a forráskód itt van, majd megoldjuk!
Második rész, szerver-linukszos
A USB/IP szerver, amely megosztja a USB-eszközöket a hálózaton, csak Linux-alapú operációs rendszeren állítható be. Na, ha linux, akkor linux, telepítjük a Debian 8-at minimális konfigurációban virtuális gépre, a szokásos kézi lépés:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbipTelepítve. Most az internet azt javasolja, hogy töltsük le a usbip modult, de hello, itt jönnek az első buktatók. Nincs ilyen modul. Mindez azért van, mert a legtöbb online útmutató a régebbi 0.1.x verziókra vonatkozik, míg a legújabb 0.2.0 verzióban az usbip modulok más neveket viselnek.
Ezért:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbipMost pedig adjunk hozzá ilyen sorokat a /etc/modules fájlhoz, hogy automatikusan betöltődjenek a rendszerindításkor:
usbip-core
usbip-host
vhci-hcdIndítsuk el az usbip szervert:
sudo usbipd -DMost az univerzális tudás azt sugallja, hogy a usbip-hez olyan szkriptek tartoznak, amelyek lehetővé teszik számunkra a szerver kezelését — például megmutatják, hogy melyik eszközt fogja megosztani a hálózaton, megnézhetjük az állapotot és így tovább. Itt egy újabb buktató vár ránk — ezek a szkriptek a 0.2.x verzióban, ismét, átnevezésre kerültek. A parancsok listáját a következővel kaphatjuk meg:
sudo usbipA parancsok leírásának elolvasása után világossá válik, hogy ahhoz, hogy megosszuk a szükséges USB-eszközt, az usbip szeretné tudni a Bus ID-ját. Tisztelt nézők, a harmadik buktató: az a Bus ID, amit a lsusb (úgy tűnik, a legnyilvánvalóbb út) — nem megfelelő! Az a helyzet, hogy az usbip figyelmen kívül hagyja az olyan eszközöket, mint a USB hubok. Ezért használjuk a beépített parancsot:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)Megjegyzés: itt és a továbbiakban a listákban mindent a saját konkrét USB kulcsom példájával fogok bemutatni. A gépem neve Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7 lehet, hogy a te eszközöd neve és VID:PID párod eltér.
Most már megoszthatjuk az eszközünket:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: completeHurra, elvtársak!
user@usb-server:~$ sudo usbip list -r localhost
Exportálható USB eszközök
======================
- 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
: Gyártóspecifikus osztály / ismeretlen alosztály / ismeretlen protokoll (ff/00/ff)Háromszori hurra, elvtársak! A szerver megosztotta az eszközt a hálózaton, és most már csatlakoztathatjuk! Csak annyit kell tennünk, hogy hozzáadjuk az usbip démon automatikus indítását a /etc/rc.local fájlhoz.
usbipd -DHarmadik rész, kliens- és bonyolult rész
A megosztott eszközt a Debian operációs rendszert futtató gépemhez való csatlakoztatását azonnal megpróbáltam ugyanazon a szerveren, és minden nagyszerűen csatlakozott:
sudo usbip attach --remote=localhost --busid=1-1Térjünk át Windowsra. Az én esetemben ez a Windows Server 2008R2 Standard Edition volt. A hivatalos útmutató először a meghajtó telepítését kéri. A folyamatot szépen leírták a Windows klienshez mellékelt readme fájlban, mindent a leírtak szerint csinálunk, és minden rendben van. Az XP-n is működik, minden nehézség nélkül.
A kliens kicsomagolása után próbáljuk meg csatlakoztatni a kulcsunkat:
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip hiba: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip hiba: usbip_windows.c: 756 (query_interface0) recv op_common
usbip hiba: usbip_windows.c: 829 (attach_device) nem található eszközÓ, ó. Valami nem stimmel. Használjuk a Google tudományát. Részleges említések találhatók, hogy valami nem stimmel a konstansokkal; a szerver oldalon a fejlesztők a 0.2.0 verzióra való áttéréskor megváltoztatták a protokoll verzióját, míg a Windows kliensben ezt elfelejtették. Az ajánlott megoldás — változtassuk meg a konstansot a forráskódban és recompile-eljük a klienst.
Csak nagyon nem szeretném letölteni a Visual Studiot emiatt. De van egy régi jó hívott Hiew. A forráskódban a konstans dupla szóként van deklarálva. Keresgéljünk a fájlban 0х00000106, cserélve 0х00000111-ra. Ne feledjük, a bájtok sorrendje megfordított. Az eredmény — két egyezés, patcheljük:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11És igen!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
új USB eszköz csatlakoztatva az usbvbus 1. porthozEzen a ponton befejezhetném a leírást, de a zene nem tartott sokáig. A szerver újraindításakor felfedeztem, hogy az eszköz a kliensen nem csatlakozik!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip hiba: usbip_windows.c: 829 (attach_device) nem található eszközÉs ez minden. Erre még a mindentudó Google sem tudott válaszolni. A csapat viszont helyesen mutatja az elérhető eszközöket a szerveren - itt van, a kulcs, csatlakoztathatod. Próbálom Linuxról csatlakoztatni - működik! És ha most megpróbálom Windowsról? Ó, borzalom - ez működik!
Az utolsó gubanc: valami hiányzik a szerver kódjából. Az eszköz megosztásakor nem olvassa be a USB-leírók számát. De amikor az eszközt Linuxról csatlakoztatod, ez a mező ki van töltve. Sajnos a Linuxos fejlesztéssel csak "make && make install" szinten vagyok tisztában. Ezért a probléma megoldva egy elég durva hack segítségével — a /etc/rc.local fájlba való hozzáadással.
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00Záró rész
Néhány nehézség után működik. A kívánt eredmény megvan, most a kulcsot bármelyik számítógéphez csatlakoztathatjuk (és le is választhatjuk, természetesen), beleértve a hálózati széles sávú szegmensen kívüli rendszereket is. Ha szeretnénk, ezt parancssori szkripttel is megtehetjük. Ami kellemes, az a tapasztalat teljesen ingyenes.
Remélem, hogy tapasztalataim segítenek a hubeleknek elkerülni azokat a buktatókat, amelyeket én tapasztaltam. Köszönöm a figyelmet!
Forrás: habr.com
