So schalten Sie programmgesteuert die Stromversorgung eines feststeckenden USB-Geräts mit uhubctl ab
Stellen Sie sich eine häufige Situation vor: Ein 4G-Modem ist auf einem Remote-Server, einem Datscha-Router oder einem Teststand eingefroren. Oder ein Raspberry-Pi-Board ist in einen abnormalen Modus gewechselt, und ein 3D-Drucker-Controller reagiert nicht mehr auf Befehle. Ein normaler OS-Neustart hilft nicht, da die Stromversorgung an den USB-Ports weiterhin anliegt. Die einzige Option ist, zum Standort zu fahren und das Kabel manuell zu trennen.
Wenn Sie nicht als „laufender Administrator" arbeiten möchten, kommt das Dienstprogramm uhubctl gelegen. Vadim Mikhaylov schrieb dieses Tool 2015 in C, und das Projekt ist noch aktiv. Der Hauptzweck des Programms ist es, Low-Level-USB-Befehle an den Hub-Controller zu senden, damit dieser die VBUS-Spannung von einem bestimmten Port physisch entfernt.
So funktioniert es und der Haken mit der Hardware
uhubctl vollbringt keine Wunder aus dem Nichts. Es funktioniert nur mit Hubs, bei denen der Hersteller Hardware-Unterstützung für Per-Port-Power-Switching (PPPS) implementiert hat. Laut USB-2.0- und USB-3.0-Standards existiert diese Spezifikation schon lange, aber Kosteneinsparungen bei Stromkomponenten bedeuten, dass viele günstige Hubs die Stromversorgung aller Ports in einer einzigen Leitung zusammenfassen.
Dennoch gibt es genügend kompatible Geräte auf dem Markt. Das Repository führt eine detaillierte Tabelle mit Dutzenden verifizierten Modellen:
- Integrierte Hubs in Dell-, LG-, BenQ- und Acer-Monitoren.
- Raspberry-Pi-Einplatinencomputer (bei den Modellen 3B+ und 4B können Sie die Stromversorgung deaktivieren, allerdings mit einigen Nuancen).
- Externe Hubs von Anker, D-Link, Rosonway und Plugable.
- Asus-Mainboards und KUNBUS RevPi-Industriecontroller.
Unter der Haube
uhubctl kommuniziert mit dem Hub über die libusb-Bibliothek oder direkt über Linux-Kernel-Schnittstellen. Linux-Kernel 6.0 führte einen Standardmechanismus zum Deaktivieren von Ports über sysfs ein. Das Dienstprogramm probiert dies zuerst aus, und wenn Sie ein älteres System oder macOS verwenden, wechselt es zu libusb.
Es gibt eine Nuance bei USB 3.0. Wenn Sie einen modernen Hub an einen USB-3.0-Port anschließen, sieht das System ihn als zwei separate logische Geräte: einen virtuellen USB-2.0-Hub und einen virtuellen USB-3.0-Hub. Wenn Sie die Stromversorgung nur an einem Zweig unterbrechen, kann das angeschlossene Gerät einfach auf die andere Geschwindigkeit umschalten und weiterarbeiten. uhubctl übernimmt diese Routine für Sie und führt einen synchronen Trennvorgang an beiden virtuellen Hubs durch.
Installation und Schnellstart
In den meisten Linux-Distributionen ist das Dienstprogramm bereits in den Standard-Repositories verfügbar:
Für macOS erfolgt die Installation über Homebrew:
Wenn Ihre Distribution eine veraltete Version hat, ist das Kompilieren aus Git-Quellen unkompliziert. Sie benötigen gcc und libusb:
Zuerst sollten Sie das Dienstprogramm ohne Parameter ausführen, um eine Liste der verfügbaren Hubs und der daran angeschlossenen Geräte zu sehen:
Der Befehl gibt die Bus-Topologie, Hub-Adressen im Hex- oder Dezimalformat und den Zustand jedes Ports aus.
Befehlsbeispiele
Um die Stromversorgung des zweiten Ports am Standard-Hub zu unterbrechen, führen Sie aus:
Anstelle von off und on können Sie die reset-Aktion übergeben. Sie deaktiviert die Stromversorgung, wartet eine kurze Pause und schaltet sie wieder ein. Dies eignet sich für einen Hard-Reset von eingefrorener Ausrüstung:
Der -d-Parameter setzt eine 3-Sekunden-Verzögerung vor der Wiederherstellung der Stromversorgung. Wenn Sie mehrere Ports gleichzeitig zurücksetzen müssen, geben Sie sie durch Kommas oder einen Bindestrich getrennt an: 2-4 oder 5,6.
Konfigurieren der Zugriffsrechte in Linux
Standardmäßig erfordert das direkte Arbeiten mit USB-Geräten Root-Rechte. Um das Ausführen von Skripten über sudo zu vermeiden, fügen Sie udev-Regeln zur Datei /etc/udev/rules.d hinzu:
Danach führen Sie udevadm trigger aus, und die Berechtigungen werden aktualisiert.
Praktische Anwendungsfälle
Entwickler und Systemadministratoren verwenden uhubctl in einer Vielzahl von Aufgaben:
- Automatischer Reset von eingefrorenen LTE-Modems und Routern in Überwachungsfarmen.
- Steuerung von externen LED-Anzeigen, Lüftern oder Webcams.
- Sicheres Trennen von externen Festplatten zur Eliminierung von Phantomlast und Energieeinsparung.
- Integration mit OctoPrint zum ferngesteuerten Ein- und Ausschalten eines 3D-Druckers.
- Hardware-Tests in CI/CD-Pipelines, wenn Sie ein Debug-Board physisch wieder an den Teststand anschließen müssen.
Einschränkungen und Hardware-Spezifika
Bevor Sie das Dienstprogramm in Ihre Skripte einbetten, sollten Sie die Hardware-Spezifika Ihres Systems überprüfen. Bei einigen Raspberry-Pi-Modellen sind beispielsweise die Stromleitungen aller vier Ports parallel geschaltet. Wenn Sie versuchen, einen Port auszuschalten, trennt das System gleichzeitig die Stromversorgung aller vier.
Darüber hinaus ziehen einige USB-versorgte Geräte weiterhin Ladestrom, selbst wenn die Datensignalleitungen getrennt sind. In diesem Fall hilft nur das Testen des spezifischen Hubs mit einem Multimeter oder Lastwiderstand.
Wenn Sie einen autonomen Teststand, ein Smart Home aufbauen oder Server mit angeschlossenen Peripheriegeräten verwalten, ist uhubctl eines jener kompakten Werkzeuge, die Sie vor langen Reisen zu gestrandeter Hardware bewahren. Das Programm wird unter der GPLv2-Lizenz vertrieben und löst seine Aufgabe ohne unnötige Komplexität. Das Wichtigste vor dem Start ist, sicherzustellenellen, dass Ihr USB-Hub die Stromverwaltung unterstützt.
Ähnliche Projekte