No diretório do meu computador /lib/systemd/system
, vejo um arquivo multiuser.target
- esse arquivo contém:
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
A linha: Requires: basic.target
que suponho significa "executar" o basic.target
arquivo.
Mas nesse mesmo /lib/systemd/system
diretório também há um multi-user.target.wants/
subdiretório. Ele contém mais arquivos de unidade:
/lib/systemd/system $tree multi-user.target.wants/
multi-user.target.wants/
├── dbus.service -> ../dbus.service
├── getty.target -> ../getty.target
├── systemd-ask-password-wall.path -> ../systemd-ask-password-wall.path
├── systemd-logind.service -> ../systemd-logind.service
├── systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
└── systemd-user-sessions.service -> ../systemd-user-sessions.service
qual dessas unidades, ou seja, arquivo: basic.target
ou todas as unidades no subdiretório multi-user.wants.target
é executada quando multi-user.target
é o destino de inicialização padrão? é tudo o que foi dito acima? se sim, qual é a ordem?
Há uma diferença entre
Before
/After
eWants
/Requires
/Requisite
: o primeiro grupo indica o tempo de inicialização da unidade e o último grupo indica as dependências . Muitas vezes, há pouca diferença entre os dois, mas às vezes é importante. A leitura da documentação é útil para obter mais detalhes, pois deixei de fora coisas que você não vê com tanta frequência.Como exemplo, vamos supor que você tenha alguns serviços com dependências:
um serviço
b.serviço
c.serviço
d.serviço
O que é carregado (e em que ordem) muda drasticamente dependendo do que você inicia:
a
:a
b
:b
c
(oua
+c
):a
ec
ao mesmo tempo (c
continua rodando mesmo sea
falhar)d
(oua
+d
):a
->c
(sea
iniciado com sucesso)a
+b
:a
->b
(independentemente de tera
iniciado)Por que toda essa complexidade? É para acelerar o carregamento da unidade. Se os serviços não tiverem um
Before
ouAfter
referindo-se um ao outro, eles podem ser iniciados ao mesmo tempo (supondo que nenhuma outra unidade precise deles!)Onde
.target
entram os arquivos? Eles colocam as unidades em grupos funcionais, de modo que, à medida que o sistema é iniciado (ou parado, etc.), as unidades necessárias para essa fase podem ser iniciadas juntas e as unidades podem indicar que desejam aguardar a inicialização de outra fase . Por exemplo, uma unidade pode incluirAfter=network.target
para garantir que a rede tenha a chance de inicializar antes de iniciar, mesmo que seja instalada como parte domulti-user.target
.Se você quiser ver a ordem em que as unidades dependem umas das outras, você pode executar
systemctl list-dependencies
(ele não informará a ordem em que elas foram carregadas, pois isso é um tanto aleatório fora deBefore
/After
settings.)