Onde coloco meu arquivo de unidade systemd?

59

Eu li que existem 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 está a seguinte resposta: https://unix.stackexchange.com/a/47715/33386 . Alguém pode preencher as informações que faltam para que eu entenda o que está acontecendo? ( ATUALIZAÇÃO: a resposta foi atualizada e meu entendimento não conflita mais com ela. )

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

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

Em outro local, li que existem outros locais. Parece que estes 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.

Atualização 2015-08-31:

Para o bem de outras pessoas, aqui está um link para uma pergunta relacionada que eu fiz recentemente: Onde coloco scripts executados por unidades systemd?

Jonathan Komar
fonte
4
/etc/systemd/systemé onde você colocar seus scripts, pacman coloca scripts de pacotes no /usr/lib/systemd/systeme emissão systemctl enable foo.servicecria links simbólicos a partir /usrde /etc...
jasonwryan
11
Veja man systemd.target: explica o raciocínio por trás dos agrupamentos.
Jasonwryan

Respostas:

57

O melhor lugar para colocar arquivos de unidades do sistema : /etc/systemd/system adicione um destino na seção [Instalar], leia "Como ele sabe?" para detalhes. ATUALIZAÇÃO : /usr/local/lib/systemd/systemé outra opção, leia "Área cinzenta" para obter detalhes. "

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

A verdade é que as unidades do sistema (ou como a frase de introdução as chama de "configurações da unidade") podem ir a qualquer lugar - desde que você esteja disposto a fazer links simbólicos manuais e esteja ciente das advertências. Facilita a vida de colocar a unidade onde ela systemctl daemon-reloadpode ser encontrada por alguns bons motivos:

  • Usar um local padrão significa que os geradores do systemd os encontrarão e os tornarão mais fáceis de ativar na inicialização systemctl enable. Isso ocorre porque sua unidade será adicionada automaticamente a uma árvore de dependência de unidade (um cache de unidade).
  • Você não precisa pensar em permissões, porque apenas os usuários privilegiados certos podem gravar nas áreas designadas.

Como ele sabe?

E como exatamente systemctl enablesabe onde criar o link simbólico? Você o codifica dentro da própria unidade na [install]seção. Geralmente, há uma linha como

[Install]
WantedBy = multi-user.target

que corresponde a um local predefinido no sistema de arquivos. Dessa forma, systemctlsabe que esta unidade depende de um grupo de arquivos de unidades 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 de unidades a serem carregados com um destino é colocado em um targetname.target.wantsdiretório. Este é apenas um diretório cheio de links simbólicos (ou o real). Se a sua [Install]secção diz que é WantedByo multi-user.target, mas se um link simbólico para ela não existe no multi-user.target.wantsdiretório, então ele não irá carregar. Quando os geradores de unidades systemd adicionam seu arquivo de unidade ao cache da árvore de dependência na inicialização (você pode acionar geradores manualmente systemctl daemon-reload), ele automaticamente sabe onde colocar o link simbólico - nesse caso, no diretório/etc/systemd/system/multi-user.target.wants/ você deve habilitá-lo.

Pontos principais no manual:

Unidades adicionais podem ser carregadas no systemd ("vinculado") a partir de diretórios que não estão no caminho de carregamento da unidade. Veja o comando link para systemctl (1).

Em systemctl, procure por comandos de arquivo de unidade

Caminho de carregamento do arquivo de unidade

Os arquivos de unidade são carregados a partir de um conjunto de caminhos determinados durante a compilação, descritos nas duas tabelas abaixo. Os arquivos de unidade encontrados nos diretórios listados anteriormente substituem os arquivos com o mesmo nome nos diretórios inferiores da lista.

Quando a variável $SYSTEMD_UNIT_PATHé configurada, o conteúdo dessa variável substitui o caminho de carregamento da unidade. Se $SYSTEMD_UNIT_PATHterminar com um componente vazio (":"), o caminho normal de carregamento da unidade será anexado ao conteúdo da variável.

As tabelas 1 e 2 man systemd.unitsão boas.

Carregar 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)

Há uma diferença entre as unidades por usuário e todas as unidades / usuários globais .

Dependente do usuário

  • $XDG_CONFIG_HOME/systemd/user Configuração do usuário (usada apenas quando $XDG_CONFIG_HOMEdefinida)
  • $HOME/.config/systemd/user Configuração do usuário (usada apenas quando $XDG_CONFIG_HOMEnão está definida)
  • $XDG_RUNTIME_DIR/systemd/user Unidades de tempo de execução (usadas apenas quando $XDG_RUNTIME_DIRconfiguradas)

  • $XDG_DATA_HOME/systemd/user Unidades de pacotes que foram instaladas no diretório inicial (usadas apenas quando $XDG_DATA_HOMEconfiguradas)

  • $HOME/.local/share/systemd/user Unidades de pacotes que foram instaladas no diretório inicial (usadas somente quando $XDG_DATA_HOMEnão está configurada)

--global (todos os usuários)

Unidades que se aplicam a todos os usuários - ou seja, pertencem a cada usuário também. Portanto, cada usuário pode interromper esses serviços, mesmo que um administrador os habilite na inicialização.

  • /etc/systemd/user Configuração local para todos os usuários ( systemctl --global enable userunit.service)
  • /usr/lib/systemd/user Unidades de pacotes que foram instaladas em todo o sistema para todos os usuários
  • /run/systemd/user Unidades de tempo de execução

Area cinza

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

Jonathan Komar
fonte
O conselho sobre como colocar arquivos de unidade /etc/systemd/system, é esse conselho geral para arquivos de unidade criados automaticamente? Qualquer coisa instalada por um gerenciador de pacotes deve sempre colocá-los dentro, /usr/lib/systemd/systempor exemplo.
Slm
@slm Sim, quando a pergunta se refere aos meus arquivos de unidade do systemd, pretende-se implicar os criados automaticamente.
Jonathan Komar 06/09
Eu distinguiria: /etc/systemd/userpor serviços de usuário (garantidos) em todo o sistema e ~/.config/systemd/userpor serviços específicos de usuário personalizados.
Suuuehgi
16

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

A emissão systemctl enable foo.servicecria links simbólicos de /usrpara /etc. Consulte a seção Caminho de carga da unidade man systemd.unit(5)para obter mais detalhes.

jasonwryan
fonte
@ macmadness86 está faltando porque não está relacionado à pergunta.
jasonwryan
1

Escrevi 3, um para ntpd, um para um segundo cartão Ethernet estático e outro para execução p0f, o identificador passivo do SO. Eu coloquei todos eles /etc/systemd/system. Parece que eu poderia deixar systemdlidar com as coisas do NTP, mas acho que não quero confiar muito nisso.

Bruce Ediger
fonte