Wil je een usb-apparaat zo ver weg zetten dat een usb-kabel geen optie is? Met een Raspberry Pi en USB over IP kun je usb-apparaten aansluiten via wifi of een ethernetkabel. Dat is goedkoper dan speciale ethernet-usb-adapters maar kost wat inspanning.
Lees verder voor speciale software die je voor dit ‘usb verlengen’ kunt gebruiken en hoe je die toevoegt.
Het usb-apparaat wordt dus op een Raspberry Pi aangesloten en via het netwerk aan een ander systeem gekoppeld. De basis berust op functies die al bijna tien jaar in de Linux-kernel zitten, namelijk het oorspronkelijk door Takahiro Hirofuchi ontwikkelde USB/IP-project.
Daarmee kan een systeem in het netwerk (de ‘server’) aan een ander systeem (de ‘client’) een usb-apparaat ter beschikking stellen, alsof dat lokaal op die client aangesloten is. Met USB over IP maak je een ‘rechtstreekse’ verbinding, de techniek is niet bedoeld om apparaten te delen met anderen.
Voorbeelden van toepassingen voor USB over IP
Je kunt hiermee bijvoorbeeld
- op een plek met een goed bereik een Zigbee-dongle plaatsen,
- een geheugenstick zonder traplopen aansluiten op de server in de kelder,
- een usb-printer op een plaats zetten waar je geen last hebt van het geluid of de uitstoot.
Aangepaste software voor USB over IP
Op de server is niet veel nodigde behalve de kernelmodules voor USB/IP, namelijk usbip_host en usbip_core. Bovendien moet die een daemon draaien (usbipd), die verbindingen aanneemt van de client die een usb-apparaat wil benaderen. De client heeft de module vhci_hcd nodig, maar geen daemon.
De bijbehorende commando’s met busip breien de boel aan elkaar maar gebruiken daarbij de bus-id’s van usb-apparaten en er zitten andere haken en ogen aan. Daarom hebben we eigen systemd-units geschreven, die de afhandeling van de ‘genetwerkte’ usb-apparaten verlichten omdat ze in plaats van bus-id’s de fabrikant- en apparaat-id gebruiken. Daardoor werkt het vrijgeven ongeacht op welke poort het apparaat zit.
Aangepaste software installeren
Het op Github gepubliceerde archief met de bestanden voor de systemd-units en de udev-rules bevat een client- en een servermap.
- Project op Github met systemd-units en udev-rules
Kopieer de bestanden naar de betreffende systemen. De systemd-units registreer je dan zowel op de server als op de client met systemctl daemon-reload.
Je hoeft met deze units geen bus-id’s en poorten te kennen, maar wat ze daarom niet (kunnen) ondersteunen, is het gelijktijdig delen van meerdere identieke apparaten op een server.
Gebruik sudo bij alle opdrachten.
Usb-apparaat delen op de server
Op de server zet je de op het netwerk te delen apparaten met fabrikant- en apparaat-id, zoals bijvoorbeeld lsusb die laat zien, in het bestand /etc/udev/rules.d/90-usbip.rules. Je vindt in het bestand een paar uitgecommentarieerde voorbeelden.
Vervolgens laat je op de server udev de nieuwe rules tot zich nemen: udevadm control –reload -rules && udevadm trigger.
Als je dan met systemctl | grep usbip alle actieve units met usbip in de naam laat weergeven, moet je in de output zowel de usbipd-service zien die de daemon start, als voor ieder gedeeld apparaat een usbip@-service.
De usbip@-services krijgen als parameter en naamtoevoeging het usb-poortnummer waaraan de via udev-rules opgegeven apparaten hangen. De unit achterhaalt dat aan de hand van de fabrikant- en apparaat-id automatisch.
Usb-apparaat koppelen op de client
Na het succesvol registreren van de systemd-units op de server en client en het delen van de usb-apparaten op de server kun je de client met een usb-apparaat verbinden.
Daarvoor activeer en start je een systemd-unit als volgt:
systemctl enable usbip@srv:0403:6001
systemctl start usbip@srv:0403:6001
Daarbij staat srv voor de naam van de server die het usb-apparaat met de fabrikant- en apparaat-id 0403:6001 deelt.
Je kunt in plaats van de naam ook het ip-adres van de server opgeven (IPv4 of IPv6, de unit accepteert beide). De door de usbip@-services getriggerde usbipd-service start op de client geen daemon, maar laadt alleen de benodigde kernelmodules.
Nadelen bij USB over IP?
In tegenstelling tot veel projecten op internet doen onze units geen moeite om ontspoorde usb-apparaten en -verbindingen weer op de rails te krijgen. Enerzijds draaiden via het netwerk toegankelijk gemaakte usb-apparaten wekenlang stabiel.
Anderzijds zal bijvoorbeeld een Zigbee-stick die in het ongerede raakt, ook de betreffende software onderuit halen en kun je beter de hele stack opnieuw starten (behalve de server met de usb-share ook eventuele serverdiensten op de client of het voor Zigbee verantwoordelijke onderdeel).
Houd er verder rekening mee dat het netwerkverkeer tussen de server (de Rasperry Pi) en de client niet versleuteld is.
Ontvang gratis informatie en tips voor de Raspberry Pi, schrijf je in voor de nieuwsbrief:
Extra opmerkingen bij USB over IP
Bij de experimenten voor dit artikel ontdekten deden we veel praktische ervaring op. Hieronder vind je informatie die misschien van pas kan komen:
- Op Debian-systemen (en dus ook op de Raspberry Pi met Pi OS) lukt het automatiseren pas met Bullseye goed, oudere versies gaven problemen.
- Seriële toepassingen zoals Zigbee-adapters en Arduino’s met LaCrosse-firmware draaiden wekenlang stabiel, maar bij complexere adapters die isochrone communicatie verwachten (zoals camera’s en audio-apparaten) kun je beter voor een directe usb-aansluiting gaan.
- Usb-hubs gelden voor USB over IP niet als apparaat en het lukte niet ze als hub in het netwerk te delen.
- Een kritische factor bleek het type netwerk: ethernet heeft de voorkeur boven wifi, maar dat geldt algemeen bij de Raspberry Pi. Probeer anders de ontvangstsituatie te verbeteren of de energiebesparende functies van de wifi-adapter uit te schakelen.
Belangrijk is ook om op zoveel mogelijk actuele kernels en USB/IP-pakketten te gebruiken en niet verschillende versies te mengen. We hebben dat zowel bij Pi OS als bij Debian gezien, daar moet je de Bullseye-versie van gebruiken. Op dezelfde manier werkte Linux Mint als client pas mee nadat hij was bijgewerkt naar de laatste versie.
Je hebt voor dit project in principe al genoeg aan een Raspberry Pi Zero W of een ouder model. Die kun je ook voor andere projecten inzetten:
(Deze informatie is afkomstig uit het artikel in c’t 8-9, 2022, pagina 74, van Peter Siering en Noud van Kruysbergen)