Comment créer une cible systemd?

16

Après avoir cherché beaucoup à travers un poste, une vidéo Youtube et une "documentation" sur la question de systemd, je suis toujours perdu.

Le lien ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) semblait prometteur, mais était un peu vague (pour moi).

Question

Comment procéder pour créer une cible systemd personnalisée (IE: foo.target) afin de pouvoir démarrer avec certaines unités .service?

Exemple

  1. Le système démarre default.target (lien symbolique de "foo.target")
  2. "foo.target" ne démarre qu'un serveur barebones X et un programme GUI, par exemple "gvim".

Raison

Je cherche simplement à créer une cible personnalisée pour lancer rapidement un programme X. Je serais bien d'exclure tous les services dont je n'ai pas besoin.

Merci d'avance!

Pilbox
la source

Réponses:

16

La lecture man 5 systemd.unitet man 5 systemd.targetnous indique que les fichiers d'unité sont utilisés pour définir les cibles ainsi que tout le reste systemd. Il n'y a pas de documentation spécifique sur la façon de créer une cible , il est donc difficile de déterminer comment cela doit être fait, mais ce n'est pas trop différent de la création d'un service.

Lorsque vous créez votre cible, vous devrez créer des liens symboliques vers le target.wantsrépertoire à partir du répertoire des services systemd. Ensuite, vous pouvez définir / démarrer votre cible. Voici à quoi cela pourrait ressembler compte tenu de votre exemple.

/etc/systemd/system/foo.target

Il s'agit du fichier d'unité de la cible. Si graphical.target est pris comme exemple, nous pouvons créer notre propre cible en l'utilisant comme 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

Pour expliquer les options tirées des pages de manuel systemd;

  • Description- Décrit la cible. Vous devriez comprendre
  • Requires- Dépendances dures de la cible. Vous devez laisser le système de base démarrer avant de démarrer vos propres services
  • Wants- Dépendances douces. La cible n'a pas besoin de ceux-ci pour démarrer.
  • Conflicts - Si une unité a un paramètre Conflits sur une autre unité, le démarrage de la première arrêtera la seconde et vice versa.
  • After - Bottes après ces services
  • AllowIsolate- Vraiment à vous et à votre environnement. Les détails sont disponibles dans la page de manuelsystemd.unit(5)

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

Il s'agit du répertoire où vous lierez les services que vous créez / exigez pour votre cible. C'est l'équivalent de l' Wants=option dans le fichier d'unité. Créez ce répertoire, puis créez des liens symboliques comme ceci; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service. Cela crée un lien symbolique de bar.service dans le répertoire système vers votre répertoire foo.target.wants.


Je pense que la création d'un fichier d'unité pour un service est en quelque sorte hors de la portée de cette réponse, et cette question est certainement plus documentée, je vais donc laisser cela de côté pour l'instant. Lorsque vous créez votre fichier d'unité, il suffit de le lier symboliquement dans le répertoire target.wants ou de l'ajouter à la Wants=directive.

m32
la source
J'ai suivi ce qui précède pour créer une nouvelle cible et ajouté quelques cibles à mon service. Cependant, aucun de ces services n'est démarré par systemd. Existe-t-il un exemple complet qui montre que les services au sein de la cible nouvellement ajoutée fonctionnent?
linuxfan
1
Consultez le post de la pile du nécromancien si vous recherchez des étapes simples pour configurer un service personnalisé à exécuter au démarrage.
2017
@linuxfan j'ajoute foo.targetau Requireschamp et au Beforechamp de multi-user.target, et il aime Requires: base.target foo.target. Après cela, je redémarre mon Arch Linux vm et foobar.serviceje fonctionnerai automatiquement en tant que démon.
L_K
2
Belle réponse, mais cela ne semble pas fonctionner comme prévu. 1. Ce n'est pas parce qu'il est en manque que le service commencera avec cet objectif. 2. Le multi-user.target semble avoir une sorte de choses cachées qui le font fonctionner.
Otheus