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
.