Estou tentando alterar o valor de /sys/bus/usb/devices/4-3/power/wakeup
cada inicialização (4-3 de acordo com o meu lsusb
, é o ID do teclado).
O valor padrão é:
# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled
A edição "online" clássica funciona como esperado:
# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled
Estou usando uma distribuição do systemd, então eu gostaria de usar o systemd-way para editar "arquivos temporários"
Eu criei o seguinte arquivo:
# cat /etc/tmpfiles.d/disable-usb-wakeup.conf
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled
mas após cada inicialização ainda tenho o valor padrão neste arquivo (ou seja, ativado)
Estou fazendo algo errado?
EDITAR:
Aqui está outro teste:
# cat /etc/tmpfiles.d/scheduler.conf
w /sys/block/sda/queue/scheduler - - - - deadline
e este funciona bem! Após a inicialização, recebo:
# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
(o padrão era o planejador cfq)
Então, por que esse funciona e o outro não?
- Porque
/sys/bus/usb/devices/4-3/power/wakeup
é um link simbólico para/sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/
? - Porque
/sys/bus/usb/devices/4-3/power/wakeup
contém apenas uma palavra? (ou seja, sem espaços)
arch-linux
systemd
sysfs
eang
fonte
fonte
Respostas:
Eu não acredito que
tmpfiles.d
seja o caminho certo a seguir aqui. Você realmente deve fazer asudev
regras. Veja:E continua, subindo na árvore do dispositivo pai. Mas considere que, usando apenas as informações acima, você pode:
E acredito que isso seja feito pela maioria do seu script. Você vai querer colocar o que precede após a regra 60, eu acho. E realmente, você deve fazer isso pelo resto - apenas a parte
sleep
do seu script é motivo suficiente - implica uma condição de corrida.udev
é quem adiciona e define esses parâmetros - é o que preenchesysfs
. Apenas peça para fazer o trabalho que já está fazendo.E para o teclado, você definitivamente deve fazer o mesmo - e a luz de fundo. Basta obter as informações necessárias sobre esses dispositivos
udevadm
, escrever algumas regras eudevadm test
eles.fonte
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"
. Você poderia explicar por que sua regra UDEV aqui não inclui uma instrução ACTION e não é separada por vírgula?ACTION
seja necessária.udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
[Minha ideia original de que isso poderia ocorrer porque systemd-tmpfiles usa E / S de fluxo e não foi projetada para ser usada com proc ou sys está errada . Minha segunda hipótese, sobre o significado de uma nova linha, também estava errada ...]
Acabei de olhar
/usr/lib/systemd/system/systemd-tmpfiles-setup.service
e há alguns bits que podem ser interessantes:O 'Quer', 'Depois' e 'Antes' fornecem algumas informações sobre quando isso acontece; Eu acho que seu dispositivo está registrado por este ponto, mas pode haver algo subseqüente que redefina o valor do sysfs.
A parte mais útil é a linha ExecStart, porque esse é o comando real responsável por esse serviço. Isso é realmente mencionado em
man systemd-tmpfiles
:Portanto, para testar isso, defina o valor sysfs como "enabled" e tente executar o
systemd-tmpfiles --create
que processará sua diretiva 'w' em /etc/tmpfiles.d. Se isso funcionar (deveria!), Você saberá que o método systemd-tmpfile está correto, basta fazê-lo posteriormente no processo de inicialização, talvez com:O que significa escrever seu próprio arquivo de serviço; se, por algum motivo, não funcionar, você sempre poderá escrever um arquivo de serviço para um script
echo
.fonte
/proc/acpi/wakeup
funciona bem, por exemplo ( wiki.archlinux.org/index.php/Systemd#Temporary_files )echo -n disabled > /sys/...
obras, provavelmente a presença da nova linha não se importa nesse caso. Mas tmpfiles ainda não está funcionando, eu tentei os doisdisabled\n
e"disabled\n"
Eu aprendi recentemente da maneira mais difícil que o /etc/tmpfiles.d é processado antes que o / sys seja preenchido, então você precisa criar as regras udev adequadas para que elas sejam ativadas sempre que os dispositivos aparecerem ou ... sigam o caminho sujo (mas se você pergunte-me, mais flexível) e crie um serviço que execute um script com os comandos para gravar em / sys.
Veja aqui um exemplo de como criar esse script, https://bbs.archlinux.org/viewtopic.php?id=148170 , que você pode preencher com algo como:
fonte
Isso pode ser um pouco exagerado, mas no meu caso os dois métodos mencionados em outras respostas estavam falhando. Ele
tmpfiles.d
faz as alterações antes que as/sys/
entradas sejam preenchidas e oudev
método não encontrou a entrada (que era um dispositivo de rede virtualbr0
). Como tal, criei um novo arquivo de serviço. Basta criar um novo arquivo/etc/systemd/system/disable-usb-wakeup.service
e colocar o seguinte dentro:Agora, para garantir que esta unidade seja iniciada em cada problema de inicialização:
E você deve estar pronto para ir.
fonte