Steuern eines USB-Netzteils (Ein / Aus) unter Linux

164

Ist es unter Linux möglich, Netzteile manuell über USB ein- und auszuschalten?

Es gibt diesen externen USB-Lüfter (die Art, mit der Sie sich abkühlen, nicht den PC), und es wäre schön, ihn vom Terminal aus steuern zu können, da ich den Lüfter irgendwo weit weg positionieren möchte.

Ich nehme an, dass dies auch für eine Vielzahl anderer Dinge nützlich sein könnte, da es viele USB-Spielzeuge gibt. Vielleicht Luftreiniger usw. (ich habe gehört, dass sie nicht wirklich funktionieren).

Kamziro
quelle
9
Lassen Sie mich für Linux rekapitulieren> = 2.6.38: Die Datei power/level ist jetzt veraltet; Verwenden Sie power/control stattdessen . ( power/wakeupist in Ordnung.) Außerdem akzeptiert es nur noch "auto" und "on", nicht mehr "suspend". "auto" ist intelligent genug, und wenn die Stromversorgung im Leerlauf nicht ausgeschaltet wird, ist das Gerät schuld. Auf jeden Fall können Sie das Gerät nicht manuell ausschalten. Weitere Informationen finden Sie in der Antwort von tlwhitec und im Dokument des Kernels: kernel.org/doc/Documentation/usb/power-management.txt
teika kazura
Mögliches Duplikat von stackoverflow.com/q/1163824/1967396
Floris
2
Diese Funktion verdient wirklich eine gute GUI
Mikebabcock
Benötigt es spezielle Hardware? Es ist nicht ganz klar aus den Antworten,
Vojtěch Dohnal

Antworten:

63

Hinweis. Die Informationen in dieser Antwort sind für die älteren Kernel relevant (bis zu 2.6.32). Siehe tlwhitec Antwort für die Informationen zu dem neueren Kernel.

# disable external wake-up; do this only once
echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 

echo on > /sys/bus/usb/devices/usb1/power/level       # turn on
echo suspend > /sys/bus/usb/devices/usb1/power/level  # turn off

(Möglicherweise müssen Sie usb1 in usb n ändern. )

Quelle: Dokumentation / usb / power-management.txt.gz

Roman Cheplyaka
quelle
1
Whoa, danke dafür. Ich dachte, ich müsste libUSB durchlaufen, egal was passiert. Haben Sie eine Idee, wie Sie auch die Namen der angeschlossenen Geräte erhalten können?
Kamziro
Laut diesem Beitrag ist es ohne spezielle Hardware nicht möglich? blog.andrew.net.au/2009/01/17
NoBugs
7
Ich erhalte den Fehler "Erlaubnis verweigert", auch wenn ich sudo verwende!
Wally
3
das gleiche für mich "Erlaubnis verweigert" auch nach der Verwendung von sudo
Raulp
2
Die Berechtigung wird verweigert, da ein Befehl in Form von sudo foo > barals direkt für die Ausgabebarfoosudo analysiert und dann mit ausgeführt wird . Die Umleitung schlägt fehl, da dies geschieht, bevor Sie Root-Zugriff erhalten. Die Lösung besteht darin, zu verwenden sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup'und so weiter: Root zu gewinnen, eine neue Hölle auszuführen, um eine Umleitung durchzuführen, und dann etwas in den umgeleiteten Dateideskriptor auszugeben.
graben
60

Laut den Dokumenten gab es einige Änderungen an der USB-Energieverwaltung von Kernel 2.6.32 , die sich in 2.6.38 niederzulassen scheinen . Jetzt müssen Sie warten, bis das Gerät inaktiv ist. Dies wird vom jeweiligen Gerätetreiber geregelt. Der Treiber muss dies unterstützen, sonst erreicht das Gerät diesen Status nie. Leider hat der Benutzer jetzt keine Chance, dies zu erzwingen. Wenn Sie jedoch Glück haben und Ihr Gerät inaktiv werden kann, müssen Sie Folgendes tun, um dies auszuschalten:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend"
echo "auto" > "/sys/bus/usb/devices/usbX/power/level"

