Não consigo descobrir porque meu serviço systemd falha ao criar um / var / run / redis

4

Isso está no ubuntu-16.04

Eu tentei escrever um serviço de redis personalizado em /etc/system/systemd/redis-custom.service

O serviço falha (embora o redis seja iniciado e reiniciado) porque / var / run / redis não existe e não pode ler o pidfile

O serviço de redis padrão cria / var / run usando tmpfiles.d

cat /usr/lib/tmpfiles.d/redis-server.conf
d /run/redis 2775 redis redis -

Eu queria consolidar isso apenas no arquivo de serviço, então olhei para a implementação do opendkim em /lib/system/systemd/opendkim.service que usava uma estratégia diferente de colocar o mkdir no arquivo de serviço antes de liberar privilégios:

PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/run/opendkim
ExecStartPre=-/bin/chown opendkim.opendkim /var/run/opendkim

Ótima ideia. Então eu tentei usar isso para redis:

PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/run/redis
ExecStartPre=-/bin/chown redis.redis /var/run/redis

Isso falha toda vez no mkdir por falta de privilégios. Eu configurei um servidor vazio para testar isso e estou apenas executando o redis / opendkim nele para que eu possa tentar descobrir quais arquivos o opendkim poderia estar fazendo de forma diferente. Eu não consigo descobrir isso.

Eu posso criar o diretório para redis especificando RuntimeDirectory=/var/run/redis - que é uma solução melhor. No entanto, quero entender por que a implementação do opendkim está funcionando. Parece que estou perdendo alguma coisa.

    
por Jonathan Vanasco 29.04.2016 / 19:53

1 resposta

1

Eu tenho lutado com o mesmo problema por cerca de uma hora ...

TL; DR: Você deve comentar o

ReadOnlyDirectories=-/

em

/lib/systemd/system/redis-server.service

e emissão como sudo systemctl daemon-reload

Explicação detalhada:

Estou executando o Redis 3.2.6 em um sistema operacional Raspian Strech 9.4 e montei /var/log as tmpfs para diminuir a quantidade de gravações no cartão microSD do meu Raspberry Pi 3 B +.

ExecStartPre=-/bin/mkdir /var/log/redis
ExecStartPre=-/bin/chmod 750 /var/log/redis
ExecStartPre=-/bin/chown redis:redis /var/log/redis

Eu também adicionei alguns comandos de pré-inicialização no arquivo de serviço do Redis como mostrado acima, mas ele ainda não conseguiu criar o diretório, já que estava reclamando do estranho Read-only file system issue ao inicializar:

May 08 19:17:48 pisky systemd[1]: Starting Advanced key-value store...
-- Subject: Unit redis-server.service has begun start-up
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit redis-server.service has begun starting up.
May 08 19:17:48 pisky mkdir[20564]: /bin/mkdir: cannot create directory ‘/var/log/redis’: Read-only file system
May 08 19:17:48 pisky chmod[20567]: /bin/chmod: cannot access '/var/log/redis': No such file or directory
May 08 19:17:48 pisky chown[20570]: /bin/chown: cannot access '/var/log/redis': No such file or directory
May 08 19:17:49 pisky run-parts[20572]: run-parts: executing /etc/redis/redis-server.pre-up.d/00_example
May 08 19:17:49 pisky redis-server[20580]: *** FATAL CONFIG FILE ERROR ***
May 08 19:17:49 pisky redis-server[20580]: Reading the configuration file, at line 163
May 08 19:17:49 pisky redis-server[20580]: >>> 'logfile /var/log/redis/redis-server.log'
May 08 19:17:49 pisky redis-server[20580]: Can't open the log file: No such file or directory
May 08 19:17:49 pisky wpa_supplicant[457]: wlan0: Failed to initiate sched scan
May 08 19:17:49 pisky systemd[1]: redis-server.service: Control process exited, code=exited status=1
May 08 19:17:49 pisky systemd[1]: Failed to start Advanced key-value store.

Parece que o uso de seu arquivo de serviço tem alguns parâmetros contraditórios, a saber:

# had to comment the below out, apparently this RO is exclusive
#ReadOnlyDirectories=-/
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/var/run/redis

A diretiva ReadOnlyDirectories define / como somente leitura, mas como /var/log/ está montado em / , ela também é configurada como somente leitura ... Esse problema foi descrito no Github , e eu tentei as respectivas soluções propostas, mas nenhuma delas funcionou, além de comentando a linha acima ...

    
por AnythingIsFine 08.05.2018 / 18:46