Estoy tratando de cambiar el valor de /sys/bus/usb/devices/4-3/power/wakeup
en cada arranque (4-3 según mi lsusb
, es la identificación del teclado).
El valor predeterminado es:
# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled
La edición clásica "en línea" funciona como se esperaba:
# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled
Estoy usando una distribución systemd, así que me gustaría usar systemd-way para editar "archivos temporales"
He creado el siguiente archivo:
# cat /etc/tmpfiles.d/disable-usb-wakeup.conf
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled
pero después de cada arranque todavía tengo el valor predeterminado en este archivo (es decir, habilitado)
¿Estoy haciendo algo mal?
EDITAR:
Aquí otra prueba:
# cat /etc/tmpfiles.d/scheduler.conf
w /sys/block/sda/queue/scheduler - - - - deadline
y este funciona bien! Después de arrancar me sale:
# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
(el predeterminado era el planificador cfq)
Entonces, ¿por qué este funciona y el otro no?
- Porque
/sys/bus/usb/devices/4-3/power/wakeup
es un enlace simbólico a/sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/
? - Porque
/sys/bus/usb/devices/4-3/power/wakeup
contiene solo una palabra? (es decir, sin espacios)
arch-linux
systemd
sysfs
eang
fuente
fuente
Respuestas:
No creo que
tmpfiles.d
sea la forma correcta de ir aquí. Realmente deberías hacer lasudev
reglas. Mira:Y continúa, subiendo por el árbol del dispositivo principal. Pero considere que, utilizando solo la información anterior, puede hacer:
Y creo que eso lo hace para la mayoría de tu guión. Querrás poner lo anterior después de la regla 60, creo. Y realmente, deberías hacer esto por el resto, solo un
sleep
poco en tu script es razón suficiente, implica una condición de carrera.udev
es el que agrega y establece estos parámetros, es el que se completasysfs
. Solo pídale que haga el trabajo que ya está haciendo.Y para su teclado definitivamente debe hacer lo mismo, y la luz de fondo. Simplemente obtenga la información que necesita sobre estos dispositivos
udevadm
, escriba algunas reglas yudevadm test
ellas.fuente
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"
. ¿Podría explicar por qué su regla UDEV aquí no incluye una declaración ACTION y no está separada por comas?ACTION
embargo , no creo que sea necesario.udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
[Mi idea original de que esto podría deberse a que systemd-tmpfiles usa E / S de flujo y no estaba destinado a usarse con proc o sys es incorrecta . Mi segunda hipótesis, sobre la importancia de una nueva línea, también estaba equivocada ...]
Acabo de mirar
/usr/lib/systemd/system/systemd-tmpfiles-setup.service
y hay un par de bits allí que pueden ser de interés:Los 'Deseos', 'Después' y 'Antes' brindan información sobre cuándo sucede esto; Creo que su dispositivo está registrado en este punto, pero podría haber algo posterior que restablezca el valor de sysfs.
El bit más útil es la línea ExecStart, porque ese es el comando real que da cuenta de este servicio. Esto se menciona realmente en
man systemd-tmpfiles
:Entonces, para probar esto, establezca el valor de sysfs en "habilitado" y luego intente ejecutar
systemd-tmpfiles --create
lo que procesará su directiva 'w' en /etc/tmpfiles.d. Si eso funciona (¡debería!), Entonces sabes que el método systemd-tmpfile está bien, solo tienes que hacerlo más adelante en el proceso de arranque, quizás con:Lo que significa escribir su propio archivo de servicio; si por alguna razón no funciona, siempre puede escribir un archivo de servicio para que un script lo haga
echo
.fuente
/proc/acpi/wakeup
trabajos funciona bien, por ejemplo ( wiki.archlinux.org/index.php/Systemd#Temporary_files )echo -n disabled > /sys/...
trabajos, por lo que probablemente la presencia de nueva línea no le importe en este caso. Pero tmpfiles todavía no funciona, he intentado ambosdisabled\n
y"disabled\n"
Aprendí recientemente de la manera difícil que /etc/tmpfiles.d se procesa antes de que / sys se complete, por lo que debe crear las reglas udev adecuadas para que estén habilitadas cada vez que aparezcan los dispositivos o ... siga el camino sucio (pero si pregúntame, uno más flexible) y crea un servicio que ejecute un script con los comandos para escribir en / sys.
Eche un vistazo aquí para ver un ejemplo sobre cómo crear dicho script, https://bbs.archlinux.org/viewtopic.php?id=148170 que puede llenar con algo como:
fuente
Esto puede ser un poco exagerado, pero en mi caso ambos métodos mencionados en otras respuestas estaban fallando. Luego
tmpfiles.d
realiza los cambios antes de/sys/
que se llenen las entradas y eludev
método no encontró la entrada (que era un dispositivo de red virtualbr0
). Como tal, creé un nuevo archivo de servicio. Simplemente cree un nuevo archivo/etc/systemd/system/disable-usb-wakeup.service
y coloque lo siguiente dentro:Ahora, para asegurarse de que esta unidad se inicie en cada arranque, solo emita:
Y deberías estar listo para irte.
fuente