La tasko konekti USB-aparaton al fora komputilo per loka reto regule aperas. Sub la tranĉo estas la historio de miaj serĉoj en ĉi tiu direkto, kaj la vojo al preta solvo bazita sur malfermfonta projekto
Unua parto, historia
Se la maŝino estas virtuala, ĉio ĉi estas facila. La funkcieco de USB-sendo de la gastiganto al la virtuala maŝino aperis en VMWare 4.1. Sed en mia kazo, la sekurecŝlosilo, identigita kiel WIBU-KEY, devis esti konektita al malsamaj maŝinoj en malsamaj tempoj, kaj ne nur virtualaj.
La unua raŭndo de serĉo reen en 2009 kondukis min al peco de aparataro nomita
Pros:
- foje ĝi eĉ funkcias
Kons:
- ne ĉiam funkcias. Ni diru, ke la protektoŝlosilo Guardant Stealth II ne komenciĝas per ĝi, ĵurante per la eraro "la aparato ne povas esti komencita."
- La programaro por administri (legu: muntado kaj malmuntado de USB-aparatoj) estas ege malbona. Komandliniaj ŝaltiloj, aŭtomatigo - ne, ni ne aŭdis. Ĉio estas farita per viaj manoj. Koŝmaro.
- La kontrolprogramaro serĉas la aparataron mem sur la reto per elsendado, do ĝi funkcias nur ene de unu elsendosegmento de la reto. Vi ne povas specifi la IP-adreson de la aparataro permane. Ĉu la aparataro estas sur alia subreto? Tiam vi havas problemon.
- La programistoj rezignis pri la aparato, sendi cimraportojn estas senutila.
La dua raŭndo okazis en tempo ne tiel malproksima, kaj kondukis min al la temo de la artikolo -
Dua parto, servilo-Linukso
USB/IP-servilo kiu kunhavas USB-aparatojn tra reto povas nur esti instalita en Linuks-bazita OS. Nu, Linukso estas Linukso, instalu Debian 8 sur la virtuala maŝino en minimuma agordo, norma manmovo:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip
Establita. Tiam la Interreto sugestas, ke vi devas elŝuti la usbip-modulon, sed - saluton, unue rake. Ne ekzistas tia modulo. Ĉi tio estas ĉar la plej multaj el la manlibroj en la reto rilatas al la pli malnova branĉo 0.1.x, kaj en la plej nova 0.2.0 la usbip-moduloj havas malsamajn nomojn.
Sekve:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip
Nu, ni aldonu la sekvajn liniojn al /etc/modules por ŝargi ilin aŭtomate kiam la sistemo komenciĝas:
usbip-core
usbip-host
vhci-hcd
Ni lanĉu la usbip-servilon:
sudo usbipd -D
Plue, la universala saĝo diras al ni, ke usbip venas kun skriptoj, kiuj ebligas al ni administri la servilon - montru kian aparaton ĝi dividos tra la reto, vidu la statuson, ktp. Jen alia ĝardenilo atendas nin - ĉi tiuj skriptoj en la branĉo 0.2.x denove estis renomitaj. Vi povas akiri liston de komandoj uzante
sudo usbip
Post legado de la priskribo de la komandoj, evidentiĝas, ke por dividi la bezonatan USB-aparaton, usbip volas eltrovi ĝian Bus-ID. Karaj spektantoj, rake numero tri en la areno: la Bus ID kiu donos al ni lsusb (ŝajnus la plej evidenta maniero) - ne konvenas al ŝi! La fakto estas, ke usbip ignoras aparataron kiel USB-nabojn. Tial ni uzos la enkonstruitan komandon:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)
Noto: ĉi tie kaj plue en la listoj mi priskribos ĉion uzante la ekzemplon de mia specifa USB-ŝlosilo. Via aparatara nomo kaj VID:PID-paro povas kaj estos malsamaj. La mia nomiĝas Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
Nun ni povas dividi nian aparaton:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete
Hura, kamaradoj!
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 samideanoj, kamaradoj! La servilo dividis la aparataron tra la reto, kaj ni povas konekti ĝin! Restas nur aldoni aŭtomatan starton de la usbip-demono en /etc/rc.local
usbipd -D
Parto tri, klient-flanko kaj konfuza
Mi tuj provis konekti la komunan aparaton per la reto al maŝino kuranta Debian sur la sama servilo, kaj ĉio konektis perfekte:
sudo usbip attach --remote=localhost --busid=1-1
Ni transiru al Vindozo. En mia kazo ĝi estis Windows Server 2008R2 Standard Edition. La oficiala manlibro petas vin unue instali la pelilon. La proceduro estas perfekte priskribita en la readme inkluzivita kun la Vindoza kliento, ni faras ĉion kiel skribite, ĉio funkcias. Ĝi ankaŭ funkcias ĉe XP sen malfacilaĵoj.
Malpakinte la klienton, ni provas munti nian ŝlosilon:
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
Ho ho. Io misfunkciis. Ni uzu la Guglo-kapablon. Estas fragmentaj mencioj, ke io misas kun la konstantoj; en la servila parto, la programistoj ŝanĝis la protokolan version dum moviĝado al versio 0.2.0, sed en la Win-kliento ili forgesis fari tion. La proponita solvo estas ŝanĝi la konstantan en la fontkodo kaj rekonstrui la klienton.
Sed mi vere ne volas elŝuti Visual Studion por ĉi tiu proceduro. Sed mi havas la bonan maljunan Hiew. En la fontkodo, la konstanto estas deklarita kiel duobla vorto. Ni serĉu 0x00000106 en la dosiero, anstataŭigante ĝin per 0x00000111. Ne forgesu, la bajta ordo estas inversa. La rezulto estas du matĉoj, ni flikas:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11
Aaaand... jes!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1
Ĉi tio povus esti la fino de la rakonto, sed la muziko ne ludis longe. Post rekomenco de la servilo, mi malkovris, ke la aparato sur la kliento ne estis muntita!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device
Tio estas ĉio. Eĉ la ĉioscia Guglo ne povis respondi ĉi tion por mi. Kaj samtempe, la komando montri la disponeblajn aparatojn sur la servilo sufiĉe ĝuste montras - jen ĝi estas, la ŝlosilo, vi povas munti ĝin. Mi provas munti de Linukso - ĝi funkcias! Kio se ni provas nun de Vindozo? Ho hororo - ĝi funkcias!
La lasta rastilo: io ne estis skribita en la servila kodo. Dum kunhavado de aparato, ĝi ne legas la nombron da USB-priskribiloj de ĝi. Kaj kiam oni muntas aparaton de Linukso, ĉi tiu kampo estas plenigita. Bedaŭrinde, mi konas Linuksan disvolviĝon ĉe la nivelo "faru && instali". Tial, la problemo estis solvita per iom malpura hako - aldonante al /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00
Fina parto
Post iom da suferado, ĝi funkcias. La dezirata estis atingita, nun la ŝlosilo povas esti muntita al ajna komputilo (kaj malmuntita, kompreneble, ankaŭ), inkluzive ekster la elsendo segmento de la reto. Se vi volas, vi povas fari tion uzante komandan ŝelan skripton. Kio estas agrable estas, ke la plezuro estas absolute senpaga.
Mi esperas, ke mia sperto helpos la hackers ĉirkaŭiri la rastilon, kiu estas presita sur mia frunto. Dankon pro via atento!
fonto: www.habr.com