Próbuję zmienić wartość /sys/bus/usb/devices/4-3/power/wakeup
przy 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/wakeup
jest dowiązaniem symbolicznym do/sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/
? - Ponieważ
/sys/bus/usb/devices/4-3/power/wakeup
zawiera tylko jedno słowo? (tj. bez spacji)
arch-linux
systemd
sysfs
eang
źródło
źródło
Odpowiedzi:
Nie wierzę, że
tmpfiles.d
jest to właściwy sposób, aby tu dotrzeć. Naprawdę powinieneś przestrzegaćudev
zasad. Popatrz: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:
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
sleep
trochę w twoim skrypcie jest wystarczającym powodem - implikuje to warunek wyścigu.udev
to ten, który dodaje i ustawia te parametry - to ten, który się zapełniasysfs
. 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ł iudevadm test
je.źródło
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?ACTION
kawałek był potrzebny.udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
[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.service
i jest tam kilka bitów, które mogą być interesujące:„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
:Aby to przetestować, ustaw wartość sysfs na „enabled”, a następnie spróbuj uruchomić,
systemd-tmpfiles --create
któ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: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
.źródło
/proc/acpi/wakeup
działa dobrze, na przykład ( wiki.archlinux.org/index.php/Systemd#Temporary_files )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 obudisabled\n
i"disabled\n"
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ć:
źródło
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, audev
metoda nie znalazła wpisu (które było wirtualnym urządzeniem sieciowymbr0
). Jako taki utworzyłem nowy plik usługi. Po prostu utwórz nowy plik/etc/systemd/system/disable-usb-wakeup.service
i umieść w nim następujące elementy:Teraz, aby upewnić się, że ta jednostka jest uruchamiana przy każdym uruchomieniu, po prostu problem:
I powinieneś być dobry.
źródło