¿Cómo anulo o configuro los servicios systemd?

109

Muchos scripts de inicio de sysv utilizaron un archivo correspondiente /etc/defaultpara permitir que el administrador lo configure. Los trabajos iniciales pueden modificarse utilizando .overridearchivos. ¿Cómo anulo o configuro las unidades systemd, ahora que systemd es el predeterminado en Ubuntu?

muru
fuente
Tenga en cuenta que cuando se borra ExecStart=con una entrada en blanco, no puede poner un comentario después de esto: ExecStart= # Empty line to clear previous entries.Esto se tomará como otra ExecStart=entrada y se agregará a la lista. PD. No pude agregar comentarios a la respuesta de muru debido a mi baja reputación.
tysik

Respuestas:

185

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

Los paquetes envían archivos de unidades típicamente en /lib/systemd/system/. Estos no deben ser editados. En cambio, le systemdpermite 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 fooo ver sus registros usando journalctl -u foo. Para anular algo en la definición de foo, haga:

sudo systemctl edit foo

Esto crea un directorio con el /etc/systemd/systemnombre de la unidad y un override.confarchivo en ese directorio ( /etc/systemd/system/foo.service.d/override.conf). Puede agregar o anular configuraciones con este archivo (u otros .confarchivos /etc/systemd/system/foo.service.d/).

Anulación de argumentos de comando

Tome el gettyservicio por ejemplo. Digamos que quiero tener el inicio de sesión automático TTY2 para mi usuario (esto no es aconsejable, sino solo un ejemplo). TTY2 es ejecutado por el getty@tty2servicio ( tty2siendo una instancia de la plantilla /lib/systemd/system/getty@service). Para hacer esto, tengo que modificar el getty@tty2servicio.

$ 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

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

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

Para anular esto, haga:

sudo systemctl edit getty@tty2

Y añadir:

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

Tenga en cuenta que:

  1. Tenía que explícitamente claro ExecStartantes de colocarlo de nuevo, ya que es un ajuste de aditivo, similar a After, Environment(en su conjunto, no por cada variable) y EnvironmentFile, y opuesto a por sobre los valores como RestartSeco Type. ExecStartpuede tener múltiples entradas solo para Type=oneshotservicios.
  2. Tuve que usar el encabezado de sección adecuado. En el archivo original, ExecStartestá en la [Service]sección, por lo que mi anulación también debe incluirse ExecStarten la [Service]sección. A menudo, echar un vistazo al archivo de servicio real usando systemctl catle dirá qué necesita anular y en qué sección se encuentra.

Por lo general, si edita un archivo de unidad systemd, para que surta efecto, debe ejecutar:

sudo systemctl daemon-reload

Sin embargo, systemctl editautomáticamente hace esto 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 presiona CtrlAltF2, ¡listo! Voy a iniciar sesión en mi cuenta en ese TTY.

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

systemctl edit getty@

Anulando el medio ambiente

Un caso de uso común de los /etc/defaultarchivos es establecer variables de entorno. Por lo general, /etc/defaultes un script de shell, por lo que podría usar construcciones de lenguaje de shell en él. Sin systemdembargo, este no es el caso. Puede especificar variables de entorno de dos maneras:

A través de un archivo

Digamos 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/grubcontiene solo asignaciones y sin sintaxis de shell, puede usarlo como EnvironmentFile.

A través de Environmententradas

Lo anterior también podría lograrse utilizando 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 ver un ejemplo de tal instancia.

Otras lecturas

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

Los siguientes enlaces serían útiles:

muru
fuente
1
Debe borrar la variable antes de configurarla para servicios que no sean del tipo onehot. Esto resolvió mi problema.
Colin
3
@MarkEdington de la página de manual systemd.service(5), sección ExecStart: "A menos que Type = sea un disparo, se debe dar exactamente un comando. Cuando se usa Type = oneshot, se pueden especificar cero o más comandos. Los comandos se pueden especificar proporcionando múltiples líneas de comando en el mismo o, alternativamente, esta directiva puede especificarse más de una vez con el mismo efecto. Si la cadena vacía se asigna a esta opción, la lista de comandos para iniciar se restablece, las asignaciones anteriores de esta opción no tendrán efecto ".
muru
1
@ Oriente puede sudo rmanular el archivo y luego systemctl daemon-reload, o puede systemctl edity reemplazar todo en la anulación con comentarios. Los comentarios en los archivos de servicio comienzan con #.
muru
3
@Orientsystemctl revert foo
Ayell
1
¿Cuál es el orden de precedencia para los tres métodos (archivo de anulación, archivo de entorno, variable de entorno)? Es decir, para una variable definida en los tres, ¿qué valor será el efectivo?
Nikolaos Kakouros