Onde coloco meu arquivo de unidade do systemd?

30

Às vezes, essas coisas podem ser difíceis para os novatos. Sendo uma pessoa do tipo "faça você mesmo", eu leio que há duas pastas para arquivos de unidade (não no modo de usuário ).

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

Conflito com esse entendimento é a seguinte resposta: link . Alguém pode preencher as informações que faltam para que eu entenda o que está acontecendo? ( UPDATE: a resposta foi atualizada e meu entendimento não entra mais em conflito com ela. )

Além disso, parece que os scripts estão organizados em subpastas dentro da pasta /etc/systemd/system/ :

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

Em outro local, li que existem outros locais. Parece que são para serviços específicos do usuário.

/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.

Atualizar 2015-08-31:

Para o bem dos outros, aqui está um link para uma pergunta relacionada que fiz recentemente:   Existe um local designado para scripts que são (indiretamente) executados automaticamente pelo systemd?

    
por Jonathan Komar 23.08.2015 / 22:11

3 respostas

27

O melhor lugar para colocar arquivos de unidade system : /etc/systemd/system Apenas certifique-se de adicionar um alvo na seção [Instalar], leia "Como ele sabe?" para detalhes. UPDATE : /usr/local/lib/systemd/system é outra opção, leia "Área Cinza" para detalhes. "

O melhor lugar para colocar arquivos de unidade usuário : /etc/systemd/user ou $HOME/.config/systemd/user mas isso depende das permissões e da situação.

A verdade é que as unidades systemd (ou como a frase de introdução as chama, "configurações de unidade") podem ser em qualquer lugar - desde que você esteja disposto a fazer links simbólicos manuais e esteja ciente das ressalvas. Isso torna a vida mais fácil de colocar a unidade onde systemctl daemon-reload pode encontrá-lo por algumas boas razões:

  • O uso de um local padrão significa que os geradores systemd os encontrarão e facilitarão a ativação na inicialização com systemctl enable . Isso ocorre porque sua unidade será automaticamente adicionada a uma árvore de dependência de unidade (um cache de unidade).
  • Você não precisa pensar em permissões, porque somente os usuários com privilégios certos podem gravar nas áreas designadas.

Como ele sabe?

E como exatamente systemctl enable sabe onde criar o symlink? Você codifica dentro do código própria unidade na seção [install] . Geralmente há uma linha como

[Install]
WantedBy = multi-user.target

que corresponde a um local pré-definido no sistema de arquivos. Dessa forma, systemctl sabe que essa unidade depende de um grupo de arquivos de unidade chamado multi-user.target ("target" é o termo usado para designar grupos de dependência de unidades. Você pode listar todos os grupos com systemctl list-units --type target ). O grupo de arquivos unitários a serem carregados com um destino é colocado em um diretório targetname.target.wants . Este é apenas um diretório cheio de links simbólicos (ou a coisa real). Se a sua seção [Install] disser que é WantedBy o multi-user.target , mas se um link simbólico para ele não existir no diretório multi-user.target.wants , ele não será carregado. Quando os geradores de unidade systemd adicionam seu arquivo de unidade ao cache da árvore de dependência na inicialização (você pode disparar manualmente geradores com systemctl daemon-reload ), ele sabe automaticamente onde colocar o symlink - nesse caso, no diretório /etc/systemd/system/multi-user.target.wants/ você deve ativá-lo .

Pontos-chave no manual:

Additional units might be loaded into systemd ("linked") from directories not on the unit load path. See the link command for systemctl(1).

Em systemctl, procure por Comandos de arquivo de unidade

Caminho de carregamento do arquivo de unidade

Unit files are loaded from a set of paths determined during compilation, described in the two tables below. Unit files found in directories listed earlier override files with the same name in directories lower in the list.

When the variable $SYSTEMD_UNIT_PATH is set, the contents of this variable overrides the unit load path. If $SYSTEMD_UNIT_PATH ends with an empty component (":"), the usual unit load path will be appended to the contents of the variable.

A Tabela 1 e a Tabela 2 de man systemd.unit são boas.

Carrega caminhos ao executar no modo de sistema ( --system ).

  • /etc/systemd/system configuração local
  • /run/systemd/system unidades de tempo de execução
  • /usr/lib/systemd/system Unidades de pacotes instalados

Caminho de carregamento ao executar no modo de usuário ( --user )

  • $XDG_CONFIG_HOME/systemd/user Configuração do usuário (usada somente quando $XDG_CONFIG_HOME está definido)
  • $HOME/.config/systemd/user Configuração do usuário (usada apenas quando $XDG_CONFIG_HOME não está definido)
  • /etc/systemd/user configuração local
  • $XDG_RUNTIME_DIR/systemd/user Unidades de tempo de execução (usadas apenas quando $XDG_RUNTIME_DIR está definido)
  • /run/systemd/user unidades de tempo de execução
  • $XDG_DATA_HOME/systemd/user Unidades de pacotes que foram instalados no diretório inicial (usado somente quando $XDG_DATA_HOME está definido)
  • $HOME/.local/share/systemd/user Unidades de pacotes que foram instalados no diretório inicial (usado apenas quando $XDG_DATA_HOME não está definido)
  • /usr/lib/systemd/user Unidades de pacotes que foram instalados em todo o sistema

Área Cinza

Por um lado, o Padrão de hierarquia de arquivos especifica que /etc é para locais configurações que não executam binários. Por outro lado especifica que /usr/local/ "é para ser usado pelo administrador do sistema ao instalar o software localmente". Você também pode argumentar (se não apenas com o propósito de organização) que todos os arquivos da unidade do sistema devem ficar abaixo de /usr/local/lib/systemd/system , mas isso é destinado a arquivos unitários que fazem parte do "software" e não de um gerenciador de pacotes. As unidades de usuário systemd correspondentes que estão em todo o sistema podem   /usr/local/lib/systemd/user .

    
por 25.05.2017 / 18:29
14

/etc/systemd/system é onde você coloca seus scripts, o pacman coloca pacote scripts em /usr/lib/systemd/system .

A emissão de systemctl enable foo.service cria links simbólicos de /usr para /etc . Veja a seção Unit Load Path de man systemd.unit(5) para mais detalhes.

    
por 31.08.2015 / 09:53
1

Eu escrevi 3, um para ntpd , um por segundo, uma placa ethernet estática e outro para executar p0f , o identificador passivo do sistema operacional. Eu coloquei todos em /etc/systemd/system . Parece que eu poderia deixar systemd lidar com as coisas do NTP, mas eu não acho que eu queira confiar tanto nisso.

    
por 23.08.2015 / 22:29