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 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é
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 - . Attire avec ouverture, d'autant plus que les gars de Le chauffeur a signé pour eux WindowsDu coup, tout fonctionne désormais correctement, même sur x64, sans avoir recours à des solutions de contournement comme le mode test. Un grand merci à l'équipe ReactOS ! C'est génial, essayons de vérifier si c'est bien le cas. Malheureusement, le projet est abandonné et l'assistance est difficile à obtenir, mais nous continuons à travailler dessus : le code source est disponible, nous trouverons une solution !
Deuxième partie, serveur-linux
Un serveur USB/IP permettant le partage de périphériques USB sur un réseau ne peut être configuré que dans LinuxSystème d'exploitation basé sur Linux. Bon, Linux c'est Linux, alors installons-le sur une machine virtuelle. Debian 8 en configuration minimale, mouvement de la main standard :
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbipInstallé. 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 usbipEh bien, ajoutons les lignes suivantes à /etc/modules pour les charger automatiquement au démarrage du système :
usbip-core
usbip-host
vhci-hcdDémarrons le serveur usbip :
sudo usbipd -DDe 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 usbipAprè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: completeSalut, 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 -DTroisième partie, côté client et déroutant
Connectez le périphérique partagé à la machine exécutant le réseau. Debian Je l'ai immédiatement testé sur le même serveur, et tout s'est connecté parfaitement :
sudo usbip attach --remote=localhost --busid=1-1Allez à WindowsDans mon cas, c'était Windows Server Windows Server 2008 R2 Standard Edition. Le manuel officiel recommande d'installer le pilote au préalable. La procédure est bien décrite dans le fichier Lisez-moi fourni avec le client Windows ; nous avons suivi les instructions et tout a fonctionné correctement. Cela fonctionne également sans problème sous XP.
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 deviceAh 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 11Eeeee... oui !
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1Cela 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 deviceEt voilà. Même Google, pourtant omniscient, n'a pas pu répondre. En revanche, la commande permettant d'afficher les périphériques disponibles sur le serveur le confirme sans problème : voilà la solution, on peut le monter. J'essaie de le monter depuis… Linux — Ça marche ! Et si on essaie par en dessous WindowsOh, l'horreur – ça marche !
Dernier problème : il manque quelque chose dans le code du serveur. Lors du partage d'un périphérique, le nombre de descripteurs USB n'est pas lu. Et lors du montage d'un périphérique depuis… LinuxCe champ est renseigné. Malheureusement, avec le développement en cours, Linux Je connais la commande « make && make install ». Le problème a donc été résolu par une astuce plutôt grossière : l’ajouter à /etc/rc.local.
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00Partie 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
