Dépendances de Systemd et ordre de démarrage

20

J'ai besoin de spécifier un ordre de démarrage pour que les processus démarrent. J'ai 389 Directory Server et Samba en cours d'exécution sur Fedora 18. Comment puis-je faire démarrer les services réseau, puis 389 DS, puis Samba? Existe-t-il une interface graphique pour gérer cela dans Fedora?

J'ai permis à Samba de commencer systemctl enable smb.service. J'ai également activé 389 DS avec systemctl enable dirsrv.target.

Dylan Klomparens
la source
Systemd ne nécessite pas d'ordre parmi les services, l'idée est de tout démarrer en parallèle et de remettre les connexions aux serveurs dès qu'ils deviennent disponibles. La configuration donnée par l'installation par défaut devrait être correcte. Pourquoi pensez-vous que vous devez définir une commande? Quelque chose ne fonctionne pas?
vonbrand
Je dois également noter, puisque cela est revenu, que vous ne devriez vraiment pas exécuter de services de fichiers / d'impression sur votre contrôleur de domaine.
Michael Hampton
@vonbrand J'ai eu ce problème, où mon serveur DHCP avait besoin que slapd soit actif (car sa configuration était stockée dans un annuaire LDAP). Si ce n'était pas le cas, le serveur DHCP ne se présenterait pas.
mat

Réponses:

25

Utilisez systemctl edit smb.servicepour mettre à jour les dépendances.

After=dirsrv.target - S'assurera que le service smb.est démarré après dirsrv.target.

Pour la robustesse, (ce qui en vaut la peine si vous bricolez avec ce genre de choses), vous pouvez également souhaiter inclure certains des éléments suivants:

Requires=dirsrv.target- Activez dirsrv.target lorsque smb.service est activé. Entraînera l'échec de smb.service en cas d'échec de dirsrv.target.

Wants=dirsrv.target- Activez dirsrv.target lorsque smb.service est activé. N'entraînera pas l'échec de smb.service si dirsrv.target échoue.

BindsTo=dirsrv.target - Si dirsrv.target est désactivé, désactivez smb.service.

Source: http://www.freedesktop.org/software/systemd/man/systemd.unit.html

systemd-uifournit une interface graphique pour systemd. Donne une bonne vue de l'état de systemd mais vous devrez toujours utiliser un éditeur de texte pour modifier les fichiers d'unité.

Guy Gangemi
la source
Dans le cas où A requiert B , que dira "B" a "échoué" pour que A ne soit pas démarré? Le programme de B renvoie une valeur non nulle?
John Wang
2
Voté car cela conseille une mauvaise pratique. Ne modifiez pas les /usr/lib/systemdversions des fichiers d'unité à moins que vous ne soyez un mainteneur de distribution ou que vous appréciez que vos fichiers soient écrasés à chaque mise à jour de package. Soit copiez le fichier d'unité dans /etc/systemd, puis modifiez-le, ou utilisez un fichier de dépôt (voir systemd.unit (5) pour plus de détails). Encore plus facile, utilisez simplement systemctl edit smb.servicece qui fait automatiquement la magie du fichier de dépôt!
Jeremy Visser
3
Merci d'avoir édité la réponse! Cela résout les problèmes et je me suis converti en vote positif. :-)
Jeremy Visser
10

Faites deux choses:

  1. Modifiez le /lib/systemd/system/smb.servicefichier d'unité pour spécifier la dépendance. La [unit]section contient une After=ligne qui spécifie quels services / cibles doivent être atteints avant celui-ci.

    After=syslog.target network.target nmb.service winbind.service
    

    Changez-le en:

    After=dirsrv.target syslog.target network.target nmb.service winbind.service
    
  2. Signalez cette dépendance à Fedora en tant que bogue , afin qu'elle puisse être incorporée dans les futures versions.

Michael Hampton
la source
Cela ne semble pas fonctionner. Samba démarre toujours avant 389.
Dylan Klomparens
3
après avoir modifié des unitfichiers, vous devez généralement exécutersystemctl daemon-reload
scottyseus
2

vous devrez peut-être modifier ou inclure une ligne avec la Requiresdirective dans la [Unit] section du /usr/lib/systemd/system/smb.servicefichier.

Requires=dirsrv.target

et

After=dirsrv.target
cturiel
la source
Eh bien, j'ai voté pour cette réponse, cependant, j'irais personnellement avec Wants = dirsrv.target au lieu de Requirements =. (voir systemd.unit (5) pour Wants =)
galaxy
2

Il existe deux alternatives à la modification du fichier de service dans /usr/lib/systemd/system(voir l' exemple 2. Remplacer les paramètres du fournisseur ):

  1. Copiez le fichier /etc/systemd/systemet effectuez les modifications sur la copie. Ce fichier remplacera complètement le fichier dans /usr/lib.

  2. Créez le fichier /etc/systemd/system/smb.service.d/local.conf. Le contenu du fichier doit ressembler à l'exemple ci-dessous. Cela remplace de manière sélective les options "Requiert" et "Après" dans le fichier de service fourni par le fournisseur.

Chacun d'eux (y compris la modification du fichier dans /usr/lib) offre des avantages et des inconvénients. Le meilleur choix peut dépendre du service et de la nature des modifications.

Bien que cela puisse fonctionner, il ne suffit pas d'ajouter uniquement l'option "Après" (voir Options de la section [Unité] ). "Après" contrôle l'ordre, mais pas les dépendances. Si dirsrv.targetn'est pas démarré d'une autre manière, la spécification d'une commande ne la lancera pas. L'utilisation de l'option "Requiert" ou "Veut" forcera dirsrv.targetle démarrage.

[Unit]
Requires=dirsrv.target
After=dirsrv.target

NB: Je ne sais pas si cette approche était disponible lorsque cette question a été posée à l'origine.

œil
la source