Dependências do Systemd e ordem de inicialização

20

Preciso especificar uma ordem de inicialização para iniciar os processos. Eu tenho 389 Directory Server e Samba em execução no Fedora 18. Como posso inicializar os serviços de rede, depois o 389 DS e o Samba? Existe uma GUI para gerenciar isso no Fedora?

Eu habilitei o Samba para começar systemctl enable smb.service. Também habilitei o 389 DS com systemctl enable dirsrv.target.

Dylan Klomparens
fonte
O Systemd não exige ordem entre os serviços, a idéia é iniciar tudo em paralelo e entregar as conexões aos servidores assim que estiverem disponíveis. A configuração fornecida pela instalação padrão deve estar correta. Por que você acha que precisa definir um pedido? Algo falha no trabalho?
21413 vonbrand
Devo também observar, uma vez que isso voltou a funcionar, que você realmente não deveria estar executando serviços de arquivo / impressão no seu controlador de domínio.
Michael Hampton
@ vonbrand Eu tive esse problema, onde meu servidor DHCP precisava que o slapd estivesse ativo (porque sua configuração estava armazenada em um diretório LDAP). Se não fosse, o servidor DHCP não seria ativado.
esteira de

Respostas:

25

Use systemctl edit smb.servicepara atualizar as dependências.

After=dirsrv.target - Garantirá que o smb.service seja iniciado após o dirsrv.target.

Para maior robustez (que valerá a pena se você estiver mexendo com essas coisas), também poderá incluir alguns dos seguintes itens:

Requires=dirsrv.target- Ative dirsrv.target quando o smb.service estiver ativado. Causará uma falha no smb.service se o dirsrv.target falhar.

Wants=dirsrv.target- Ative dirsrv.target quando o smb.service estiver ativado. Não causará falha no smb.service se o dirsrv.target falhar.

BindsTo=dirsrv.target - Se dirsrv.target estiver desativado, desative smb.service.

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

systemd-uifornece uma GUI para systemd. Oferece uma boa visão do estado do systemd, mas você ainda precisará usar um editor de texto para modificar os arquivos da unidade.

Guy Gangemi
fonte
No caso de A Requer B , o que dirá "B" "falhou" para que A não seja iniciado? O programa de B retorna um valor diferente de zero?
John Wang
2
Voto negativo, porque isso aconselha más práticas. Não edite as /usr/lib/systemdversões dos arquivos da unidade, a menos que você seja um mantenedor da distribuição ou goste de que os arquivos sejam substituídos a cada atualização de pacote. Copie o arquivo da unidade /etc/systemde edite-o ou use um arquivo suspenso (consulte systemd.unit (5) para obter detalhes). Ainda mais fácil, basta usar o systemctl edit smb.serviceque o arquivo drop-in funciona automaticamente!
Jeremy Visser
3
Obrigado por editar a resposta! Resolve preocupações e eu me converti em um voto positivo. :-)
Jeremy Visser
10

Faça duas coisas:

  1. Edite o /lib/systemd/system/smb.servicearquivo da unidade, para especificar a dependência. A [unit]seção contém uma After=linha que especifica quais serviços / destinos devem ser alcançados antes deste.

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

    Altere para:

    After=dirsrv.target syslog.target network.target nmb.service winbind.service
    
  2. Relate essa dependência de volta ao Fedora como um bug , para que possa ser incorporada em versões futuras.

Michael Hampton
fonte
Isso não parece funcionar. Samba ainda está sendo inicializado antes de 389.
Dylan Klomparens
3
depois de modificar unitos arquivos, você deve normalmente executadosystemctl daemon-reload
scottyseus
2

talvez você precise alterar ou incluir uma linha com a Requiresdiretiva na [Unit] seção do /usr/lib/systemd/system/smb.servicearquivo.

Requires=dirsrv.target

e

After=dirsrv.target
cturiel
fonte
Bem, eu votei nessa resposta, no entanto, eu pessoalmente escolheria Wants = dirsrv.target em vez de Requer =. (veja systemd.unit (5) para Wants =)
galaxy
2

Existem duas alternativas para modificar o arquivo de serviço /usr/lib/systemd/system(consulte o Exemplo 2. Substituindo as configurações do fornecedor ):

  1. Copie o arquivo /etc/systemd/systeme faça as modificações na cópia. Este arquivo substituirá completamente o arquivo /usr/lib.

  2. Criar o arquivo /etc/systemd/system/smb.service.d/local.conf. O conteúdo do arquivo deve ser algo como o exemplo abaixo. Isso substitui seletivamente as opções "Requer" e "Depois" no arquivo de serviço fornecido pelo fornecedor.

Cada um deles (incluindo a modificação do arquivo /usr/lib) oferece vantagens e desvantagens. A melhor escolha pode depender do serviço e da natureza das modificações.

Embora possa funcionar, não é suficiente adicionar apenas a opção "Depois" (consulte Opções da seção [Unidade] ). "Depois" controla a ordem, mas não as dependências. Se dirsrv.targetnão for iniciado de outra maneira, a especificação de um pedido não o iniciará. O uso da opção "Requer" ou "Quer" forçará o dirsrv.targetinício.

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

NB: Não sei se essa abordagem estava disponível quando essa pergunta foi feita originalmente.

olho
fonte