Jak działają pliki systemd-tmp?


15

Próbuję zmienić wartość /sys/bus/usb/devices/4-3/power/wakeupprzy każdym rozruchu (4-3 według mojego lsusb, to identyfikator klawiatury).

Wartość domyślna to:

# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled

Klasyczna edycja „online” działa zgodnie z oczekiwaniami:

# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled

Używam dystrybucji systemowej, więc chciałbym użyć metody systemd do edycji „plików tymczasowych”

Utworzyłem następujący plik:

# cat /etc/tmpfiles.d/disable-usb-wakeup.conf 
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled

ale po każdym uruchomieniu nadal mam domyślną wartość w tym pliku (tzn. włączone)

czy robię coś źle?

EDYTOWAĆ:

Oto kolejny test:

# cat /etc/tmpfiles.d/scheduler.conf 
w /sys/block/sda/queue/scheduler - - - - deadline

a ten działa dobrze! Po uruchomieniu otrzymuję:

# cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 

(domyślnie był to program planujący cfq)

Dlaczego więc ten działa, a drugi nie?

  • Ponieważ /sys/bus/usb/devices/4-3/power/wakeupjest dowiązaniem symbolicznym do /sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/?
  • Ponieważ /sys/bus/usb/devices/4-3/power/wakeupzawiera tylko jedno słowo? (tj. bez spacji)

1
Świetne pytanie, ale nikt nie odpowiada. Niezależnie od tego, czy jest to słuszne , na pytania należy odpowiedzieć w następujący sposób: „gdybym to zrobił, jak by to zrobił ?”. Tak naprawdę potrzebowałem odpowiedzi na to pytanie i znalazłem to. pytanie?
Jonathan Komar

Odpowiedzi:


5

Nie wierzę, że tmpfiles.djest to właściwy sposób, aby tu dotrzeć. Naprawdę powinieneś przestrzegać udevzasad. Popatrz:

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==""
...

I idzie dalej, idąc w górę drzewa urządzeń nadrzędnych. Ale weź pod uwagę, że korzystając tylko z powyższych informacji, możesz:

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

I wierzę, że tak jest w przypadku większości twojego skryptu. Myślę, że będziesz chciał umieścić powyższe po regule 60. I naprawdę powinieneś to zrobić do końca - tylko sleeptrochę w twoim skrypcie jest wystarczającym powodem - implikuje to warunek wyścigu. udevto ten, który dodaje i ustawia te parametry - to ten, który się zapełnia sysfs. Po prostu poproś o wykonanie pracy, którą już wykonuje.

A na klawiaturze zdecydowanie powinieneś zrobić to samo - i podświetlenie. Po prostu uzyskaj potrzebne informacje na temat tych urządzeń udevadm, napisz kilka reguł i udevadm testje.


Na wiki.archlinux.org/index.php/… jest podobny przykład ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power". Czy mógłbyś wyjaśnić, dlaczego twoja reguła UDEV nie zawiera instrukcji ACTION i nie jest oddzielona przecinkami?
Pro Backup

@ProBackup - prawdopodobnie przyczyną jest moja. Nie sądzę jednak, żeby ACTIONkawałek był potrzebny.
mikeserv

Aby przetestować na przykład link_power_management_policy:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
Pro Backup

To jest rzeczywiście właściwa droga. Ludzie powinni naprawdę używać reguł udev w przypadkach, gdy wymagana jest synchronizacja ze zdarzeniami dodawania / usuwania urządzenia.
intelfx

2

[Mój oryginalny pomysł, że może to być spowodowane tym, że systemd-tmpfiles używa strumieniowego wejścia / wyjścia i nie było przeznaczone do użycia z proc lub sys, jest błędny . Moja druga hipoteza, dotycząca znaczenia nowej linii, również była błędna ...]

Właśnie spojrzałem /usr/lib/systemd/system/systemd-tmpfiles-setup.servicei jest tam kilka bitów, które mogą być interesujące:

