¿Cómo anulo o configuro servicios systemd?

69

Muchos scripts de sysv init usaron un archivo correspondiente en /etc/default para permitir que el administrador lo configure. Los trabajos upstart se pueden modificar usando archivos .override . ¿Cómo anulo o configuro unidades systemd, ahora que systemd es el predeterminado en Ubuntu?

    
pregunta muru 09.08.2015 - 03:31

1 respuesta

118

systemd unidades no necesitan obedecer archivos en /etc/default . systemd es fácilmente configurable, pero requiere que conozca la sintaxis de los archivos de unidad systemd.

Los paquetes envían archivos de unidades típicamente en /lib/systemd/system/ . Estos no se deben editar. En cambio, systemd le permite anular estos archivos creando archivos apropiados en /etc/systemd/system/ .

Para un servicio dado foo , el paquete proporcionaría /lib/systemd/system/foo.service . Puede verificar su estado usando systemctl status foo , o ver sus registros usando journalctl -u foo . Para anular algo en la definición de foo , hazlo:

sudo systemctl edit foo

Esto crea un directorio en /etc/systemd/system nombrado después de la unidad, y un archivo override.conf en ese directorio ( /etc/systemd/system/foo.service.d/override.conf ). Puede agregar o anular las configuraciones usando este archivo (u otro .conf archivos en /etc/systemd/system/foo.service.d/ ).

Sobrescribir los argumentos del comando

Tome el servicio getty , por ejemplo. Digamos que quiero tener TTY2 autologin para mi usuario (esto no es aconsejable, solo un ejemplo). TTY2 se ejecuta con el servicio getty@tty2 ( tty2 es una instancia de la plantilla /lib/systemd/system/getty@service ). Para hacer esto, tengo que modificar el servicio getty@tty2 .

$ systemctl cat getty@tty2
# /lib/systemd/system/getty@.service
#  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 serial-getty@.service, 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

En particular, tengo que cambiar la línea ExecStart , que actualmente es:

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

Para anular esto, hazlo:

sudo systemctl edit getty@tty2

Y añada:

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

Tenga en cuenta que:

  1. Tuve que borrar explícitamente ExecStart antes de volver a configurarlo, ya que es una configuración aditiva, similar a After , Environment (como un todo, no por variable) y EnvironmentFile , y opuesto a reemplazando configuraciones como RestartSec o Type . ExecStart puede tener entradas múltiples solo para Type=oneshot services.
  2. Tuve que usar el encabezado de sección adecuado. En el archivo original, ExecStart está en la sección [Service] , por lo que mi anulación tiene que poner ExecStart en la sección [Service] también. A menudo, echar un vistazo al archivo de servicio real usando systemctl cat le indicará qué debe anular y en qué sección se encuentra.

Generalmente, si edita un archivo de unidad systemd, para que tenga efecto, debe ejecutar:

sudo systemctl daemon-reload

Sin embargo, systemctl edit hace esto automáticamente por usted.

Ahora:

$ 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 ; ... }

Y si lo hago:

sudo systemctl restart getty@tty2

y presione Ctrl Alt F2 , ¡listo! Iniciaré sesión en mi cuenta en ese TTY.

Como dije antes, getty@tty2 es una instancia de una plantilla. Entonces, ¿qué pasa si quiero anular todas las instancias de esa plantilla? Esto se puede hacer editando la plantilla misma (eliminando el identificador de instancia, en este caso tty2 ):

systemctl edit getty@

Anulación del entorno

Un caso de uso común de archivos /etc/default es establecer variables de entorno. Por lo general, /etc/default es un script de shell, por lo que podría usar construcciones de lenguaje de shell en él. Con systemd , sin embargo, este no es el caso. Puede especificar variables de entorno de dos maneras:

A través de un archivo

Supongamos que ha establecido las variables de entorno en un archivo:

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

Luego, puede agregar a la anulación:

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

En particular, si su /etc/default/grub contiene solo asignaciones y sin sintaxis de shell, podría usarlo como EnvironmentFile .

A través de Environment entries

Lo anterior también se puede lograr con la siguiente anulación:

[Service]
Environment=FOO=bar

Sin embargo, esto puede ser complicado con múltiples variables, espacios, etc. Eche un vistazo a una de mis otras respuestas para un ejemplo de tal instancia.

Lectura adicional

A través de este mecanismo, es muy fácil anular systemd unidades, así como deshacer dichos cambios (simplemente eliminando el archivo de anulación). Estas no son las únicas configuraciones que se pueden modificar.

Los siguientes enlaces serían útiles:

respondido por el muru 09.08.2015 - 03:31

Lea otras preguntas en las etiquetas