MaĂźtrisons l'USB/IP

Il se pose rĂ©guliĂšrement la question de la connexion d'un pĂ©riphĂ©rique USB Ă  un PC distant via un rĂ©seau local. Cet article retrace mon parcours dans ce domaine et prĂ©sente une solution prĂȘte Ă  l'emploi basĂ©e sur un projet open-source. USB/IP avec une description des divers obstacles soigneusement installĂ©s par diffĂ©rentes personnes en cours de route, ainsi que des moyens de les contourner.

Partie un, historique

Si la machine est virtuelle, tout cela n'est pas compliquĂ©. La fonctionnalitĂ© de redirection USB de l'hĂŽte vers la machine virtuelle existe depuis VMWare 4.1. Mais dans mon cas, la clĂ© de protection, reconnue comme WIBU-KEY, devait ĂȘtre connectĂ©e Ă  diffĂ©rentes machines au fil du temps, et pas seulement virtuelles.
Le premier tour de recherche, en 2009, m'a conduit à un appareil appelé TrendNet TU2-NU4
Avantages :

  • qui fonctionne parfois

Inconvénients :

  • mais pas toujours. Par exemple, la clĂ© de protection Guardant Stealth II ne s'active pas Ă  travers elle, affichant une erreur « l'appareil ne peut pas ĂȘtre lancĂ© ».
  • Le logiciel de gestion (entendez par lĂ , le montage et le dĂ©montage des pĂ©riphĂ©riques USB) est terriblement limitĂ©. Les clĂ©s de ligne de commande, l'automatisation — non, ce n'est pas au programme. Tout doit ĂȘtre fait manuellement. Un vĂ©ritable cauchemar.
  • Le logiciel de gestion recherche le matĂ©riel sur le rĂ©seau par diffusion, donc cela ne fonctionne que dans une mĂȘme segment de diffusion. On ne peut pas spĂ©cifier l'adresse IP de l'appareil manuellement. Un appareil sur un autre sous-rĂ©seau ? Alors, vous avez un problĂšme.
  • Les dĂ©veloppeurs ont abandonnĂ© l'appareil, envoyer des rapports de bogues est inutile.

Le deuxiĂšme tour a eu lieu Ă  une Ă©poque moins lointaine et m'a conduit au sujet de cet article — projet USB/IP. Il attire par sa transparence, d'autant plus que l'Ă©quipe de ReactOS a signĂ© des drivers pour Windows, de sorte qu'aujourd'hui, mĂȘme sur x64, tout fonctionne sans recourir Ă  des astuces comme le mode test. Un grand merci Ă  l'Ă©quipe de ReactOS ! Tout semble beau, essayons de voir si cela fonctionne rĂ©ellement ? Malheureusement, le projet semble aussi abandonnĂ©, et il ne faut pas compter sur un support — mais nous ne sommes pas Ă  court de ressources, le code source est lĂ , nous allons nous dĂ©brouiller !

Partie deux, serveur et Linux

Un serveur USB/IP, partageant des appareils USB sur le rĂ©seau, ne peut ĂȘtre installĂ© que sur un systĂšme d'exploitation basĂ© sur Linux. TrĂšs bien, Linux soit, installons-le sur une machine virtuelle Debian 8 en configuration minimale, routine standard :

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

Nous sommes installés. Ensuite, Internet nous indique qu'il faudrait charger le module usbip, mais voici le premier obstacle. Il n'y a pas de tel module. C'est parce que la plupart des guides en ligne concernent une version plus ancienne 0.1.x, tandis que dans la version 0.2.0, les modules usbip portent d'autres noms.

Donc :

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

Ajoutons donc dans /etc/modules ces lignes afin de les charger automatiquement au démarrage du systÚme :

usbip-core
usbip-host
vhci-hcd

Lançons le serveur usbip :

sudo usbipd -D

Ensuite, l'intelligence mondiale nous indique qu'avec usbip, il existe des scripts qui nous permettent de gĂ©rer le serveur — montrer quel appareil il partagera sur le rĂ©seau, vĂ©rifier le statut, etc. Ici, un autre obstacle se prĂ©sente — ces scripts dans la version 0.2.x, encore une fois, ont Ă©tĂ© renommer. On peut obtenir la liste des commandes grĂące Ă 

sudo usbip

