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:
- 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.
- 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: