Tenho duas referências que parecem confiáveis, mas oferecem informações diferentes.
Na primeira referência, é mencionado que default.target
é um dos alvos iniciais executados. Então (assumindo que queremos que o sistema inicialize no modo CLI) multi-user.target
será executado, seguido por basic.target
, e finalmente, chegaremos a sysinit.target
.
Entretanto, na segunda referência, o processo é descrito na ordem oposta! Ele afirma que sysinit.target
é executado primeiro, seguido por basic.target
, e assim por diante.
Estou confuso. Qual ordem está correta? /sbin/init
Com qual alvo começa logo no começo?
Sua primeira referência parece confusa, ou talvez esteja descrevendo como
systemd
começa a descobrir a árvore de dependências entre as várias unidades.Veja
man 7 bootup
no seu sistema; ele inclui um gráfico em ASCII dosystemd
processo de inicialização baseado em .Em versões modernas de
systemd
, odefault.target
é um alias para o estado de meta geral do processo de inicialização, mais comumente definido comographical.target
em sistemas com GUI habilitada oumulti-user.target
se a GUI local não for necessária. Uma vez que odefault.target
é alcançado e quaisquer operações em andamentosystemd
em execução naquele ponto são concluídas, o processo de inicialização estará essencialmente completo.Na prática, ele é definido por
/etc/systemd/system/default.target
which é um link simbólico para qualquer alvo real definido como padrão, por exemplosystemctl set-default graphical.target
.Na minha área de trabalho:
Em um sistema de servidor:
Veja
man 7 bootup
em qualquer sistemasystemd
um diagrama de arte ASCII dos vários alvos e suas funções no processo de inicialização.Então, quando
systemd
inicia em/sbin/init
e não há opções de boot para dizer o contrário, sua "missão geral" é alcançardefault.target
. Primeiro, ele vê que o alvo padrão é um alias de, digamos,graphical.target
.A definição de
graphical.target
inclui o seguinte:Então, primeiro ele precisa satisfazer
multi-user.target
e seria bom começardisplay-manager.service
também, porém este último não é absolutamente essencial (ou seja, não vale a pena desligar todos os serviços regulares e entrar no modo de recuperação se falhar).O
rescue.service
erescue.target
são mencionados, mas nada os exigiu nem os quis , então eles serão ignoradossystemd
neste momento.A
multi-user.target
definição inclui o seguinte:Novamente, acontece que
basic.target
deve vir primeiro erescue.service
aindarescue.target
não são Obrigatórios nem Desejados , então podem ser ignorados.Há também uma série de serviços normais do sistema que são
WantedBy=multi-user.target
, mas todos eles terão que esperar até quebasic.target
sejam satisfeitos primeiro, porque qualquer serviço que não tenhaDefaultDependencies=no
terá implícitoRequires=sysinit.target
eAfter=sysinit.target basic.target
aplicado a eles.Então,
systemd
vamos considerar a seguirbasic.target
. Sua definição inclui:E aqui chegamos a
sysinit.target
. Ele vem por último na ordem de análise de dependência , mas acontece que ele precisa ser o primeiro das unidades alvo consideradas até agora na ordem de execução , já que todas as outras unidades consideradas até agora foram programadasAfter
para ele. A definição desysinit.target
inclui:Na prática, isso faz com que qualquer sistema de arquivos local seja montado e o swap seja ativado. Há também um
local-fs-pre.target
que pode ser usado para iniciar serviços como RAID de software, criptografia de disco, LVM ou multipathing, que podem ser pré-requisitos para a montagem.Neste ponto,
systemd
encontra um número de unidades de serviço que sãoWantedBy=sysinit.target
e têmBefore=sysinit.target
ou não requisitos de pedido, para que possam ser executadas imediatamente, em paralelo. Uma vez que todas as unidades marcadasBefore=sysinit.target
tenham sido iniciadas (ou falhado na tentativa), elassysinit.target
podem ser marcadas como concluídas.Então será hora de iniciar quaisquer unidades que estejam marcadas
After=sysinit.target
masBefore=basic.target
... e assim por diante, até que todos os requisitos debasic.target
sejam satisfeitos, e assim o alvo pode ser marcado como "ativado". Isso abre outro grupo de unidades a serem iniciadas: este grupo inclui a maioria dos serviços "normais", ou seja, todos aqueles que não têmDefaultDependencies=no
definido e sãoWantedBy=multi-user.target
.