Coexistência de scripts SysV, Upstart e systemd init

15

No meu sistema (16.04), existem os arquivos /lib/systemd/system/network-manager.servicee /etc/init.d/network-manager, por exemplo.

Não entendo como (e por que) isso funciona. Eu sempre reinicio o Network Manager por sudo service network-manager restart. Isso não deveria atrapalhar o sistema? Ainda parece funcionar.

Por que service --status-alllista todos os tipos de serviços? 16.04 não deveria usar systemd em vez de Upstart?

Alguém, por favor, explique como essa coexistência funciona.

user2061057
fonte

Respostas:

17

Somente um sistema init pode estar ativo de uma vez. No 16.04, isso é systemd.

Vários pacotes são enviados com arquivos para vários sistemas init, para que possam ser gerenciados com vários sistemas init em diferentes sistemas operacionais. No Ubuntu, às vezes, os scripts para vários sistemas init são instalados, mesmo que nem todos sejam usados ​​ao mesmo tempo.

Os sistemas init mais recentes tentam manter a compatibilidade com os mais antigos. Em particular, o systemd tenta manter a compatibilidade com os scripts init Upstart e SysV.

No caso do script "init.d" que você mencionou, é um script de inicialização "SysV", não um script Upstart. Além disso, os scripts de inicialização "SysV" somente seriam iniciados na inicialização se eles tivessem um link simbólico para um diretório como "/etc/rc5.d". Você verá que o Network Manager não possui um link simbólico instalado lá.

Para entender como systemdgerencia scripts de inicialização "SysV" antigos, consulte Como o systemd usa os /etc/init.d scirpts? .

Agora, para responder à pergunta sobre por que ele funciona, reinicie o Network Manager com "service network-manager restart". O servicecomando é usado com os scripts Upstart e SysV init, preferindo o primeiro. O Network Manager também possui um script Upstart instalado no 16.04 em /etc/init/network-manager.conf.

Se você revisar a saída de sudo strace service network-manager restart, poderá ter uma noção do que está acontecendo. Primeiro, a saída mostra que systemctlestá sendo chamado, indicando que o comando está sendo redirecionado para systemd. Primeiro, logo após a abertura /usr/bin/service, você pode vê-lo começar a ler o arquivo como um script de shell:

open("/usr/sbin/service", O_RDONLY)     = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192

Agora que sabemos que serviceé um script de shell, podemos verificar o código fonte dele. No código fonte, achamos que is_systemdé detectado e definido. Para o caso systemd, você pode ver que o comando foi reescrito systemctl restart network-manager.

Portanto, enquanto os três sistemas init coexistem e têm alguma compatibilidade, existem camadas de complexidade. Para minimizar a complexidade do que está acontecendo no futuro, é melhor usar os arquivos de unidade do systemd e a systemctlferramenta para gerenciar serviços.

Mark Stosberg
fonte