Como faço para substituir ou configurar serviços do systemd?

65

Muitos scripts init sysv usaram um arquivo correspondente em /etc/default para permitir que o administrador o configurasse. Tarefas de inicialização podem ser modificadas usando .override files. Como faço para substituir ou configurar unidades systemd, agora que o systemd é o padrão no Ubuntu?

    
por muru 09.08.2015 / 05:31

1 resposta

111

systemd unidades não precisam obedecer a arquivos em /etc/default . systemd é facilmente configurável, mas requer que você conheça a sintaxe dos arquivos unitários do systemd.

Arquivos de unidade de envio de pacotes normalmente em /lib/systemd/system/ . Estes não devem ser editados. Em vez disso, systemd permite que você substitua esses arquivos criando arquivos apropriados em /etc/systemd/system/ .

Para um determinado serviço foo , o pacote forneceria /lib/systemd/system/foo.service . Você pode verificar seu status usando systemctl status foo ou exibir seus registros usando journalctl -u foo . Para sobrescrever algo na definição de foo , faça:

sudo systemctl edit foo

Isso cria um diretório em /etc/systemd/system com o nome da unidade e um arquivo override.conf nesse diretório ( /etc/systemd/system/foo.service.d/override.conf ). Você pode adicionar ou substituir configurações usando esse arquivo (ou outros arquivos .conf em /etc/systemd/system/foo.service.d/ ).

Substituindo argumentos de comando

Pegue o serviço getty por exemplo. Digamos que eu queira ter o autologin do TTY2 para o meu usuário (isso não é aconselhável, mas apenas um exemplo). O TTY2 é executado pelo getty@tty2 service ( tty2 sendo uma instância do modelo /lib/systemd/system/getty@service ). Para fazer isso, tenho que modificar o getty@tty2 service.

$ systemctl cat getty@tty2
# /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

Em particular, tenho que alterar a linha ExecStart , que atualmente é:

$ systemctl cat getty@tty2 | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM

Para substituir isso, faça:

sudo systemctl edit getty@tty2

E adicione:

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

Observe que:

  1. Precisei limpar explicitamente ExecStart antes de configurá-lo novamente, pois é uma configuração adicional, semelhante a After , Environment (como um todo, não por variável) e EnvironmentFile , e oposta a sobrescrevendo configurações como RestartSec ou Type . ExecStart pode ter várias entradas apenas para Type=oneshot services.
  2. Eu tive que usar o cabeçalho da seção correta. No arquivo original, ExecStart está na seção [Service] , então minha substituição também deve colocar ExecStart na seção [Service] . Muitas vezes, dar uma olhada no arquivo de serviço real usando systemctl cat dirá o que você precisa substituir e em qual seção ele está.

Normalmente, se você editar um arquivo de unidade do systemd, para que ele tenha efeito, você precisa executar:

sudo systemctl daemon-reload

No entanto, systemctl edit faz isso automaticamente para você.

Agora:

$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

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

E se eu fizer isso:

sudo systemctl restart getty@tty2

e pressione Ctrl Alt F2 , pronto! Eu vou estar logado na minha conta naquele TTY.

Como eu disse antes, getty@tty2 é uma instância de um modelo. Então, e se eu quisesse substituir todas as instâncias desse modelo? Isso pode ser feito editando o próprio modelo (removendo o identificador da instância - neste caso tty2 ):

systemctl edit getty@

Substituindo o ambiente

Um caso de uso comum de /etc/default arquivos é a configuração de variáveis ​​de ambiente. Normalmente, /etc/default é um script de shell, então você pode usar construções de linguagem de shell nele. Com systemd , no entanto, esse não é o caso. Você pode especificar variáveis ​​de ambiente de duas maneiras:

Via um arquivo

Digamos que você tenha definido as variáveis ​​de ambiente em um arquivo:

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

Depois, você pode adicionar à substituição:

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

Em particular, se seu /etc/default/grub contiver somente atribuições e nenhuma sintaxe de shell, você poderá usá-lo como EnvironmentFile .

Via Environment entradas

O acima também pode ser realizado usando a seguinte substituição:

[Service]
Environment=FOO=bar

No entanto, isso pode ser complicado com várias variáveis, espaços, etc. Dê uma olhada em uma das minhas outras respostas para um exemplo de tal instância.

Leitura adicional

Através deste mecanismo, torna-se muito fácil substituir systemd unidades, bem como desfazer essas alterações (simplesmente removendo o arquivo de substituição). Estas não são as únicas configurações que podem ser modificadas.

Os links a seguir seriam úteis:

por muru 09.08.2015 / 05:31