[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

„Wants”, „After” i „Before” podają informacje o tym, kiedy to nastąpi; Myślę, urządzenie jest zarejestrowane przez ten punkt, ale tam może być coś późniejsze że resetuje wartość sysfs.

Najbardziej pomocnym bitem jest linia ExecStart, ponieważ jest to rzeczywiste polecenie, które odpowiada za tę usługę. Jest to faktycznie wspomniane w man systemd-tmpfiles:

Na przykład podczas rozruchu wykonywany jest następujący wiersz poleceń, aby upewnić się, że wszystkie katalogi tymczasowe i ulotne zostały usunięte i utworzone zgodnie z plikiem konfiguracyjnym:

systemd-tmpfiles --remove --create

Aby to przetestować, ustaw wartość sysfs na „enabled”, a następnie spróbuj uruchomić, systemd-tmpfiles --createktóra przetworzy twoją dyrektywę „w” w /etc/tmpfiles.d. Jeśli to zadziała (powinno!), To wiesz, że metoda systemd-tmpfile jest w porządku, po prostu musisz to zrobić później podczas rozruchu, być może z:

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

Co oznacza pisanie własnego pliku usługi; jeśli z jakiegoś powodu to nie działa, zawsze możesz napisać plik usługi dla skryptu, aby to zrobić echo.


Nie sądzę, że systemd nie może pisać na wirtualnych systemach plików. Używanie plików tmp /proc/acpi/wakeupdziała dobrze, na przykład ( wiki.archlinux.org/index.php/Systemd#Temporary_files )
przykład

@ital: Prawdopodobnie się myliłem, ale jeśli nadal jesteś sfrustrowany, wypróbuj moją drugą hipotezę powyżej.
goldilocks

Używanie echo -n disabled > /sys/...działa, więc prawdopodobnie obecność nowej linii nie ma znaczenia w tym przypadku. Ale tmpfiles wciąż nie działa, próbowałem obu disabled\ni"disabled\n"
eang

Zredagowałem pierwszy post z innym testem i hipotezą.
eang

@ital Sheesh. Okej, całkiem pewne, że moje trzecie przypuszczenie jest szczęśliwe, więc zredagowałem to ponownie powyżej, lol. Jeśli potem potrzebujesz podstaw pisania i rejestrowania usługi systemowej, zadaj nowe pytanie i być może odwołaj się do tego; Mogę to wyjaśnić bez całego tego bałaganu, uzyskamy pewien wkład od innych, a pytanie może oznaczać potomność (nie widzę tu jeszcze żadnych, które rozwiązałyby to bardzo dobrze).
goldilocks

0

Niedawno dowiedziałem się, w jaki sposób /etc/tmpfiles.d jest przetwarzany przed zapełnieniem / sys, więc musisz utworzyć odpowiednie reguły udev, aby były one dostępne za każdym razem, gdy pojawią się urządzenia lub ... pójdą na marne (ale jeśli zapytaj mnie, bardziej elastyczny) i stwórz usługę, która uruchamia skrypt z poleceniami do zapisu w / sys.

Spójrz tutaj na przykład, jak utworzyć taki skrypt, https://bbs.archlinux.org/viewtopic.php?id=148170, który możesz wypełnić:

#### #!/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

...

Czy możesz zamieścić link potwierdzający twoje zdanie na temat zamówienia tmpfiles i / sys / populacji? Oto kolejny wątek Arch, w którym sugerowano pliki tmp.
mlt

0

Może to być nieco przesada, ale w moim przypadku obie metody wymienione w innych odpowiedziach zawiodły. Wprowadza tmpfiles.d zmiany przed /sys/zapełnieniem wpisów, a udevmetoda nie znalazła wpisu (które było wirtualnym urządzeniem sieciowym br0). Jako taki utworzyłem nowy plik usługi. Po prostu utwórz nowy plik /etc/systemd/system/disable-usb-wakeup.servicei umieść w nim następujące elementy:

[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

Teraz, aby upewnić się, że ta jednostka jest uruchamiana przy każdym uruchomieniu, po prostu problem:

# systemctl enable disable-usb-wakeup.service

I powinieneś być dobry.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.