oder für Kernel um 2.6.38 und höher:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"
echo "auto" > "/sys/bus/usb/devices/usbX/power/control"

Dies bedeutet wörtlich, dass Sie in dem Moment suspendieren müssen, in dem das Gerät inaktiv wird.

Wenn Ihr Lüfter also nicht etwas "Intelligentes" ist, das als Gerät angesehen und von einem Treiber gesteuert werden kann, werden Sie auf aktuellen Kerneln wahrscheinlich nicht viel Glück haben.

tlwhitec
quelle
Es scheint, dass dies dazu führt, dass das USB-Gerät kontinuierlich ausgeschaltet wird ... (?) Wie sollte ich die Stromversorgung wieder aufnehmen, nachdem dies funktioniert hat? Mein Ziel ist es, das Gerät einmal neu zu starten und die Federungskonfiguration nicht dauerhaft zu ändern.
Matanster
4
Um wieder eine Bewährungs Gerät können Sie deaktivieren wieder die „Autosuspend“ mit echo "on" > "/sys/bus/usb/devices/usbX/power/control", aber ich glaube , Sie müssen den ursprünglichen Zweck zu verstehen. Die Autosuspend-Funktion dient lediglich dazu, Leerlaufgeräten den Eintritt in einen Energiesparmodus zu ermöglichen (wo sie möglicherweise ausgeschaltet erscheinen), um später wieder aufgenommen zu werden, wenn dies vom Host oder einem externen Ereignis benötigt wird. Das passiert (oder sollte passieren) automatisch. Der Port selbst wird eigentlich nie wirklich ausgeschaltet. Wirklich, lesen Sie die Dokumente ;)
tlwhitec
4
Ich kann bestätigen, dass es mit Kerneln> 3.10 funktioniert. Stellen Sie nur sicher, dass die von Ihnen verwendete "ID" des Geräts korrekt ist: dmesg | grep "usb"und verwenden Sie die Nummer nach "usb", zum Beispiel: usb 2-4.4: SerialNumber: A0848020Sie verwenden : /sys/bus/usb/devices/2-4.4/power/.... Stellen Sie außerdem sicher, dass das Gerät nicht verwendet wird. Ich habe ein Skript erstellt, um diesen Prozess zu vereinfachen
Lepe
Gibt es eine Möglichkeit, diese Konfiguration zu speichern, damit sie bei jedem Anschließen nicht wieder auf die Standardeinstellungen zurückgesetzt wird? Ich habe ein Gerät, das ich auf "Ein" stellen muss, damit es aufgeladen wird.
Quickblueblur
@quickblueblur klingt für mich wie eine udev-Regel .
tlwhitec
24

Ich habe diese Lösungen gefunden, die zumindest für ordnungsgemäß konfigurierte Terminus FE 1.1 USB-Hub-Chips funktionieren:

1.Um alle USB-Anschlüsse eines Hubs auszuschalten, können Sie den Hub vom Kernel trennen, indem Sie Folgendes verwenden:

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/unbind

Um die Stromversorgung wieder einzuschalten, können Sie sie mit wieder binden

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/bind

2.Das Schalten der Stromversorgung an jedem Port ist schwieriger: Ich konnte Hubpower verwenden , um jeden Port zu steuern - aber es hat einen Nachteil: Hubpower trennt zuerst die USB-Geräte, wodurch alle USB-Geräte zumindest unter Ubuntu vom System getrennt werden ::

usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);

Mit dieser ioctlDeaktivierung konnte ich die Stromversorgung einzelner Ports ausschalten, ohne alle Geräte abzutrennen - aber die Stromversorgung wird sofort wieder hergestellt (wahrscheinlich, weil der Kernel ein nicht initialisiertes Gerät sieht), was dazu führt, dass das USB-Gerät nur einen "Kaltstart" durchführt, was ich auch tue wollte im Allgemeinen tun. Meine gepatchte Hubpower ist hier

