web-dev-qa-db-fra.com

Où dois-je placer mon fichier d'unité systemd?

I lire qu'il y a deux dossiers pour les fichiers d'unité (pas en mode utilisateur).

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

En contradiction avec cette compréhension est la réponse suivante: https://unix.stackexchange.com/a/47715/33386 . Quelqu'un peut-il remplir les informations manquantes pour que je comprenne ce qui se passe? ( MISE À JOUR: La réponse a été mise à jour et ma compréhension n'est plus en conflit avec elle. )

De plus, il semble que les scripts soient organisés en sous-dossiers dans le /etc/systemd/system/ dossier:

getty.target.wants
multi-user.target.wants

Dans un autre endroit, j'ai lu qu'il y avait d'autres endroits. Il semble que ce soit pour des services spécifiques à l'utilisateur.

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

Mise à jour 2015-08-31:

Pour le bien des autres, voici un lien vers une question connexe que j'ai récemment posée: Où dois-je placer les scripts exécutés par les unités systemd?

81
Jonathan Komar

Le meilleur endroit pour mettre système fichiers d'unité: /etc/systemd/system Assurez-vous simplement d'ajouter une cible dans la section [Installer], lisez "Comment le sait-il?" pour plus de détails. [~ # ~] mise à jour [~ # ~]: /usr/local/lib/systemd/system est une autre option, lisez "Zone grise" pour plus de détails. "

Le meilleur endroit pour mettre utilisateur fichiers d'unité: /etc/systemd/user ou $HOME/.config/systemd/user mais cela dépend des permissions et de la situation.

La vérité est que les unités systemd (ou comme la phrase d'introduction les appelle, "configurations d'unité") peuvent aller n'importe où - à condition que vous soyez prêt à créer des liens symboliques manuels et vous êtes conscient des mises en garde. Il est plus facile de mettre l'unité où systemctl daemon-reload peut le trouver pour de bonnes raisons:

  • L'utilisation d'un emplacement standard signifie que les générateurs systemd les trouveront et les rendront faciles à activer au démarrage avec systemctl enable. En effet, votre unité sera automatiquement ajoutée à une arborescence de dépendances d'unité (un cache d'unité).
  • Vous n'avez pas besoin de penser aux autorisations, car seuls les bons utilisateurs privilégiés peuvent écrire dans les zones désignées.

Comment le sait-il?

Et comment fonctionne exactement systemctl enable savez où créer le lien symbolique? Vous codez en dur dans l'unité elle-même sous le [install] section. Il y a généralement une ligne comme

[Install]
WantedBy = multi-user.target

cela correspond à un endroit prédéfini sur le système de fichiers. De cette façon, systemctl sait que cette unité dépend d'un groupe de fichiers d'unité appelé multi-user.target ("cible" est le terme utilisé pour désigner les groupes de dépendance d'unité. Vous pouvez répertorier tous les groupes avec systemctl list-units --type target). Le groupe de fichiers d'unité à charger avec une cible est placé dans un targetname.target.wants répertoire. Ceci est juste un répertoire plein de liens symboliques (ou la vraie chose). Si votre [Install] la section indique que c'est WantedBy le multi-user.target, mais si un lien symbolique vers celui-ci n'existe pas dans le multi-user.target.wants répertoire, il ne se chargera pas. Lorsque les générateurs d'unités systemd ajoutent votre fichier d'unité au cache de l'arborescence des dépendances au démarrage (vous pouvez déclencher manuellement des générateurs avec systemctl daemon-reload), il sait automatiquement où placer le lien symbolique - dans ce cas dans le répertoire /etc/systemd/system/multi-user.target.wants/ si vous l'activez.

Points clés du manuel:

Des unités supplémentaires peuvent être chargées dans systemd ("liées") à partir de répertoires ne se trouvant pas sur le chemin de chargement des unités. Voir la commande link pour systemctl (1).

Sous systemctl, recherchez Unit File Commands

Chemin de chargement du fichier unitaire

Les fichiers d'unité sont chargés à partir d'un ensemble de chemins déterminés lors de la compilation, décrits dans les deux tableaux ci-dessous. Les fichiers unitaires trouvés dans les répertoires répertoriés précédemment remplacent les fichiers portant le même nom dans les répertoires situés plus bas dans la liste.

Lorsque la variable $SYSTEMD_UNIT_PATH est défini, le contenu de cette variable remplace le chemin de chargement de l'unité. Si $SYSTEMD_UNIT_PATH se termine par un composant vide (":"), le chemin de chargement unitaire habituel sera ajouté au contenu de la variable.

Tableau 1 et tableau 2 de man systemd.unit sont bonnes.

Charger les chemins lors de l'exécution en mode système (--system).

  • /etc/systemd/system Configuration locale
  • /run/systemd/system Unités d'exécution
  • /usr/lib/systemd/system Unités des packages installés

Chemin de chargement lors de l'exécution en mode utilisateur (--user)

Il existe une différence entre par utilisateur unités et tous/global unités d'utilisateurs.

Dépendant de l'utilisateur

  • $XDG_CONFIG_HOME/systemd/user Configuration utilisateur (utilisé uniquement lorsque $XDG_CONFIG_HOME est défini)
  • $HOME/.config/systemd/user Configuration utilisateur (utilisé uniquement lorsque $XDG_CONFIG_HOME n'est pas défini)
  • $XDG_RUNTIME_DIR/systemd/user Unités d'exécution (utilisées uniquement lorsque $XDG_RUNTIME_DIR est défini)

  • $XDG_DATA_HOME/systemd/user Unités des packages installés dans le répertoire de base (uniquement utilisés lorsque $XDG_DATA_HOME est défini)

  • $HOME/.local/share/systemd/user Unités des packages installés dans le répertoire de base (uniquement utilisés lorsque $XDG_DATA_HOME n'est pas défini)

--global (tous les utilisateurs)

Unités qui s'appliquent à tous les utilisateurs - c'est-à-dire appartenant à chaque utilisateur également. Ainsi, chaque utilisateur peut arrêter ces services même si un administrateur les active au démarrage.

  • /etc/systemd/user Configuration locale pour tous les utilisateurs (systemctl --global enable userunit.service)
  • /usr/lib/systemd/user Unités de packages qui ont été installés à l'échelle du système pour tous les utilisateurs
  • /run/systemd/user Unités d'exécution

Zone grise

D'une part, le File Hierarchy Standard spécifie que /etc est pour les configurations locales qui n'exécutent pas de binaires. En revanche, il précise que /usr/local/ "est destiné à être utilisé par l'administrateur système lors de l'installation locale du logiciel". Vous pouvez également faire valoir (si ce n'est pas uniquement à des fins d'organisation) que tous les fichiers d'unité système doivent passer sous /usr/local/lib/systemd/system, mais ceci est destiné aux fichiers d'unité qui font partie du "logiciel" et non d'un gestionnaire de packages. Les unités utilisateur systemd correspondantes qui sont à l'échelle du système peuvent aller sous /usr/local/lib/systemd/user.

79
Jonathan Komar

/etc/systemd/system Est l'endroit où vous mettez vos scripts, pacman place package scripts dans /usr/lib/systemd/system.

L'émission de systemctl enable foo.service Crée des liens symboliques de /usr Vers /etc. Voir la section Chemin de chargement d'unité de man systemd.unit(5) pour plus de détails.

19
jasonwryan

J'en ai écrit 3, un pour ntpd, un pour une seconde, une carte Ethernet statique et un pour exécuter p0f, l'identifiant du système d'exploitation passif. Je les mets tous dans /etc/systemd/system. On dirait que je pourrais peut-être laisser systemd gérer le NTP trucs, mais je ne pense pas que je veux trop compter dessus.

1
Bruce Ediger