aciona as regras do udev a partir do systemd

7

Eu tenho um desses hdds, que têm um gerenciamento de energia muito agressivo. Para evitar que os ciclos de carga subam para números críticos, escrevi uma regra do udev:

SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}=="TOSHIBA MK2555GS", RUN+="/usr/bin/hdparm -B 200 /dev/%k"

O problema é que essa regra não é acionada depois que eu acordo meu notebook do modo de suspensão. Portanto, eu tenho o seguinte serviço systemd:

[Unit]
Description=root resume actions
After=suspend.target

[Service]
Type=simple
ExecStart=/bin/hdparm -B 200 /dev/sda

[Install]
WantedBy=suspend.target

Eu prefiro que o comando ExecStart seja algo como /bin/udevadm trigger --subsystem-match="block" . Portanto, não preciso declarar o nome do kernel explicitamente. Se eu fizer esse comando manualmente, o gerenciamento de energia será ajustado corretamente, mas não funcionará no serviço systemd. Existe uma maneira de fazer isso? btw estou usando o arch-linux

    
por MoFu 06.11.2013 / 19:13

2 respostas

2

Você pode colocar um script em /usr/lib/systemd/systemd-sleep , que executa o hdparm. E você pode usar o hdparm com /dev/disk/by-uuid/ em vez de /dev/sda...

Ou tente usar /bin/sh -c "/bin/hdparm -B 200 /dev/disk/by-uuid/XY"

    
por 28.11.2013 / 20:25
1

Eu estava quase na mesma situação e gostaria de adicionar mais informações a essa pergunta devido à sua proeminência no Google por systemd udevadm trigger e como um resumo geral de como controlar os padrões absurdos nessas campanhas.

Uma vez que percebi que minha unidade Western Digital Blue tem um absurdo paternalista, contraprodutivo, anti-SMART, sem energia ativado por padrão, acompanhei quase o mesmo processo que o OP. Desativei o recurso de firmware, mas também precisei desativar o APM e o modo de espera usando hdparm ; sem todos os 3, o desenfreado ciclo de carga continuou a enlouquecer.

A primeira diferença é que, porque meus hdparm.rules foram configurados para invocar apenas no dispositivo add (boot), udevadm trigger não funcionaria para mim, a menos que eu dissesse a ele qual gatilho a ser aplicado, adicionando --action=add . Isso efetivamente simula a desconexão do HD no currículo - o que é exatamente o que eu preciso.

Mas acabei com uma confusão semelhante ao OP, incapaz de descobrir por que meu udevadm trigger para recarregar meu hdparm rule funcionou no terminal, mas não de um systemd service . Parece que eu tinha diferentes razões, que eram:

  1. Em nosso service , devemos especificar explicitamente o local do executável para ExecStart /bin/udevadm porque os arquivos de unidade não estão cientes de $path ;
  2. e talvez .... Eu o instalei em systemd/user , que pode ter sido executado como eu e, portanto, não obtive as permissões root necessárias para /sbin/hdparm .

(Eu corro o Debian 8, mas não acredito que nada disso seja específico da distribuição).

    
por 19.09.2015 / 02:37