Grandrew
quelle
Es wurde bestätigt, dass die Bind / Unind-Einträge unter Linux-Kernel 2.6.34, dem ICH8-Chipsatz und Ubuntu 10.04 funktionieren.
user1357196
5
Durch Binden / Aufheben wird der USB-Anschluss unabhängig vom Chipsatz nicht ausgeschaltet. Das Gerät wird immer noch mit Strom versorgt ...
themihai
1
Mauslaser ist ausgeschaltet, Tastatur kann nicht tippen, Modem hört auf zu blinken - alles gut auf meiner Plattform
eri
24

Mit PowerTOP von Intel können Sie Geräte wie USB-Peripheriegeräte in Echtzeit umschalten . Diese werden als "Tunables" bezeichnet.

sudo apt install powertop
sudo powertop
  • Gehen Sie zu "Tunables".
  • Scrollen Sie nach unten zu Ihrem Gerät.
  • Drücken Sie die Eingabetaste, um den Energiesparmodus umzuschalten ( Gut / Schlecht ).

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass Bad bedeutet, dass das Gerät immer eingeschaltet ist. Durch Umschalten auf " Gut" wird das Gerät nach der voreingestellten inaktiven Speicherzeit ausgeschaltet (Standard ist 2000 ms).

Weitere Informationen dazu, wie Sie diese Änderungen dauerhaft vornehmen können, finden Sie in den PowerTOP- Dokumenten.
Es generiert die Konfigurationsskripte für Sie (so ziemlich wie von anderen Postern in diesem Thread beschrieben).

HINWEIS: Diese Skripte wirken sich nicht auf die USB-Pin-Stromversorgung aus (die immer eingeschaltet ist).
Diese senden nur das Treiberprotokoll, um ein Gerät zu aktivieren und zu deaktivieren.

Wenn Sie die Pin-Leistung steuern möchten, können Sie entweder einen unterstützten Smart-USB-Hub oder besser noch einen Mikrocontroller verwenden .

Dominic Cerisano
quelle
2
Genial! : DI denke, dies ist der benutzerfreundlichste Weg, dies zu tun (obwohl es auf niedriger Ebene die gleichen Operationen ausführt wie in den anderen Antworten beschrieben.) Vielen Dank, und möge Ihre Antwort die Spitze erreichen;)
Matyas
1
Danke für deine Antwort. Wo muss ich anfangen zu graben, um die voreingestellte inaktive Zeitersparnis zu ändern?
Mikezter
Wie bereits in früheren Postern erwähnt, finden Sie hier die Kernel-Dokumente: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano
10

Sie können mein Tool uhubctl verwenden , um die USB-Leistung pro Port für kompatible USB-Hubs zu steuern.

mvp
quelle
feines Tool auf OSX, findet aber keinen "unterstützten Smart Hub" auf Debian für mich.
Jitter
1
Unter Linux müssen Sie es entweder als root (unter sudo) ausführen oder udev-Geräteberechtigungen konfigurieren. Es ist auch möglich, dass auf Ihrem Linux-Host keine kompatiblen Hubs angeschlossen sind.
MVP
Es ist übrigens ein "Beagle Bone Green".
Jitter
7

Ich wollte das tun und konnte es mit meiner USB-Hardware nicht. Ich habe hier eine hackige Methode geschrieben:

http://pintant.cat/2012/05/12/power-off-usb-device/ .

Kurz gesagt: Ich habe ein USB-Relais verwendet, um den V CC eines anderen USB-Kabels zu öffnen / schließen ...

Carles
quelle
5
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

funktioniert für Ubuntu

user3527264
quelle
1
Ihre ist die einzige Lösung, die in meinem Fall funktioniert hat. Ich benutze einen Acer Make Laptop 12.04LTS Ubuntu.
RicoRicochet
1
Schaltet das Gerät nicht aus, sondern entfernt es nur aus der Geräteliste. Wie kann ich den USB-Anschluss ausschalten?
Rustyx
1
Dies ist auch die einzige Lösung, die für mich funktioniert hat, um ein Wacom Intuos5 touch M-Tablet auszuschalten, ohne es vom
Stromnetz zu trennen
2

