Pag-amin sa USB/IP

Ang gawain ng pagkonekta ng isang USB device sa isang malayong PC sa pamamagitan ng isang lokal na network ay regular na lumitaw. Sa ilalim ng hiwa, ang kasaysayan ng aking mga paghahanap sa direksyong ito ay itinakda, at ang landas patungo sa isang handa na solusyon batay sa isang open-source na proyekto USB/IP na may paglalarawan ng mga hadlang na maingat na itinakda ng iba't ibang tao sa landas na ito, pati na rin ang mga paraan upang lampasan ang mga ito.

Unang bahagi, historikal

Kung ang makina ay virtual - lahat ng ito ay madali. Ang pag-andar ng pagpapasa ng USB mula sa isang host patungo sa isang virtual machine ay lumitaw sa VMWare 4.1. Ngunit sa aking kaso, ang security key, na makikilala bilang WIBU-KEY, ay kailangang konektado sa iba't ibang oras sa iba't ibang machine, at hindi lamang sa mga virtual.
Ang unang round ng paghahanap sa malayong 2009 ay humantong sa akin sa isang piraso ng bakal na tinatawag TrendNet TU2-NU4
Pros:

  • minsan gumagana pa

Cons:

  • hindi laging gumagana. Ipagpalagay na ang susi ng proteksyon ng Guardant Stealth II ay hindi magsisimula sa pamamagitan nito, na nagmumura na may error na "hindi masisimulan ang device".
  • Ang software sa pamamahala (read - mounting at unmounting USB device) ay kalunus-lunos sa sukdulan. Command line switch, automation - hindi, hindi narinig. Ang lahat ay sa pamamagitan lamang ng kamay. Bangungot.
  • hinahanap ng control software ang mismong piraso ng bakal sa network sa pamamagitan ng pagsasahimpapawid, kaya gumagana lamang ito sa loob ng isang segment ng broadcast network. Hindi mo maaaring tukuyin ang IP address ng piraso ng bakal sa pamamagitan ng kamay. Isang piraso ng bakal sa ibang subnet? Tapos may problema ka.
  • nakapuntos ang mga developer sa device, walang silbi na magpadala ng mga ulat ng bug.

Ang pangalawang pag-ikot ay nangyari sa mga oras na hindi gaanong malayo, at dinala ako sa paksa ng artikulo - Proyekto ng USB/IP. Nang-aakit sa pagiging bukas, lalo na dahil ang mga lalaki mula sa ReactOS sila ay pumirma ng isang driver para sa Windows, kaya ngayon ang lahat ay gumagana kahit na sa x64 nang walang anumang saklay tulad ng isang pagsubok mode. Para saan maraming salamat sa koponan ng ReactOS! Parang maganda ang lahat, subukan nating damhin, ganoon ba talaga? Sa kasamaang palad, ang proyekto mismo ay inabandona din, at hindi ka makakaasa sa suporta - ngunit kung saan ang sa amin ay hindi nawala, ang pinagmulan ay naroroon, malalaman namin ito!

Ikalawang bahagi, server-linux

Ang isang USB/IP server na nagbabahagi ng mga USB device sa isang network ay maaari lamang i-set up sa isang Linux-based na OS. Well, Linux ay Linux, ini-install namin ang Debian 8 sa isang virtual machine sa pinakamababang configuration, karaniwang paggalaw ng kamay:

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

Naayos na. Dagdag pa, iminumungkahi ng Internet na kakailanganin mong i-download ang usbip module, ngunit - hello, ang unang rake. Walang ganoong module. At lahat dahil karamihan sa mga manual sa network ay tumutukoy sa mas lumang sangay na 0.1.x, at sa pinakabagong 0.2.0 ang mga usbip module ay may iba't ibang pangalan.

Samakatuwid:

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

Well, idagdag natin ang mga sumusunod na linya sa /etc/modules upang awtomatikong mai-load ang mga ito sa pagsisimula ng system:

usbip-core
usbip-host
vhci-hcd

Simulan natin ang usbip server:

sudo usbipd -D

Dagdag pa, sinasabi sa atin ng unibersal na isip na ang usbip ay may kasamang mga script na nagbibigay-daan sa amin na pamahalaan ang server - ipakita kung aling device ang ibabahagi nito sa network, tingnan ang status, at iba pa. Narito ang isa pang tool sa hardin naghihintay sa amin - ang mga script na ito sa 0.2.x branch, muli, ay pinalitan ng pangalan. Maaari kang makakuha ng isang listahan ng mga utos gamit ang

sudo usbip

