SysV, Upstart e systemd init coesistenza di script


15

Sul mio sistema (16.04), ci sono i file /lib/systemd/system/network-manager.servicee /etc/init.d/network-manager, per esempio.

Non capisco come (e perché) funzioni. Riavvio sempre Network Manager da sudo service network-manager restart. In qualche modo questo disordine non dovrebbe essere in disordine? Sembra ancora funzionare.

Perché service --status-allelenca tutti i tipi di servizi? 16.04 non dovrebbe usare systemd invece di Upstart?

Qualcuno per favore spiega come funziona questa convivenza.

Risposte:


17

È possibile attivare solo un sistema init alla volta. Il 16.04 è systemd.

Numerosi pacchetti vengono forniti con file per più sistemi Init, quindi possono essere gestiti con più sistemi Init su diversi sistemi operativi. Su Ubuntu, a volte vengono installati gli script per più sistemi init, anche se non sono tutti utilizzati contemporaneamente.

I sistemi init più recenti cercano di mantenere la compatibilità con quelli più vecchi. In particolare, systemd cerca di mantenere la compatibilità con gli script di avvio sia Upstart che SysV.

Nel caso dello script "init.d" che hai citato, si tratta di uno script init "SysV", non di uno script Upstart. Inoltre, gli script di inizializzazione "SysV" verrebbero avviati all'avvio solo se fossero collegati in modo simbolico a una directory come "/etc/rc5.d". Scoprirai che Network Manager non ha un link simbolico installato lì.

Per capire come systemdgestisce i vecchi script di inizializzazione "SysV", vedere In che modo systemd usa gli script /etc/init.d? .

Ora, per rispondere alla domanda sul perché funziona riavviare Network Manager con "riavvio del gestore di rete del servizio". Il servicecomando viene utilizzato sia con gli script Upstart che con gli script SysV init, preferendo il primo. Network Manager ha anche uno script Upstart installato il 16.04 alle /etc/init/network-manager.conf.

Se rivedi l'output di sudo strace service network-manager restart, puoi avere un'idea di cosa sta succedendo. Innanzitutto, l'output mostra che systemctlviene chiamato, indicando che il comando viene reindirizzato a systemd. Innanzitutto, poco dopo l'apertura /usr/bin/service, puoi vederlo iniziare a leggere nel file come uno script di shell:

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

Ora che sappiamo che serviceè uno script di shell, possiamo andare a controllare il codice sorgente di esso. Nel codice sorgente, troviamo che is_systemdviene rilevato e impostato. Per il caso systemd, puoi vedere che il comando viene riscritto per essere systemctl restart network-manager.

Quindi, mentre i tre sistemi init coesistono e hanno una certa compatibilità, ci sono livelli di complessità. Per ridurre al minimo la complessità di ciò che sta accadendo in futuro, è meglio utilizzare i file di unità di sistema e lo systemctlstrumento per gestire i servizi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.