Como o systemd inclui arquivos e diretórios de destino de “dependência” em uma “unidade” de destino?

0

No diretório /lib/systemd/system dos meus computadores, 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 eu suponho que significa "executar" o arquivo basic.target .
Mas nesse mesmo diretório /lib/systemd/system , há também um subdiretório multi-user.target.wants/ . Contém mais arquivos unitários:

/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 são executadas quando multi-user.target é o destino de inicialização padrão? é tudo isso acima? se sim, qual é a ordem?

    
por the_velour_fog 26.04.2018 / 04:53

1 resposta

1

Há uma diferença entre Before / After e Wants / Requires / Requisite : o primeiro grupo indica que o tempo da unidade começa e o último grupo indica o dependências . Muitas vezes, há pouca diferença entre os dois, mas às vezes é importante. Ler a documentação é útil para mais detalhes, já que deixei de fora o material que você não vejo com tanta frequência.

Como exemplo, vamos fingir que você tem alguns serviços com dependências:

a.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 5;/bin/false'
RemainAfterExit=yes

b.service

[Unit]
After=a.service

[Service]
Type=oneshot
ExecStart=/bin/echo B
RemainAfterExit=yes

c.service

[Unit]
Requires=a.service

[Service]
Type=oneshot
ExecStart=/bin/echo C
RemainAfterExit=yes

d.service

[Unit]
After=a.service
Requires=a.service

[Service]
Type=oneshot
ExecStart=/bin/echo D
RemainAfterExit=yes

O que é carregado (e em qual ordem) muda drasticamente dependendo do que você começa:

  • a : a
  • b : b
  • c (ou a + c ): a e c ao mesmo tempo ( c fica em execução mesmo se a falhar)
  • d (ou a + d ): a - > c (se a foi iniciado com êxito)
  • a + b : a - > b (independentemente de se a iniciou)

Por que toda essa complexidade? É para acelerar o carregamento da unidade. Se os serviços não tiverem Before ou After referindo-se um ao outro, eles poderão ser iniciados ao mesmo tempo (supondo que nenhuma outra unidade precise deles!)

Onde estão os arquivos .target ? Eles colocam 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 querem esperar que outra fase seja iniciada. . Por exemplo, uma unidade pode incluir After=network.target para garantir que a rede tenha a chance de inicializar antes de iniciar, mesmo que esteja instalada como parte de multi-user.target .

Se quiser ver a ordem em que as unidades dependem umas das outras, você pode executar systemctl list-dependencies (isso não lhe dirá a ordem que eles carregaram, pois isso é um pouco aleatório fora de Before / After configurações.)

    
por 26.04.2018 / 08:09

Tags