Coexistência de scripts de inicialização SysV, Upstart e systemd

9

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

Eu 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 estragar de alguma forma? Ainda parece funcionar.

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

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

    
por user2061057 04.01.2017 / 10:00

1 resposta

10

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

Vários pacotes são fornecidos 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, scripts para vários sistemas init são instalados, mesmo que nem todos sejam usados ao mesmo tempo.

Os sistemas de inicialização 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, esse é um script de inicialização "SysV", não um script Upstart. Além disso, os scripts init "SysV" só seriam iniciados na inicialização se fossem vinculados a um diretório como "/etc/rc5.d". Você verá que o Network Manager não tem um link simbólico instalado lá.

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

Agora, para responder à pergunta sobre por que funciona para reiniciar o Network Manager com "reinicialização do gerenciador de rede do serviço". O comando service é usado com scripts Upstart e scripts init SysV, preferindo o primeiro. O Network Manager também possui um script Upstart instalado no 16.04 em /etc/init/network-manager.conf .

Se você analisar a saída de sudo strace service network-manager restart , poderá ter uma ideia do que está acontecendo. Primeiro, a saída mostra que systemctl está sendo chamado, indicando que o comando está sendo redirecionado para o systemd. Primeiro, logo após abrir /usr/bin/service , você pode ver que ele começa a ler no 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, descobrimos que is_systemd é detectado e definido. Para o caso do systemd, você pode ver que o comando foi reescrito para ser systemctl restart network-manager .

Assim, 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 unitários do systemd e a ferramenta systemctl para gerenciar os serviços.

    
por Mark Stosberg 04.01.2017 / 15:44