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-reload
pode 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 enable
sabe 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, systemctl
sabe 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.wants
diretório. Este é apenas um diretório cheio de links simbólicos (ou o real). Se a sua [Install]
secção diz que é WantedBy
o multi-user.target
, mas se um link simbólico para ela não existe no multi-user.target.wants
diretó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_PATH
terminar 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.unit
sã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_HOME
definida)
$HOME/.config/systemd/user
Configuração do usuário (usada apenas quando $XDG_CONFIG_HOME
não está definida)
$XDG_RUNTIME_DIR/systemd/user
Unidades de tempo de execução (usadas apenas quando $XDG_RUNTIME_DIR
configuradas)
$XDG_DATA_HOME/systemd/user
Unidades de pacotes que foram instaladas no diretório inicial (usadas apenas quando $XDG_DATA_HOME
configuradas)
$HOME/.local/share/systemd/user
Unidades de pacotes que foram instaladas no diretório inicial (usadas somente quando $XDG_DATA_HOME
nã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
.
/etc/systemd/system
é onde você colocar seus scripts, pacman coloca scripts de pacotes no/usr/lib/systemd/system
e emissãosystemctl enable foo.service
cria links simbólicos a partir/usr
de/etc
...