Parfois il peut arriver que vous ayez un périphérique USB qui soit connecté sur un ordinateur, mais vous aimeriez bien le partager pour l’exploiter sur un autre ordinateur.
Et bien, sachez que cela est tout à fait possible !!!
Il existe plusieurs solutions permettant cela, majoritairement payantes, mais certaines comme le projet « USBip » disponible sous Linux et Windows, permettent ce genre de partage.

La description suivante est proposée pour partager un périphérique USB Bluetooth entre deux machines Linux; la machine serveur aura le périphérique USB connecté sur son connecteur USB tandis que le client accèdera virtuellement au périphérique au travers le réseau qui les relie.
Références :
- https://usbip.sourceforge.net/
- https://sourceforge.net/p/usbip/git-windows/ci/master/tree/trunk/userspace/README
- https://bbs.archlinux.org/viewtopic.php?id=233424
- https://github.com/dorssel/usbipd-win
La solution USBip est à l’origine le projet d’un japonnais et s’appuie sur l’architecture suivante :
Installation et configuration coté SERVEUR
La documentation disponible sur le site du projet n’est pas tout à fait à jour; je reprend le descriptif d’installation tout en commentant la méthode d’installation et son utilisation.
Commencer par installer le paquet « USB IP » :
# Sur RedHat, CentOS, RockyLinux, etc...sudo yum install usbip# Sur Debian, Ubuntu, etc...sudo apt-get install usbipLecture des listes de paquets... FaitConstruction de l'arbre des dépendances... FaitLecture des informations d'état... FaitLes paquets supplémentaires suivants seront installés : usb.idsLes NOUVEAUX paquets suivants seront installés : usb.ids usbip0 mis à jour, 2 nouvellement installés, 0 à enlever et 0 non mis à jour.Il est nécessaire de prendre 790 ko dans les archives.Après cette opération, 1 442 ko d'espace disque supplémentaires seront utilisés.Souhaitez-vous continuer ? [O/n]Réception de :1 http://deb.debian.org/debian bullseye/main amd64 usb.ids all 2022.05.20-0+deb11u1 [205 kB]Réception de :2 http://deb.debian.org/debian-security bullseye-security/main amd64 usbip amd64 2.0+5.10.162-1 [585 kB]790 ko réceptionnés en 1s (1 162 ko/s)Sélection du paquet usb.ids précédemment désélectionné.(Lecture de la base de données... 45887 fichiers et répertoires déjà installés.)Préparation du dépaquetage de .../usb.ids_2022.05.20-0+deb11u1_all.deb ...Dépaquetage de usb.ids (2022.05.20-0+deb11u1) ...Sélection du paquet usbip précédemment désélectionné.Préparation du dépaquetage de .../usbip_2.0+5.10.162-1_amd64.deb ...Dépaquetage de usbip (2.0+5.10.162-1) ...Paramétrage de usb.ids (2022.05.20-0+deb11u1) ...Paramétrage de usbip (2.0+5.10.162-1) ...Traitement des actions différées (« triggers ») pour man-db (2.9.4-2) ...
Maintenant que le paquet applicatif est installé, il faut activer le service…. sauf que le paquet n’apporte aucun système de démarrage. Comme nous sommes actuellement en plein « SystemD », je vous propose de démarrer le service en créant le fichier « /etc/systemd/system/usbip.service » avec votre éditeur de texte préféré :
[Unit] Description=Partage de périphérique USB After=network.target[Service] User=root Group=root ExecStart=/usr/sbin/usbipd -D Restart=on-failure RestartSec=1m #StandardOutput=null[Install] WantedBy=multi-user.target
Une fois le fichier créé, il est possible de lancer le service sur SERVEUR :
root@hyperviseur:/etc/systemd/system# systemctl start usbip.serviceroot@hyperviseur:/etc/systemd/system#root@hyperviseur:/etc/systemd/system# systemctl status usbip.service● usbip.service - Partage de périphérique USB Loaded: loaded (/etc/systemd/system/usbip.service; disabled; vendor preset: enabled) Active: deactivating (stop-sigterm) since Sat 2023-04-15 16:16:22 CEST; 3s ago Process: 646 ExecStart=/usr/sbin/usbipd -D (code=exited, status=0/SUCCESS) Main PID: 646 (code=exited, status=0/SUCCESS) Tasks: 1 (limit: 4915) Memory: 756.0K CGroup: /system.slice/usbip.service └─647 /usr/sbin/usbipd -Davril 15 16:16:22 hyperviseur systemd[1]: Started Partage de périphérique USB.avril 15 16:16:22 hyperviseur usbipd[647]: usbipd: info: starting usbipd (usbip-utils 2.0)avril 15 16:16:22 hyperviseur usbipd[647]: usbipd: info: listening on 0.0.0.0:3240avril 15 16:16:22 hyperviseur usbipd[647]: usbipd: info: listening on :::3240root@hyperviseur:~# systemctl enable usbip.serviceCreated symlink /etc/systemd/system/multi-user.target.wants/usbip.service → /etc/systemd/system/usbip.service.
La commande « systemctl status usbip.service » permet de voir ainsi que le binaire est bien lancé, mais qu’en plus, il écoute sur le port 3240. C’est en effet le port TCP quis era utilisé par le service pour faire communiquer les machines et ainsi partager, les périphériques USB.
Faites donc attention à vos Firewall, ils doivent laisser passer ce port TCP sous peine d’avoir des problèmes de laisons avec le client par la suite…
Avant d’aller plus loin :
- Vérifier que vos périphériques USB sont bien connectés sur votre SERVEUR
- Vérifier que votre machine SERVEUR est sur la même plage d’adresse IP que votre machine CLIENTE (normalement le cas pour une utilisation sur réseau local)
- Lancer les commandes suivantes pour s’assurer que les modules kernel sont correctement installés et chargés :
root@hyperviseur:~# modprobe vhci_hcd usbip_host usbip_core# Vérification que les modules USBip sont bien chargés en mémoire sur Linuxroot@hyperviseur:~# lsmod | grep usbipusbip_host 36864 0usbip_core 32768 2 usbip_host,vhci_hcdusbcore 299008 7 xhci_hcd,ehci_pci,ehci_hcd,btusb,xhci_pci,usbip_host,vhci_hcdusb_common 16384 3 usbip_core,usbcore,vhci_hcd
Il ne reste plus qu’à regarder comment son vu les périphérique USB par « USBip » sur le SERVEUR :
root@hyperviseur:/usr# usbip versionusbip (usbip-utils 2.0)root@hyperviseur:/usr# usbip list -l - busid 3-1.7 (0a12:0001) Cambridge Silicon Radio, Ltd : Bluetooth Dongle (HCI mode) (0a12:0001)root@hyperviseur:/usr# lsusbBus 020 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 019 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 003 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)Bus 003 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching HubBus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching HubBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
En utilisant la commande standard Linux « lsusb« , on trouve ainsi tous les périphériques et Hub USB connectés à la machine : dans mon cas, je n’ai qu’un seul périphérique USB connecté, un dongle USB Bluetooth… Mais on pourrait trouver un clavier, une sourie, un disque dur, un lecteur de carte ou de DVD, etc… Et tout cela aurait pu être « exportable » !!!
Remarquez bien le résultat de la commande « usbip list -l » : elle renvoie l’ID du bus qui détermine le périphérique USB que nous souhaitons partager; ici, l’ID est : 3-1.7
Il ne nous reste plus qu’à indiquer que nous partageons ce périphérique sur le réseau :
root@hyperviseur:~# usbip bind -b 3-1.7usbip: info: bind device on busid 3-1.7: complete
Si vous rencontrez un message du type « usbip: error: device on busid 3-1.7 is already bound to usbip-host » cela signifie que vous avez déjà partagé le périphérique USB; il faut alors le supprimer de la liste des périphériques partagés :
root@hyperviseur:~# usbip unbind -b 3-1.7usbip: info: unbind device on busid 3-1.7: complete
Installation et configuration coté CLIENT
L’installation du service est presque pareil, mais cette fois, nous ne sommes pas « serveur » et nous n’aurons pas à créer un service SystemD pour lancer un démon « USBip »…
Installons et recherchons les périphériques partagés :
# Sur RedHat, CentOS, RockyLinux, etc...sudo yum install usbip# Sur Debian, Ubuntu, etc...sudo apt-get install usbipLecture des listes de paquets... FaitConstruction de l'arbre des dépendances... FaitLecture des informations d'état... FaitLes paquets supplémentaires suivants seront installés : usb.idsLes NOUVEAUX paquets suivants seront installés : usb.ids usbip0 mis à jour, 2 nouvellement installés, 0 à enlever et 0 non mis à jour.Il est nécessaire de prendre 790 ko dans les archives.Après cette opération, 1 442 ko d'espace disque supplémentaires seront utilisés.Souhaitez-vous continuer ? [O/n]Réception de :1 http://deb.debian.org/debian bullseye/main amd64 usb.ids all 2022.05.20-0+deb11u1 [205 kB]Réception de :2 http://deb.debian.org/debian-security bullseye-security/main amd64 usbip amd64 2.0+5.10.162-1 [585 kB]790 ko réceptionnés en 1s (1 162 ko/s)Sélection du paquet usb.ids précédemment désélectionné.(Lecture de la base de données... 45887 fichiers et répertoires déjà installés.)Préparation du dépaquetage de .../usb.ids_2022.05.20-0+deb11u1_all.deb ...Dépaquetage de usb.ids (2022.05.20-0+deb11u1) ...Sélection du paquet usbip précédemment désélectionné.Préparation du dépaquetage de .../usbip_2.0+5.10.162-1_amd64.deb ...Dépaquetage de usbip (2.0+5.10.162-1) ...Paramétrage de usb.ids (2022.05.20-0+deb11u1) ...Paramétrage de usbip (2.0+5.10.162-1) ...Traitement des actions différées (« triggers ») pour man-db (2.9.4-2) ...# On n'oublie SURTOUT pas le modprobe sur nos 3 modules sous peine que rien ne fonctionneroot@HomeAssistant:~# modprobe vhci_hcd usbip_host usbip_core# Recherche des périphériques partagés sur la machine SERVEUR (192.168.1.190)root@HomeAssistant:~# usbip list -r 192.168.1.190Exportable USB devices====================== - 192.168.1.190 3-1.7: Cambridge Silicon Radio, Ltd : Bluetooth Dongle (HCI mode) (0a12:0001) : /sys/devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1.7 : Wireless / Radio Frequency / Bluetooth (e0/01/01)
Comme on peut le voir, on retrouve notre ID (3-1.7) du périphérique USB partagé – le dongle Bluetooth.
Maintenant que l’on sait qu’il est accessible, il ne reste plus qu’à le faire reconnaitre par la machine cliente; pour cela, on va attacher l’ID du périphérique à la machine :
# Connexion sur la machine CLIENTE "HomeAssistant" (machine virtuelle)root@HomeAssistant:~# usbip attach -r 192.168.1.190 -b 3-1.7# Petit coup de "lsusb" pour voir si notre périphérique est bien monté ?root@HomeAssistant:~# lsusbBus 018 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 017 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 016 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 015 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 003 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Parfait !
Notre périphérique est maintenant monté sur la machine CLIENTE… Vous n’avez plus qu’à l’exploiter 😉
Vérifications et problèmes / résolutions
Parmi tous les problèmes que j’ai pu rencontrer dans mon environement (un peu spécial !), on peut compter sur :
- Sécurité SELinux
- Firewall
- Oublie d’import des modules Kernel
Sur le client, pour valider que le périphérique est bien monté, vous pouvez également lancer la commande qui valide votre configuration :
root@HomeAssistant:~# usbip portImported USB devices====================Port 00: at Full Speed(12Mbps) Cambridge Silicon Radio, Ltd : Bluetooth Dongle (HCI mode) (0a12:0001) 3-1 -> usbip://192.168.1.190:3240/3-1.7 -> remote bus/dev 003/003