Ich versuche, den Wert von /sys/bus/usb/devices/4-3/power/wakeup
bei jedem Start zu ändern (4-3 entsprechend meiner lsusb
, es ist die Tastatur-ID).
Der Standardwert ist:
# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled
Die klassische "Online" -Bearbeitung funktioniert wie erwartet:
# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled
Ich verwende eine systemd-Distribution, daher möchte ich die systemd-Methode verwenden, um "temporäre Dateien" zu bearbeiten.
Ich habe folgende Datei erstellt:
# cat /etc/tmpfiles.d/disable-usb-wakeup.conf
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled
aber nach jedem boot habe ich immer noch den standardwert in dieser datei (dh aktiviert)
Mache ich etwas falsch?
BEARBEITEN:
Hier noch ein Test:
# cat /etc/tmpfiles.d/scheduler.conf
w /sys/block/sda/queue/scheduler - - - - deadline
und dieser funktioniert gut! Nach dem Booten bekomme ich:
# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
(Die Standardeinstellung war der cfq-Scheduler.)
Warum funktioniert das eine und das andere nicht?
- Weil
/sys/bus/usb/devices/4-3/power/wakeup
ist ein Symlink zu/sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/
? - Weil es
/sys/bus/usb/devices/4-3/power/wakeup
nur ein Wort enthält? (dh keine Leerzeichen)
arch-linux
systemd
sysfs
eang
quelle
quelle
Antworten:
Ich glaube nicht, dass dies
tmpfiles.d
der richtige Weg ist. Du solltest wirklich dieudev
Regeln befolgen. Aussehen:Und es geht weiter und geht den übergeordneten Gerätebaum entlang. Beachten Sie jedoch, dass Sie mit den obigen Informationen Folgendes tun können:
Und ich glaube, dass dies für den Großteil Ihres Drehbuchs der Fall ist. Das obige solltest du nach Regel 60 setzen, denke ich. Und wirklich, Sie sollten dies für den Rest tun - nur das
sleep
bisschen in Ihrem Skript ist Grund genug - es impliziert eine Rennbedingung.udev
ist derjenige, der diese Parameter hinzufügt und einstellt - es ist derjenige, der auffülltsysfs
. Bitten Sie es einfach, die Arbeit zu erledigen, die es bereits erledigt.Und für Ihre Tastatur sollten Sie auf jeden Fall das Gleiche tun - und die Hintergrundbeleuchtung. Holen Sie sich einfach die Informationen, die Sie über diese Geräte benötigen
udevadm
, schreiben Sie einige Regeln undudevadm test
sie.quelle
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"
. Würden Sie bitte erklären, warum Ihre UDEV-Regel hier keine ACTION-Anweisung enthält und nicht durch Kommas getrennt ist?ACTION
notwendig ist.udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
[Meine ursprüngliche Idee, dass dies daran liegen könnte, dass systemd-tmpfiles Stream-E / A verwendet und nicht für die Verwendung mit proc oder sys vorgesehen ist, ist falsch . Auch meine 2. Hypothese über die Bedeutung eines Zeilenumbruchs war falsch ...]
Ich habe es mir gerade angesehen
/usr/lib/systemd/system/systemd-tmpfiles-setup.service
und da sind ein paar Teile, die von Interesse sein könnten:Die "Wants", "After" und "Before" geben Auskunft darüber, wann dies geschieht. Ich würde denken, dass Ihr Gerät zu diesem Zeitpunkt registriert ist, aber es könnte etwas nachträgliches geben , das den sysfs-Wert zurücksetzt.
Das hilfreichste Bit ist die ExecStart-Zeile, da dies der eigentliche Befehl ist, der für diesen Dienst verantwortlich ist. Dies wird tatsächlich erwähnt in
man systemd-tmpfiles
:systemd-tmpfiles --create
Um dies zu testen, setzen Sie den sysfs-Wert auf "enabled" und versuchen Sie dann auszuführen , wodurch Ihre "w" -Direktive in /etc/tmpfiles.d verarbeitet wird. Wenn das funktioniert (sollte es!), Dann wissen Sie, dass die systemd-tmpfile-Methode in Ordnung ist. Sie müssen es nur später im Boot-Prozess tun, vielleicht mit:Das heißt, Sie schreiben Ihre eigene Servicedatei. Wenn es aus irgendeinem Grund nicht funktioniert, können Sie immer eine Servicedatei schreiben, mit der ein Skript dies tun kann
echo
.quelle
/proc/acpi/wakeup
funktioniert beispielsweise einwandfrei ( wiki.archlinux.org/index.php/Systemd#Temporary_files )echo -n disabled > /sys/...
Works ist in diesem Fall wahrscheinlich für die Newline-Präsenz unerheblich. Aber tmpfiles funktioniert immer noch nicht, ich habe beide ausprobiertdisabled\n
und"disabled\n"
Ich habe kürzlich erfahren, wie schwer es ist, /etc/tmpfiles.d zu verarbeiten, bevor / sys ausgefüllt wird, sodass Sie die richtigen udev-Regeln erstellen müssen, damit sie aktiviert werden, wenn die Geräte auftauchen oder ... den schmutzigen Weg gehen (aber wenn Sie Fragen Sie mich (flexibler) und erstellen Sie einen Dienst, der ein Skript mit den Befehlen zum Schreiben in / sys ausführt.
Werfen Sie einen Blick hier für ein Beispiel, wie solche Skript zu erstellen, https://bbs.archlinux.org/viewtopic.php?id=148170 , die Sie mit etwas füllen kann wie:
quelle
Das mag ein bisschen übertrieben sein, aber in meinem Fall schlugen beide Methoden, die in anderen Antworten erwähnt wurden, fehl. Das
tmpfiles.d
nimmt die Änderungen vor, bevor die/sys/
Einträge ausgefüllt werden und dieudev
Methode den Eintrag nicht gefunden hat (bei dem es sich um ein virtuelles Netzwerkgerät handeltebr0
). Aus diesem Grund habe ich eine neue Servicedatei erstellt. Erstellen Sie einfach eine neue Datei/etc/systemd/system/disable-usb-wakeup.service
und fügen Sie Folgendes ein:Um sicherzugehen, dass dieses Gerät bei jedem Bootvorgang gestartet wird, gehen Sie wie folgt vor:
Und Sie sollten gut zu gehen sein.
quelle