Regelmatig verschijnt de behoefte om een USB-apparaat via een lokaal netwerk op een externe pc aan te sluiten. Hieronder beschrijf ik mijn zoektocht op dit gebied en de weg naar een kant-en-klare oplossing op basis van een open-source project. met een beschrijving van de diverse obstakels die door verschillende mensen onderweg zijn geĆÆnstalleerd, evenals manieren om deze te omzeilen.
Deel ƩƩn, historisch
Als de machine virtueel is, is dit allemaal niet moeilijk. De functionaliteit om USB van de host naar de virtuele machine door te geven is al aanwezig sinds VMWare 4.1. Maar in mijn geval moest de beveiligingssleutel, die als WIBU-KEY wordt herkend, op verschillende momenten op verschillende machines worden aangesloten, en niet alleen virtuele.
De eerste zoektocht in het verre 2009 leidde me naar een apparaat genaamd
Voordelen:
- werkt soms zelfs
Nadelen:
- werkt niet altijd. Neem bijvoorbeeld, de beveiligingssleutel Guardant Stealth II start er niet mee op en geeft de foutmelding "het apparaat kan niet worden gestart".
- De software voor beheer (lees: het mounten en unmounten van USB-apparaten) is schandalig minimaal. Commandoregelopties, automatisering ā nee, daar hebben ze nog nooit van gehoord. Alles moet met de hand. Een nachtmerrie.
- de beheersoftware zoekt het apparaat zelf via broadcasting in het netwerk, zodat dit alleen binnen ƩƩn broadcast-segment van het netwerk werkt. Je kunt het IP-adres van het apparaat niet handmatig instellen. Staat het apparaat in een ander subnet? Dan heb je een probleem.
- de ontwikkelaars hebben het apparaat opgegeven, bugrapporten indienen heeft geen zin.
De tweede zoektocht vond plaats in niet zo'n verre tijd en leidde me naar het onderwerp van dit artikel ā . Het spreekt aan door zijn openheid, vooral omdat de jongens van hun stuurprogramma voor Windows hebben gecreĆ«erd, zodat het nu zelfs op x64 zonder allerlei haperingen zoals testmodus werkt. Voor dit alles enorme dank aan het ReactOS-team! Het klinkt allemaal mooi, laten we proberen te zien of het ook echt zo is? Helaas is het project zelf ook wat in de vergetelheid geraakt, en steun is niet te verwachten ā maar waar is onze wil niet verloren gegaan, de broncode is beschikbaar, we zullen het uitzoeken!
Deel twee, server-en-linuxgerelateerd
De USB/IP-server die USB-apparaten over het netwerk deelt, kan alleen worden opgezet op een Linux-gebaseerd besturingssysteem. Nou, als het Linux is, laten we dan Debian 8 met een minimale configuratie op de virtuele machine installeren, de standaard handmatige beweging:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbipWe are set up. Next, the internet suggests that we need to load the usbip module, but here come the first obstacles. There is no such module. This is because most guides online refer to the older 0.1.x branch, whereas in the latest 0.2.0, the usbip modules have different names.
Therefore:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbipNow we will add the following lines to /etc/modules to load them automatically at system startup:
usbip-core
usbip-host
vhci-hcdLet's start the usbip server:
sudo usbipd -DNext, the global mind informs us that bundled with usbip are scripts allowing us to manage the server ā to show which device it will share over the network, to check status, and so on. Here we encounter another tricky tool ā these scripts in the 0.2.x branch have also been renamed. We can get a list of commands by using
sudo usbipAfter reading the command descriptions, it becomes clear that in order to share the required USB device, usbip wants to know its Bus ID. Dear viewers, here comes obstacle number three: the Bus ID given to us by lsusb (seemingly the most obvious path) ā does not work for it! The reason is that hardware like USB hubs is ignored by usbip. Therefore, we will use the built-in command:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)Note: here and in the listings that follow, I will describe everything based on my specific USB stick. The name of your hardware and the VID:PID pair may differ. Mine is called Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
Now we can share our device:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: completeHooray, comrades!
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)Three cheers, comrades! The server has shared the device over the network, and we can connect it! All that remains is to add the auto-start of the usbip daemon in /etc/rc.local
usbipd -DPart three, client-side and convoluted
I tried to connect the shared device over the network to a machine running Debian immediately on the same server, and everything connected perfectly:
sudo usbip attach --remote=localhost --busid=1-1Laten we overgaan naar Windows. In mijn geval was dat Windows Server 2008R2 Standard Edition. De officiƫle handleiding vraagt eerst om de stuurprogramma te installeren. De procedure is uitstekend beschreven in de bijgevoegde readme bij de Windows-client, laten we alles doen zoals beschreven, alles werkt. Het werkt ook zonder enige problemen op XP.
Na het uitpakken van de client, proberen we onze sleutel te koppelen:
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) kan apparaat niet vindenOh-oh. Er is iets misgegaan. We gebruiken onze Google-vaardigheden. Er zijn sporadische vermeldingen dat er iets niet klopt met de constanten, in de serverkant hebben de ontwikkelaars de versie van het protocol veranderd bij de overstap naar versie 0.2.0, maar in de Windows-client zijn ze dit vergeten. De voorgestelde oplossing is om de constante in de broncode te veranderen en de client opnieuw te bouwen.
Maar ik heb echt geen zin om Visual Studio voor deze procedure te downloaden. Gelukkig heb ik de oude goede Hiew. In de broncode is de constante gedefinieerd als een double word. Laten we in het bestand 0x00000106 zoeken, vervangend door 0x00000111. Vergeet niet, de bytevolgorde is omgekeerd. Resultaat ā twee overeenkomsten, patching:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11En⦠ja!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
nieuw usb-apparaat aangesloten op usbvbus poort 1Hiermee zou ik de uiteenzetting kunnen afsluiten, maar de muziek speelde niet lang. Na het herstarten van de server ontdekte ik dat het apparaat op de client niet gekoppeld kon worden!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) kan apparaat niet vindenEn dat is het. Zelfs Google kon me daar niet op antwoorden. Ondertussen toont het commando om beschikbare apparaten op de server weer te geven heel correct ā daar is de sleutel, je kunt deze koppelen. Ik probeer het vanuit Linux te koppelen ā het werkt! En als we het nu vanuit Windows proberen? Oh verschrikkingen ā het werkt!
Laatste hobbels: er is iets in de servercode niet goed afgemaakt. Bij het delen van het apparaat leest het niet het aantal USB-descriptoren. Maar bij het koppelen van het apparaat vanuit Linux wordt dit veld ingevuld. Helaas ben ik op het gebied van Linux-ontwikkeling bekend op het niveau van 'make && make install'. Daarom is het probleem opgelost met behulp van een vrij rommelige hack ā door iets toe te voegen aan /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00Einddeel
Na enkele tegenslagen werkt het nu. Wat gewenst is, kan nu aan elke pc worden gekoppeld (en natuurlijk ook losgekoppeld), zelfs buiten het brede netwerksegment. Als je dat wilt, kan dit met behulp van een shell-script. Het mooie is dat het plezier helemaal gratis is.
Ik hoop dat mijn ervaring de Habr-gebruikers helpt om de obstakels te omzeilen die op mijn voorhoofd zijn gedrukt. Bedankt voor uw aandacht!
Bron: habr.com