AprĂšs avoir lu la description des commandes, il devient clair que pour partager le pĂ©riphĂ©rique USB requis, usbip souhaite connaĂźtre son Bus ID. Chers spectateurs, voici le troisiĂšme obstacle : ce Bus ID, que nous fournira lsusb (apparemment, le chemin le plus Ă©vident) — ne convient pas ! En effet, des pĂ©riphĂ©riques tels que les hubs USB sont ignorĂ©s par usbip. Donc, utilisons la commande intĂ©grĂ©e :

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

Remarque : dans les listings suivants, je vais tout décrire en prenant pour exemple ma clé USB spécifique. Les noms de vos appareils et quelques VID:PID peuvent varier. La mienne s'appelle Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nous pouvons maintenant partager notre appareil :

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

Hurrah, mes amis !

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)

Trois fois hurrah, mes amis ! Le serveur a partagé l'appareil sur le réseau, et nous pouvons le connecter ! Il ne reste plus qu'à ajouter le démarrage automatique du démon usbip dans /etc/rc.local

usbipd -D

Partie trois, le client, et c'est complexe

J'ai essayĂ© de connecter le pĂ©riphĂ©rique partagĂ© sur un ordinateur fonctionnant sous Debian immĂ©diatement sur le mĂȘme serveur et tout s'est bien connectĂ© :

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

Passons à Windows. Dans mon cas, il s'agissait de Windows Server 2008R2 Standard Edition. Le guide officiel demande d'abord d'installer le pilote. La procédure est parfaitement décrite dans le readme fourni avec le client Windows, faisons tout comme indiqué, tout fonctionne. Cela fonctionne aussi sur XP sans aucun problÚme.

AprÚs avoir décompressé le client, essayons de monter notre clé :

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) impossible de trouver le dispositif

Oh là là. Quelque chose s'est mal passé. Utilisons notre talent pour Google. Il y a des mentions sporadiques que quelque chose ne va pas avec les constantes, dans la partie serveur, les développeurs ont changé la version du protocole lors du passage à la version 0.2.0, mais cela a été oublié dans le client sous Windows. La solution proposée consiste à modifier la constante dans le code source et à recompiler le client.

Sauf que je n'ai vraiment pas envie de tĂ©lĂ©charger Visual Studio pour cela. Heureusement, j'ai le bon vieux Hiew. Dans le code source, la constante est dĂ©clarĂ©e comme un double mot. Cherchons dans le fichier 0x00000106, remplaçant par 0x00000111. N'oublions pas que l'ordre des octets est inversĂ©. RĂ©sultat — deux correspondances, faisons un patch :

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

Et
 oui !

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
nouveau périphérique USB attaché au port usbvbus 1

On pourrait s'arrĂȘter lĂ , mais la musique n'a pas durĂ© longtemps. AprĂšs avoir redĂ©marrĂ© le serveur, j'ai dĂ©couvert que le dispositif ne se monte pas sur le client !

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) impossible de trouver le dispositif

Et voilĂ . MĂȘme Google, tout-puissant, n'a pas pu rĂ©pondre Ă  cela. Pourtant, la commande pour afficher les dispositifs disponibles sur le serveur fonctionne tout Ă  fait correctement — voici la clĂ©, vous pouvez monter. J'essaie de monter depuis Linux — ça marche ! Et si j'essaie maintenant depuis Windows ? Oh horreur — ça fonctionne !

Dernier point : quelque chose dans le code du serveur n'est pas correctement Ă©crit. Lors du partage du dispositif, il ne lit pas le nombre de descripteurs USB. Cependant, lorsque le dispositif est montĂ© depuis Linux, ce champ est rempli. Malheureusement, je ne connais le dĂ©veloppement sous Linux qu'Ă  un niveau de « make && make install ». Par consĂ©quent, le problĂšme a Ă©tĂ© rĂ©solu par un hack plutĂŽt sale — en ajoutant dans /etc/rc.local

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

Partie finale

AprĂšs quelques pĂ©ripĂ©ties, cela fonctionne. L'objet souhaitĂ© est obtenu, le clĂ© peut maintenant ĂȘtre montĂ©e sur n'importe quel PC (et dĂ©montĂ©e, bien sĂ»r), y compris en dehors du segment de diffusion du rĂ©seau. Si vous le souhaitez, cela peut ĂȘtre fait Ă  l'aide d'un script de shell. Ce qui est agrĂ©able, c'est que c'est entiĂšrement gratuit.
J'espÚre que mon expérience aidera les membres de Habr à éviter les piÚges que j'ai rencontrés. Merci de votre attention !

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster