Wie funktioniert systemd-tmpfiles?


15

Ich versuche, den Wert von /sys/bus/usb/devices/4-3/power/wakeupbei 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/wakeupist ein Symlink zu /sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/?
  • Weil es /sys/bus/usb/devices/4-3/power/wakeupnur ein Wort enthält? (dh keine Leerzeichen)

1
Gute Frage, aber niemand antwortet darauf. Unabhängig davon , ob es die richtige Sache zu tun, sollte Fragen mit dem Ansatz beantwortet werden, ‚wenn ich war , dies zu tun, wie würde ich?“ Ich musste tatsächlich die Antwort auf diesen und fand diese. Jede Sorgfalt Antwort auf dem tatsächlichen Frage?
Jonathan Komar

Antworten:


5

Ich glaube nicht, dass dies tmpfiles.dder richtige Weg ist. Du solltest wirklich die udevRegeln befolgen. Aussehen:

udevadm info -a -p /sys/class/scsi_host/host*

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:11.0/ata1/host0/scsi_host/host0':
    KERNEL=="host0"
    SUBSYSTEM=="scsi_host"
    DRIVER==""
    ATTR{unchecked_isa_dma}=="0"
    ATTR{state}=="running"
    ATTR{cmd_per_lun}=="1"
...
    ATTR{ahci_host_version}=="10200"
    ATTR{prot_guard_type}=="0"
    ATTR{eh_deadline}=="off"
    ATTR{link_power_management_policy}=="max_performance"
    ATTR{host_busy}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:11.0/ata1/host0':
    KERNELS=="host0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""
...

Und es geht weiter und geht den übergeordneten Gerätebaum entlang. Beachten Sie jedoch, dass Sie mit den obigen Informationen Folgendes tun können:

KERNEL=="host[0-5]", SUBSYSTEM=="scsi_host", ATTR{link_power_management_policy}="min_power"

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 sleepbisschen in Ihrem Skript ist Grund genug - es impliziert eine Rennbedingung. udevist derjenige, der diese Parameter hinzufügt und einstellt - es ist derjenige, der auffüllt sysfs. 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 und udevadm testsie.


Unter wiki.archlinux.org/index.php/… gibt es ein ähnliches Beispiel 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?
Pro Backup

@ProBackup - wahrscheinlich weil meins kaputt ist. Ich denke aber nicht, dass das Teil ACTIONnotwendig ist.
mikeserv

So testen Sie die link_power_management_policy:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
Pro Backup

Dies ist in der Tat der richtige Weg. Leute sollten wirklich udev-Regeln anwenden, wenn eine Synchronisation auf Geräte-Hinzufügungs- / Entfernungsereignisse erforderlich ist.
intelfx

2

[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.serviceund da sind ein paar Teile, die von Interesse sein könnten:

[Unit]
Description=Recreate Volatile Files and Directories
Documentation=man:tmpfiles.d(5)
DefaultDependencies=no
Wants=local-fs.target
After=systemd-readahead-collect.service systemd-readahead-replay.service local-fs.target
Before=sysinit.target shutdown.target

[...]

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemd-tmpfiles --create --remove

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:

Während des Startvorgangs wird beispielsweise die folgende Befehlszeile ausgeführt, um sicherzustellen, dass alle temporären und flüchtigen Verzeichnisse entfernt und gemäß der Konfigurationsdatei erstellt werden:

systemd-tmpfiles --remove --create

systemd-tmpfiles --createUm 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:

Requires=multi-user.target
After=multi-user.target

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.


Ich glaube nicht, dass systemd auf virtuellen Dateisystemen nicht schreiben kann. Die Verwendung von tmpfiles /proc/acpi/wakeupfunktioniert beispielsweise einwandfrei ( wiki.archlinux.org/index.php/Systemd#Temporary_files )
14.

@ital: Da habe ich mich wahrscheinlich geirrt, aber wenn du immer noch frustriert bist, versuche meine zweite Hypothese oben.
Goldlöckchen

Die Verwendung von 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 ausprobiert disabled\nund"disabled\n"
am

Ich habe den ersten Beitrag mit einem anderen Test und einer Hypothese bearbeitet.
14.

@ital Sheesh. Okay, ich bin mir ziemlich sicher, dass meine dritte Vermutung die glückliche ist, also habe ich das oben wieder bearbeitet, lol. Wenn Sie danach die Grundlagen zum Schreiben und Registrieren eines systemd-Dienstes benötigen, stellen Sie eine neue Frage und verweisen Sie möglicherweise auf diese. Ich kann es ohne all diese Unordnung erklären, wir werden einige Beiträge von anderen bekommen, und die Frage kann für die Nachwelt stehen (ich sehe hier noch keine, die dies sehr gut ansprechen).
Goldlöckchen

0

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:

#### #!/bin/sh

sleep 2

#### # Enforce energy tweaks provided by PowerTop
echo min_power > /sys/class/scsi_host/host0/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host1/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host2/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host3/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host4/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host5/link_power_management_policy;
echo 1 > /sys/module/snd_hda_intel/parameters/power_save;
echo auto > /sys/bus/pci/devices/0000:7f:00.1/power/control;
echo auto > /sys/bus/pci/devices/0000:01:00.1/power/control;

...

echo 4880 > /sys/class/backlight/intel_backlight/brightness

...

Könnten Sie einen Link posten, der Ihre Aussage zu tmpfiles & / sys / population order bestätigt? Hier ist ein weiterer Arch-Thread, in dem tmpfiles vorgeschlagen wurden.
Mlt

0

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 die udevMethode den Eintrag nicht gefunden hat (bei dem es sich um ein virtuelles Netzwerkgerät handelte br0). Aus diesem Grund habe ich eine neue Servicedatei erstellt. Erstellen Sie einfach eine neue Datei /etc/systemd/system/disable-usb-wakeup.serviceund fügen Sie Folgendes ein:

[Unit]
Description=Set multicast snoop to off
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c "echo disabled >> /sys/bus/usb/devices/4-3/power/wakeup"
RemainAfterExit=true
ExecStop=/usr/bin/bash -c "echo enabled >> /sys/bus/usb/devices/4-3/power/wakeup"
StandardOutput=journal

[Install]
WantedBy=multi-user.target

Um sicherzugehen, dass dieses Gerät bei jedem Bootvorgang gestartet wird, gehen Sie wie folgt vor:

# systemctl enable disable-usb-wakeup.service

Und Sie sollten gut zu gehen sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.