Matapos basahin ang paglalarawan ng mga utos, nagiging malinaw na upang maibahagi ang kinakailangang USB device, gustong malaman ng usbip ang Bus ID nito. Dear viewers, rake number three ay nasa arena: ang Bus ID na magbibigay sa atin lsusb (tila ito ang pinaka-halatang paraan) - hindi ito nababagay sa kanya! Ang katotohanan ay hindi pinapansin ng usbip ang hardware tulad ng mga USB hub. Samakatuwid, gagamitin namin ang built-in na command:

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

Tandaan: pagkatapos nito sa mga listahan ay ilalarawan ko ang lahat gamit ang halimbawa ng aking partikular na USB key. Ang iyong pangalan ng hardware at pares ng VID:PID ay maaari at mag-iiba. Ang akin ay tinatawag na Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Ngayon ay maaari na naming ibahagi ang aming device:

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

Hurrah, mga kasama!

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)

Tatlong tagay, mga kasama! Ibinahagi ng server ang piraso ng bakal sa network, at maaari naming ikonekta ito! Ito ay nananatiling lamang upang idagdag ang autostart ng usbip daemon sa /etc/rc.local

usbipd -D

Ikatlong bahagi, panig ng kliyente at nakakalito

Sinubukan kong ikonekta ang nakabahaging device sa network sa isang Debian machine kaagad sa parehong server, at lahat ay konektado nang maayos:

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

Lumipat tayo sa Windows. Sa aking kaso ito ay Windows Server 2008R2 Standard Edition. Hinihiling sa iyo ng opisyal na gabay na i-install muna ang driver. Ang pamamaraan ay perpektong inilarawan sa readme na naka-attach sa windows client, ginagawa namin ang lahat ayon sa nakasulat, lahat ay gumagana. Sa XP gumagana rin ito nang walang anumang problema.

Pagkatapos i-unpack ang kliyente, sinusubukan naming i-mount ang aming susi:

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. Nagkaproblema. Ginagamit namin ang kakayahan ng Google. May mga fragmentary na pagbanggit na may mali sa mga constants; sa bahagi ng server, binago ng mga developer ang bersyon ng protocol kapag lumipat sa bersyon 0.2.0, ngunit nakalimutan nilang gawin ito sa Win client. Ang iminungkahing solusyon ay baguhin ang pare-pareho sa source code at muling itayo ang kliyente.

Ngunit talagang ayaw kong mag-download ng Visual Studio para sa kapakanan ng pamamaraang ito. Ngunit mayroon akong magandang lumang Hiew. Sa source code, ang pare-pareho ay ipinahayag bilang isang dobleng salita. Tingnan natin sa file ang 0x00000106, palitan ito ng 0x00000111. Tandaan, ang byte order ay binaligtad. Ang resulta ay dalawang tugma, patch:

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

Eeeee... oo!

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

Ito ay maaaring tapusin ang pagtatanghal, ngunit ang musika ay hindi tumugtog nang matagal. Pagkatapos i-reboot ang server, nalaman kong hindi naka-mount ang device sa client!

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

At ayun na nga. Kahit na ang lahat-ng-alam na Google ay hindi masagot ito para sa akin. At sa parehong oras, ang utos upang ipakita ang mga device na magagamit sa server ay nagpapakita nang tama - narito ito, ang susi, maaari mong i-mount ito. Sinusubukan kong mag-mount mula sa ilalim ng Linux - gumagana ito! At kung subukan ngayon mula sa ilalim ng Windows? Oh shit - ito ay gumagana!

Ang huling rake: may hindi naidagdag sa server code. Kapag nagbabahagi ng device, hindi nito binabasa ang bilang ng mga USB descriptor mula dito. At kapag ini-mount ang device mula sa ilalim ng Linux, napuno ang field na ito. Sa kasamaang palad, pamilyar ako sa pag-unlad sa ilalim ng Linux sa antas ng "gumawa at gumawa ng pag-install". Samakatuwid, ang problema ay nalutas sa isang medyo maruming hack - pagdaragdag sa /etc/rc.local

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

Pangwakas na bahagi

Pagkatapos ng ilang kalikot, ito ay gumagana. Ang nais na resulta ay nakuha, ngayon ang susi ay maaaring mai-mount sa anumang PC (at hindi naka-mount, siyempre, masyadong), kabilang ang labas ng segment ng broadcast network. Kung gusto mo, magagawa mo ito gamit ang isang shell script. Ano ang maganda - ang kasiyahan ay ganap na libre.
Umaasa ako na ang aking karanasan ay makakatulong sa habrazhiteli upang makalibot sa kalaykay na nakatatak sa aking noo. Salamat sa iyong atensyon!

Pinagmulan: www.habr.com

Magdagdag ng komento