Come sovrascrivere o configurare i servizi di sistema?

68

Molti script sysv init hanno utilizzato un file corrispondente in /etc/default per consentire all'amministratore di configurarlo. I lavori Upstart possono essere modificati utilizzando .override file. Come faccio a sovrascrivere o configurare le unità di sistema, ora che systemd è l'impostazione predefinita in Ubuntu?

    
posta muru 09.08.2015 - 05:31

1 risposta

117

systemd unità non devono rispettare i file in /etc/default . systemd è facilmente configurabile, ma richiede di conoscere la sintassi dei file di unità systemd.

Imballa i file unitari normalmente in /lib/systemd/system/ . Questi sono non da modificare. Invece, systemd ti consente di sovrascrivere questi file creando file appropriati in /etc/systemd/system/ .

Per un dato servizio foo , il pacchetto fornirebbe /lib/systemd/system/foo.service . Puoi controllare il suo stato usando systemctl status foo , o visualizzare i suoi registri usando journalctl -u foo . Per sovrascrivere qualcosa nella definizione di foo , fai:

sudo systemctl edit foo

Crea una directory in /etc/systemd/system chiamata dopo l'unità e un file override.conf in quella directory ( /etc/systemd/system/foo.service.d/override.conf ). Puoi aggiungere o sovrascrivere le impostazioni utilizzando questo file (o altri file .conf in /etc/systemd/system/foo.service.d/ ).

Ignora gli argomenti del comando

Ad esempio, prendi il servizio getty . Diciamo che voglio avere l'autologin TTY2 per il mio utente (questo non è consigliabile, ma solo un esempio). TTY2 è eseguito dal servizio [email protected] ( tty2 è un'istanza del modello /lib/systemd/system/[email protected] ). Per fare questo, devo modificare il servizio [email protected] .

$ systemctl cat [email protected]
# /lib/systemd/system/[email protected]
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service

# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes

# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by [email protected], not this
# unit.
ConditionPathExists=/dev/tty0

[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

[Install]
WantedBy=getty.target
DefaultInstance=tty1

In particolare, devo modificare la riga ExecStart , che attualmente è:

$ systemctl cat [email protected] | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM

Per sovrascrivere, fai:

sudo systemctl edit [email protected]

E aggiungi:

[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

Nota che:

  1. Ho dovuto eliminare esplicitamente ExecStart prima di impostarlo nuovamente, poiché si tratta di un'impostazione aggiuntiva, simile a After , Environment (nel suo complesso, non per variabile) e EnvironmentFile , e contraria a sovrascrivere le impostazioni come RestartSec o Type . ExecStart può avere più voci solo per Type=oneshot servizi.
  2. Ho dovuto usare l'intestazione di sezione corretta. Nel file originale, ExecStart si trova nella sezione [Service] , quindi il mio override deve mettere ExecStart anche nella sezione [Service] . Spesso, dare un'occhiata al file di servizio effettivo utilizzando systemctl cat ti dirà di cosa hai bisogno di sovrascrivere e in quale sezione si trova.

Di solito, se si modifica un file di unità systemd, perché abbia effetto, è necessario eseguire:

sudo systemctl daemon-reload

Tuttavia, systemctl edit lo fa automaticamente per te.

Ora:

$ systemctl cat [email protected] | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

$ systemctl show [email protected] | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }

E se lo faccio:

sudo systemctl restart [email protected]

e premi Ctrl Alt F2 , presto! Verrà effettuato l'accesso al mio account su tale TTY.

Come ho detto prima, [email protected] è un'istanza di un modello. Quindi, cosa succede se volevo scavalcare tutte le istanze di quel modello? Ciò può essere fatto modificando il modello stesso (rimuovendo l'identificatore di istanza - in questo caso tty2 ):

systemctl edit [email protected]

Sovrascrittura dell'ambiente

Un caso di utilizzo comune di file /etc/default sta impostando le variabili di ambiente. Di solito, /etc/default è uno script di shell, quindi puoi usare costrutti di linguaggio shell in esso. Con systemd , tuttavia, questo non è il caso. È possibile specificare le variabili di ambiente in due modi:

Tramite un file

Supponiamo di aver impostato le variabili di ambiente in un file:

$ cat /path/to/some/file
FOO=bar

Quindi, puoi aggiungere all'override:

[Service]
EnvironmentFile=/path/to/some/file

In particolare, se /etc/default/grub contiene solo assegnazioni e nessuna sintassi della shell, puoi usarla come EnvironmentFile .

Via Environment voci

Quanto sopra potrebbe anche essere ottenuto usando la seguente sostituzione:

[Service]
Environment=FOO=bar

Tuttavia, questo può essere complicato con più variabili, spazi, ecc. Dai un'occhiata a una delle mie altre risposte per un esempio di tale istanza.

Ulteriori letture

Tramite questo meccanismo, diventa molto semplice sovrascrivere% unità% di unità, nonché annullare tali modifiche (semplicemente rimuovendo il file di sostituzione). Queste non sono le uniche impostazioni che possono essere modificate.

I seguenti collegamenti sarebbero utili:

risposta data muru 09.08.2015 - 05:31

Leggi altre domande sui tag