systemd: problema di autorizzazione con mkdir & ExecStartPre


37

Ho un problema con questo file di servizio systemd (abbreviato):

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
ExecStartPre=/bin/mkdir -p /var/run/FOOd/
ExecStartPre=/bin/chown -R FOOd:FOO /var/run/FOOd/
ExecStart=/usr/local/bin/FOOd -P /var/run/FOOd/FOOd.pid
PIDFile=/var/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

Lascia che FOOd sia il nome utente e FOO il nome del gruppo, che esiste già per il mio demone /usr/local/bin/FOOd.

Devo creare la directory /var/run/FOOd/prima di avviare il processo daemon /usr/local/bin/FOOdtramite # systemctl start FOOd.service. Questo non riesce, perché mkdir non può creare la directory a causa delle autorizzazioni:

...
Jun 03 16:18:49 PC0515546 mkdir[2469]: /bin/mkdir: cannot create directory /var/run/FOOd/: permission denied
Jun 03 16:18:49 PC0515546 systemd[1]: FOOd.service: control  process exited, code=exited status=1
...

Perché mkdir fallisce in ExecStartPre e come posso ripararlo? (E no, non posso usare sudo per mkdir ...)


FYI: Sto usando Debian 8
Matt

Potete per favore tradurre il messaggio di errore in inglese?
Thushi,

1
... 03 giu 16:18:49 PC0515546 mkdir [2469]: / bin / mkdir: la directory / var / run / FOOd / non può essere creata: nessuna autorizzazione 03 giu 16:18:49 PC0515546 systemd [1] : FOOd.service: processo di controllo chiuso, codice = stato chiuso = 1 ...
Matt

Risposte:


56

Devi aggiungere

PermissionsStartOnly=true

a [Service]. Il tuo utente non FOOdè ovviamente autorizzato a creare una directory in /var/run. Per citare la pagina man:

Accetta un argomento booleano. Se vero, le opzioni di esecuzione relative alle autorizzazioni, come configurate con Utente = e opzioni simili (vedere systemd.exec (5) per ulteriori informazioni), vengono applicate solo al processo avviato con ExecStart = e non ai vari altri ExecStartPre = , Comandi ExecStartPost =, ExecReload =, ExecStop = ed ExecStopPost =. Se false, l'impostazione viene applicata a tutti i comandi configurati allo stesso modo. Il valore predefinito è false.


1
Meraviglioso, esattamente quello che stavo cercando.
robert,

2
Questa opzione rende i comandi in ExecReload=esecuzione nel privilegio di root. Questo potrebbe non essere quello che vuoi.
Rockallite,

@Rockallite è quello che dice letteralmente la documentazione che ho citato, sì.
embik

2
PermissionsStartOnlyera deprecato. Riferimento: github.com/NixOS/nixpkgs/issues/53852 Come farlo adesso?
adrelanos,

2
@adrelanos Ora, aggiungi +subito dopo ExecStartPre=. Ad esempioExecStartPre=+/bin/mkdir test
Jamie Scott,

28

Questa non è una risposta che spiega o risolve il problema dei permessi, ma penso che dovresti semplicemente usare l'opzione RuntimeDirectory di systemds. Citando la pagina man :

RuntimeDirectory=, RuntimeDirectoryMode=
       Takes a list of directory names. If set, one or more directories by
       the specified names will be created below /run (for system
       services) or below $XDG_RUNTIME_DIR (for user services) when the
       unit is started, and removed when the unit is stopped. The
       directories will have the access mode specified in
       RuntimeDirectoryMode=, and will be owned by the user and group
       specified in User= and Group=. Use this to manage one or more
       runtime directories of the unit and bind their lifetime to the
       daemon runtime. The specified directory names must be relative, and
       may not include a "/", i.e. must refer to simple directories to
       create or remove. This is particularly useful for unprivileged
       daemons that cannot create runtime directories in /run due to lack
       of privileges, and to make sure the runtime directory is cleaned up
       automatically after use. For runtime directories that require more
       complex or different configuration or lifetime guarantees, please
       consider using tmpfiles.d(5).

Quindi tutto ciò che dovresti fare è cambiare il tuo file di servizio in:

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
RuntimeDirectory=FOOd
RuntimeDirectoryMode=$some-mode
ExecStart=/usr/local/bin/FOOd -P /run/FOOd/FOOd.pid
PIDFile=/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

Grazie grazie. Purtroppo manca dal pacchetto Ubuntu OpenVPN !!
BaseZen

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.