Apprivoiser USB/IP

La tâche de connecter un périphérique USB à un PC distant via un réseau local se pose régulièrement. Sous la coupe, l'historique de mes recherches dans cette direction est exposé, et le chemin vers une solution toute faite basée sur un projet open-source USB/IP avec une description des obstacles soigneusement dressés par diverses personnes sur ce chemin, ainsi que des moyens de les contourner.

Première partie, historique

Si la machine est virtuelle - tout cela est facile. La fonctionnalité de transfert USB d'un hôte vers une machine virtuelle est apparue dans VMWare 4.1. Mais dans mon cas, la clé de sécurité, reconnaissable comme WIBU-KEY, devait être connectée à différents moments à différentes machines, et pas seulement virtuelles.
Le premier tour de recherche dans le lointain 2009 m'a conduit à un morceau de fer appelé TrendNet TU2-NU4
Avantages:

  • parfois ça marche même

Inconvénients:

  • ne fonctionne pas toujours. Supposons que la clé de protection Guardant Stealth II ne démarre pas, jurant avec l'erreur "l'appareil ne peut pas être démarré".
  • Le logiciel de gestion (lecture - montage et démontage des périphériques USB) est pathétique à l'extrême. Commutateurs de ligne de commande, automatisation - non, n'ont pas entendu. Tout est juste à la main. Cauchemar.
  • le logiciel de contrôle recherche le morceau de fer lui-même dans le réseau par diffusion, cela ne fonctionne donc que dans un segment de réseau de diffusion. Vous ne pouvez pas spécifier l'adresse IP du morceau de fer à la main. Un morceau de fer dans un autre sous-réseau ? Alors vous avez un problème.
  • développeurs ont marqué sur l'appareil, il est inutile d'envoyer des rapports de bugs.

Le deuxième tour s'est produit à une époque pas si lointaine et m'a conduit au sujet de l'article - Projet USB/IP. Attire avec ouverture, d'autant plus que les gars de ReactOS ils ont signé un pilote pour Windows, donc maintenant tout fonctionne même sur x64 sans aucune béquille comme un mode test. Pour quoi un grand merci à l'équipe ReactOS ! Tout semble beau, essayons de le ressentir, est-ce vraiment le cas ? Malheureusement, le projet lui-même est également abandonné, et vous ne pouvez pas compter sur le soutien - mais là où le nôtre n'a pas disparu, la source est là, nous allons le découvrir !

Deuxième partie, serveur-linux

Un serveur USB/IP qui partage des périphériques USB sur un réseau ne peut être configuré que sur un système d'exploitation basé sur Linux. Eh bien, Linux est Linux, alors installez-le sur la machine virtuelle Debian 8 dans la configuration minimale, mouvement de la main standard :

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

Installé. De plus, Internet suggère que vous auriez besoin de télécharger le module usbip, mais - bonjour, le premier râteau. Un tel module n'existe pas. Et tout cela parce que la plupart des manuels sur le réseau font référence à l'ancienne branche 0.1.x, et dans la dernière version 0.2.0, les modules usbip ont des noms différents.

Par conséquent:

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

Eh bien, ajoutons les lignes suivantes à /etc/modules pour les charger automatiquement au démarrage du système :

usbip-core
usbip-host
vhci-hcd

Démarrons le serveur usbip :

sudo usbipd -D

De plus, l'esprit universel nous dit que usbip est livré avec des scripts qui nous permettent de gérer le serveur - montrer quel appareil il partagera sur le réseau, voir l'état, etc. Ici, un autre outil de jardin nous attend - ces scripts de la branche 0.2.x, encore une fois, ont été renommés. Vous pouvez obtenir une liste de commandes avec

sudo usbip

Après avoir lu la description des commandes, il devient clair que pour partager le périphérique USB requis, usbip veut connaître son ID de bus. Chers téléspectateurs, le râteau numéro trois est dans l'arène : le Bus ID qui nous donnera lsusb (cela semblerait le moyen le plus évident) - cela ne lui convient pas! Le fait est que usbip ignore le matériel comme les concentrateurs USB. Par conséquent, nous utiliserons 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 : ci-après dans les listes, je vais tout décrire en utilisant l'exemple de ma clé USB spécifique. Le nom de votre matériel et la paire VID:PID peuvent et seront différents. Le mien 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

Salut, camarades!

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 acclamations, camarades! Le serveur a partagé le morceau de fer sur le réseau, et nous pouvons le connecter ! Il ne reste plus qu'à ajouter l'autostart du démon usbip dans /etc/rc.local

usbipd -D

Troisième partie, côté client et déroutant

J'ai essayé de connecter immédiatement le périphérique partagé sur le réseau à une machine Debian sur le même serveur, et tout s'est bien connecté :

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

Passons à Windows. Dans mon cas, c'était Windows Server 2008R2 Standard Edition. Le guide officiel vous demande d'installer le pilote en premier. La procédure est parfaitement décrite dans le readme joint au client windows, on fait tout comme c'est écrit, tout s'arrange. Sur XP, cela fonctionne également sans aucun problème.

Après avoir déballé le client, nous 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) cannot find device

Ah ah. Quelque chose s'est mal passé. Nous utilisons les compétences de Google. Il y a des mentions fragmentaires 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 ils ont oublié de le faire dans le client Win. La solution proposée est de changer la constante dans le code source et de reconstruire le client.

Mais je ne veux vraiment pas télécharger Visual Studio pour le bien de cette procédure. Mais j'ai un bon vieux Hiew. Dans le code source, la constante est déclarée comme un mot double. Cherchons dans le fichier 0x00000106, en le remplaçant par 0x00000111. N'oubliez pas que l'ordre des octets est inversé. Le résultat est deux correspondances, patch :

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

Eeeee... oui !

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

Cela aurait pu mettre fin à la présentation, mais la musique n'a pas duré longtemps. Après avoir redémarré le serveur, j'ai constaté que le périphérique sur le client n'était pas monté !

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

Et c'est tout. Même Google, qui sait tout, n'a pas pu répondre à ma place. Et en même temps, la commande pour afficher les périphériques disponibles sur le serveur s'affiche assez correctement - la voici, la clé, vous pouvez la monter. J'essaie de monter sous Linux - ça marche ! Et si maintenant essayez sous Windows ? Oh merde - ça marche!

Le dernier râteau : quelque chose n'est pas ajouté dans le code du serveur. Lors du partage d'un appareil, il ne lit pas le nombre de descripteurs USB qu'il contient. Et lors du montage de l'appareil sous Linux, ce champ est rempli. Malheureusement, je suis familier avec le développement sous Linux au niveau « make && make install ». Par conséquent, le problème est résolu avec un hack plutôt sale - en ajoutant à /etc/rc.local

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

Partie finale

Après quelques manipulations, ça marche. Le résultat souhaité a été obtenu, maintenant la clé peut être montée sur n'importe quel PC (et démontée, bien sûr aussi), y compris ceux en dehors du segment de réseau de diffusion. Si vous le souhaitez, vous pouvez le faire en utilisant un script shell. Ce qui est bien - le plaisir est absolument gratuit.
J'espère que mon expérience aidera habrazhiteli à contourner le râteau qui s'est imprimé sur mon front. Merci pour votre attention!

Source: habr.com

Ajouter un commentaire