Redovito se javlja zadatak povezivanja USB uređaja s udaljenim računalom putem lokalne mreže. Pod rezom je prikazana povijest mojih traženja u ovom smjeru i put do gotovog rješenja temeljenog na projektu otvorenog koda
Prvi dio, povijesni
Ako je stroj virtualni - sve je to jednostavno. Funkcionalnost USB prosljeđivanja s hosta na virtualni stroj pojavila se u VMWare 4.1. Ali u mom slučaju, sigurnosni ključ, prepoznatljiv kao WIBU-KEY, morao je biti povezan u različito vrijeme s različitim strojevima, a ne samo virtualnim.
Prvi krug potrage davne 2009. godine doveo me do komada željeza tzv
Pros:
- ponekad čak i uspije
Cons:
- ne radi uvijek. Pretpostavimo da se zaštitni ključ Guardant Stealth II ne pokreće kroz njega, psujući s pogreškom "uređaj se ne može pokrenuti".
- Softver za upravljanje (čitaj - montiranje i demontiranje USB uređaja) je jadan do krajnjih granica. Prekidači naredbenog retka, automatizacija - ne, nisam čuo. Sve je samo ručno. Noćna mora.
- upravljački softver traži sam komad željeza u mreži putem emitiranja, tako da ovo radi samo unutar jednog segmenta mreže za emitiranje. Ne možete ručno odrediti IP adresu komada željeza. Komad željeza u drugoj podmreži? Onda imate problem.
- programeri postigli bodove na uređaju, beskorisno je slati izvješća o pogreškama.
Drugi krug dogodio se u ne tako davnim vremenima i doveo me do teme članka -
Drugi dio, server-linux
USB/IP poslužitelj koji dijeli USB uređaje preko mreže može se postaviti samo na OS-u temeljenom na Linuxu. Pa Linux je Linux, instaliramo Debian 8 na virtualni stroj u minimalnoj konfiguraciji, standardni pokret ruke:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip
Naselili. Nadalje, Internet sugerira da biste trebali preuzeti usbip modul, ali - zdravo, prva rake. Ne postoji takav modul. A sve zato što se većina priručnika na mreži odnosi na stariju granu 0.1.x, au najnovijoj 0.2.0 usbip moduli imaju drugačija imena.
Stoga:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip
Pa, dodajmo sljedeće retke u /etc/modules da ih automatski učitamo pri pokretanju sustava:
usbip-core
usbip-host
vhci-hcd
Pokrenimo usbip server:
sudo usbipd -D
Nadalje, univerzalni um nam govori da usbip dolazi sa skriptama koje nam omogućuju upravljanje poslužiteljem - pokazuju koji će uređaj dijeliti preko mreže, vide status i tako dalje. Ovdje nas čeka još jedan vrtni alat - ove skripte u grani 0.2.x, opet, su preimenovane. Možete dobiti popis naredbi s
sudo usbip
Nakon čitanja opisa naredbi, postaje jasno da usbip želi znati njegov Bus ID kako bi podijelio traženi USB uređaj. Dragi gledatelji, grablje broj tri su u areni: Bus ID koji će nam dati lsusb (činilo bi se najočigledniji način) - ne pristaje joj! Činjenica je da usbip zanemaruje hardver poput USB čvorišta. Stoga ćemo koristiti ugrađenu naredbu:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)
Napomena: u daljnjem tekstu u popisima ću sve opisati na primjeru svog specifičnog USB ključa. Vaš naziv hardvera i VID:PID par mogu se i razlikovat će se. Moj se zove Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
Sada možemo dijeliti naš uređaj:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete
Hura, drugovi!
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)
Tri puta ura, drugovi! Poslužitelj je podijelio komad željeza preko mreže i možemo ga spojiti! Ostaje samo dodati autostart usbip demona u /etc/rc.local
usbipd -D
Treći dio, na strani klijenta i zbunjujući
Pokušao sam spojiti dijeljeni uređaj preko mreže na Debian stroj odmah na istom poslužitelju, i sve je dobro povezano:
sudo usbip attach --remote=localhost --busid=1-1
Prijeđimo na Windows. U mom slučaju to je bio Windows Server 2008R2 Standard Edition. Službeni vodič traži da prvo instalirate upravljački program. Procedura je savršeno opisana u readme-u priloženom Windows klijentu, radimo sve kako je napisano, sve funkcionira. Na XP također radi bez problema.
Nakon raspakiranja klijenta, pokušavamo montirati naš ključ:
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. Nešto je pošlo po zlu. Koristimo se vještinom Googlea. Postoje fragmentarne napomene da nešto nije u redu s konstantama; u poslužiteljskom dijelu programeri su promijenili verziju protokola pri prelasku na verziju 0.2.0, ali su to zaboravili učiniti u Win klijentu. Predloženo rješenje je promijeniti konstantu u izvornom kodu i ponovno izgraditi klijenta.
Ali stvarno ne želim preuzimati Visual Studio radi ovog postupka. Ali imam dobrog starog Hiewa. U izvornom kodu, konstanta je deklarirana kao dvostruka riječ. Pogledajmo u datoteci 0x00000106, zamijenivši ga s 0x00000111. Zapamtite, redoslijed bajtova je obrnut. Rezultat su dvije utakmice, patch:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11
Eeeee... da!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1
Time je prezentacija mogla završiti, ali glazba nije dugo svirala. Nakon ponovnog pokretanja poslužitelja, ustanovio sam da uređaj na klijentu nije montiran!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device
I to je to. Čak mi ni sveznajući Google nije mogao odgovoriti na ovo pitanje. I u isto vrijeme, naredba za prikaz uređaja dostupnih na poslužitelju sasvim ispravno pokazuje - evo ga, ključ, možete ga montirati. Pokušavam montirati iz Linuxa - radi! A ako sada pokušate iz sustava Windows? O sranje - radi!
Posljednji rake: nešto nije dodano u kod poslužitelja. Prilikom dijeljenja uređaja, ne čita broj USB deskriptora s njega. A kada montirate uređaj iz Linuxa, ovo polje je popunjeno. Nažalost, upoznat sam s razvojem pod Linuxom na razini "make && make install". Stoga je problem riješen prilično prljavim hackom - dodavanjem u /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00
Završni dio
Nakon malo petljanja, radi. Željeni rezultat je postignut, sada se ključ može montirati na bilo koje računalo (i demontirati, naravno), uključujući i izvan segmenta mreže za emitiranje. Ako želite, možete to učiniti pomoću skripte ljuske. Ono što je lijepo - užitak je apsolutno besplatan.
Nadam se da će moje iskustvo pomoći habrazhiteli da zaobiđu grablje koje su mi utisnute na čelu. Hvala na pozornosti!
Izvor: www.habr.com