¿Cómo crear un objetivo systemd?

16

Después de buscar mucho a través de muchas publicaciones, videos de Youtube y "documentación" sobre el tema de systemd, todavía estoy perdido.

El enlace ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) parecía prometedor, pero fue un poco vago (para mí).

Pregunta

¿Cómo se podría crear un objetivo systemd personalizado (IE: foo.target) para poder arrancar con unidades seleccionadas .service?

Ejemplo

  1. El sistema arranca default.target (enlace simbólico de "foo.target")
  2. "foo.target" solo inicia un servidor X barebones y un programa GUI, diga "gvim".

Razón

Simplemente estoy buscando crear un objetivo personalizado para iniciar rápidamente un programa X. Sería bueno excluir todos los servicios que no necesito.

¡Gracias por adelantado!

Pilbox
fuente

Respuestas:

16

Lee man 5 systemd.unity man 5 systemd.targetnos dice que los archivos de la unidad se utilizan para definir objetivos, así como todo lo demás systemd. No hay documentación específica sobre cómo crear un objetivo , por lo que es difícil determinar cómo se debe hacer, pero no es muy diferente de crear un servicio.

Cuando cree su destino, necesitará hacer enlaces simbólicos al target.wantsdirectorio desde el directorio de servicios systemd. Entonces puedes establecer / arrancar tu objetivo. Así es como podría verse dado su ejemplo.

/etc/systemd/system/foo.target

Este es el archivo de unidad del objetivo. Si se toma graphical.target como ejemplo, podemos crear nuestro propio objetivo utilizándolo como base.

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

Para explicar las opciones tomadas de las páginas de manual de systemd;

  • Description- Describe el objetivo. Usted debe comprender
  • Requires- Dependencias duras del objetivo. Debería permitir que el sistema básico se inicie antes de iniciar su (s) propio (s) servicio (s)
  • Wants- Dependencias suaves. El objetivo no requiere que estos comiencen.
  • Conflicts - Si una unidad tiene una configuración de Conflictos en otra unidad, al iniciar la primera se detendrá la segunda y viceversa.
  • After - Botas después de estos servicios
  • AllowIsolate- Realmente depende de usted y su entorno. Los detalles están disponibles en la página de manualsystemd.unit(5)

/etc/systemd/system/foo.target.wants/

Este es el directorio donde vinculará los servicios que cree / requiera para su objetivo. Es equivalente a la Wants=opción en el archivo de la unidad. Cree este directorio y luego cree enlaces simbólicos como este; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service. Esto crea un enlace simbólico de bar.service en el directorio del sistema a su directorio foo.target.wants.


Creo que crear un archivo de unidad para un servicio está fuera del alcance de esta respuesta, y esa pregunta definitivamente está más documentada, así que lo dejaré fuera por ahora. Cuando cree su archivo de unidad, simplemente enlace simbólicamente en el directorio target.wants o agréguelo a la Wants=directiva.

m32
fuente
Seguí lo anterior para crear un nuevo objetivo y agregué algunos objetivos a mi servicio. Sin embargo, ninguno de esos servicios es iniciado por systemd. ¿Hay un ejemplo completo que demuestre que los servicios dentro del objetivo recién agregado funcionan?
linuxfan
1
Consulte la publicación de la pila del nigromante si está buscando pasos simples para configurar un servicio personalizado para que se ejecute en el arranque.
Pilbox
@linuxfan Añado foo.targetal Requirescampo y al Beforecampo de multi-user.target, y me gusta Requires: base.target foo.target. Después de eso reinicio mi Arch Linux vm, y foobar.servicese ejecutará como daemon automáticamente.
L_K
2
Buena respuesta, pero en realidad no parece funcionar como cabría esperar. 1. El hecho de que esté en necesidad no significa que el servicio comenzará con ese objetivo. 2. El multiusuario.target parece tener algún tipo de cosas ocultas que lo hacen funcionar.
Oteo