USB 5V ist immer eingeschaltet (auch wenn der Computer ausgeschaltet ist, auf einigen Computern und an einigen Anschlüssen). Sie müssen wahrscheinlich ein Arduino mit einem Schalter programmieren und es über die serielle Bibliothek von USB an den Stecker anschließen Computer.

Mit anderen Worten, eine Kombination aus diesem Switch-Tutorial und diesem Tutorial zur Kommunikation über Serial Libary mit Arduino über USB.

NoBugs
quelle
2

Der Grund, warum Leute solche Fragen stellen, liegt in der gefürchteten "in der Tat" EVIL " - USB Auto-Suspend " -Funktion ".

Durch die automatische Unterbrechung wird die Stromversorgung eines "inaktiven" USB-Geräts abgeschaltet. Wenn der Treiber des Geräts diese Funktion nicht korrekt unterstützt, kann das Gerät nicht mehr kontaktiert werden. Das Ein- und Ausschalten eines USB-Anschlusses ist also ein Symptom des Problems und nicht das eigentliche Problem.

Ich zeige dir, wie man GLOBAL geht automatische Suspendieren deaktivieren, ohne dass die USB-Anschlüsse manuell und ausgeschaltet werden müssen:

Kurze Antwort:

Sie müssen " autosuspend_delay_ms " NICHT einzeln bearbeiten : USB-Autosuspend kann global und dauerhaft mit den folgenden Befehlen deaktiviert werden:

sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&usbcore.autosuspend=-1 /' /etc/default/grub

update-grub

systemctl reboot

Ein Ubuntu 18.04 Ende der "Langen Antwort" folgt ein Screenshot von , der zeigt, wie meine Ergebnisse erzielt wurden.

Lange Antwort:

Es ist wahr, dass in der USB Power Management Kernel-Dokumentation angegeben ist, dass Autosuspend veraltet ist und stattdessen " autosuspend_delay_ms " zum Deaktivieren von USB-Autosuspend verwendet wird:

"In 2.6.38 the "autosuspend" file will be deprecated
and replaced by the "autosuspend_delay_ms" file."

JEDOCH zeigt meine Tests , die Einstellung usbcore.autosuspend=-1in / etc / default / grub wie unten kann eingesetzt werden GLOBAL für USB Autosuspend Toggle Funktionalitäts- Sie NICHT zu bearbeiten einzelne "müssen autosuspend_delay_ms “ -Dateien.

Das gleiche Dokument, das oben verlinkt ist, besagt, dass ein Wert von "0" AKTIVIERT und ein negativer Wert deaktiviert ist :

power/autosuspend_delay_ms

    <snip> 0 means to autosuspend
    as soon as the device becomes idle, and negative
    values mean never to autosuspend.  You can write a
    number to the file to change the autosuspend
    idle-delay time.

Beachten Sie im kommentierten Ubuntu 18.04- Screenshot unten, der zeigt, wie meine Ergebnisse erzielt wurden (und reproduzierbar sind), dass der Standardwert in autosuspend_delay_ms "0" ( aktiviert ) ist .

Beachten Sie dann, dass diese Werte nach der Einstellung NURusbcore.autosuspend=-1 in Grub nach dem Neustart jetzt negativ ( deaktiviert ) sind. Dies erspart mir die Bearbeitung einzelner Werte und kann jetzt das automatische Deaktivieren der USB-Autosuspendierung per Skript deaktivieren.

screengrab: Autosuspend-Werte Vor und nach der globalen Bearbeitung

Ich hoffe, dies macht das Deaktivieren der USB-Autosuspendierung ein wenig einfacher und skriptfähiger.

F1Linux
quelle
1

Ich hatte ein Problem beim Anschließen meines Android-Telefons. Ich konnte mein Telefon nicht aufladen, da der Netzschalter ein- und ausgeschaltet wurde. Mit PowerTop konnte ich diese Einstellung finden und das Problem beheben (der automatische Wert verursachte ein Problem):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
Wunderland
quelle