O serviço Systemd não está funcionando durante a inicialização do sistema

5

Então eu escrevi um arquivo de serviço systemd para Manjaro Linux executar dois comandos shell para definir alguns parâmetros do kernel em tempo de execução para permitir ações personalizadas de economia de energia.

BTW: Esta foi uma dica de uma revista alemã de informática. Originalmente eu deveria colocar os comandos shell no arquivo /etc/rc.local , mas eu quero fazer isso com um serviço systemd. Porque rc.local é considerado obsoleto e quero aprender algo novo.

Abaixo, você vê meu arquivo de serviço salvo como /etc/systemd/system/power-savings.service . Como há duas diretivas ExecStart , escolhi Type=oneshot .

[Unit]
Description=Enable custom power saving actions provided by c't magazine
# Quelle(n):  c't 25/2016, S. 77
#             c't 26/2016, S. 12

[Service]
Type=oneshot
# SATA Link Power Management aktivieren
ExecStart=/usr/bin/sh -c 'for I in /sys/class/scsi_host/host?/link_power_management_policy; do echo min_power > $I; done'
# Energieverwaltung für den Audiocodec aktivieren
ExecStart=/usr/bin/sh -c 'echo 1 > /sys/module/snd_hda_intel/parameters/power_save'

[Install]
WantedBy=multi-user.target

Eu verifiquei o arquivo de serviço com:

$ sudo systemd-analyze verify /etc/systemd/system/power-savings.service

Então eu recarreguei o daemon com:

$ sudo systemctl daemon-reload

Eu habilitei com:

$ sudo systemctl enable power-savings.service

Em seguida, executei o serviço com:

$ sudo systemctl start power-savings.service

E funcionou! Os parâmetros do kernel foram definidos.

Mas depois de reiniciar o sistema, o serviço parece não ter nenhum efeito. Embora o status do serviço tenha dito sucesso ...

$ systemctl status power-savings.service

Process: 412 ExecStart=/usr/bin/bash -c echo 1 > /sys/module/snd_hda_intel/parameters/power_save (code=exited, status=0/SUCCESS)
Process: 404 ExecStart=/usr/bin/bash -c for I in /sys/class/scsi_host/host?/link_power_management_policy; do echo min_power > $I; done (code=exited, status=0/SUCCESS)
Main PID: 412 (code=exited, status=0/SUCCESS)

Mas o parâmetro do kernel não foi definido. Então, meu serviço funciona somente durante uma sessão do usuário. Infelizmente, não durante a inicialização do sistema, como pretendia funcionar.

Existe algo que eu possa ter perdido? Preciso de algumas dessas diretivas After ou Require ? Como posso depurar o que realmente acontece com as diretivas ExecStart ?

    
por MrksKwsnck 19.12.2017 / 15:25

1 resposta

1

Fazendo mais pesquisas sobre o meu problema, encontrei uma declaração interessante da comunidade Arch Linux. Em este post user calzon65 está tentando fazer algo parecido com o que eu faço.

A discussão me redirecionou para um artigo sobre tmpfiles.d , que poderia ser uma possível solução para escrever valores em arquivos em vez de usar pipes ou redirecionamentos. No entanto, este artigo tem uma interessante nota :

This method may not work to set options in /sys since the systemd-tmpfiles-setup service may run before the appropriate device modules is loaded.

O que nossos projetos têm em comum é que ambos tentamos gravar em /sys/... durante a inicialização do sistema. Este fato é provavelmente a resposta para a pergunta por que não está funcionando.

    
por 19.12.2017 / 18:01