Coexistencia de sysV, Upstart y systemd init script

15

En mi sistema (16.04), están los archivos /lib/systemd/system/network-manager.servicey /etc/init.d/network-manager, por ejemplo.

No entiendo cómo (y por qué) esto funciona. Siempre reinicio Network Manager por sudo service network-manager restart. ¿No debería este sistema desordenado de alguna manera? Todavía parece funcionar.

¿Por qué service --status-allenumera todo tipo de servicios? ¿No debería 16.04 usar systemd en lugar de Upstart?

Alguien por favor explique cómo funciona esta convivencia.

user2061057
fuente

Respuestas:

17

Solo un sistema init puede estar activo a la vez. El 16.04, eso es systemd.

Varios paquetes se envían con archivos para múltiples sistemas de inicio, por lo que se pueden administrar con múltiples sistemas de inicio en diferentes sistemas operativos. En Ubuntu, a veces se instalan scripts para múltiples sistemas de inicio, a pesar de que no todos se usan al mismo tiempo.

Los sistemas init más nuevos intentan mantener la compatibilidad con los más antiguos. En particular, systemd intenta mantener la compatibilidad con los scripts de inicio Upstart y SysV.

En el caso de la secuencia de comandos "init.d" que mencionó, esa es una secuencia de comandos de inicio "SysV", no una secuencia de comandos Upstart. Además, los scripts de inicio "SysV" solo se iniciarían en el arranque si se vincularan a un directorio como "/etc/rc5.d". Encontrará que Network Manager no tiene un enlace simbólico instalado allí.

Para comprender cómo systemdgestiona los scripts de inicio "SysV" antiguos, consulte ¿Cómo usa systemd /etc/init.d scirpts?.

Ahora, para responder a la pregunta sobre por qué funciona reiniciar Network Manager con "service network-manager restart". El servicecomando se usa tanto con los scripts de Upstart como con los scripts de inicio de SysV, prefiriendo el primero. Network Manager también tiene un script Upstart instalado en 16.04 en /etc/init/network-manager.conf.

Si revisa la salida de sudo strace service network-manager restart, puede tener una idea de lo que está sucediendo. Primero, el resultado muestra que systemctlse está llamando, lo que indica que el comando se está redirigiendo a systemd. Primero, poco después de que se abre /usr/bin/service, puede ver que comienza a leerse en el archivo como un script de shell:

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

Ahora que sabemos que servicees un script de shell, podemos ver el código fuente del mismo. En el código fuente, encontramos que is_systemdse detecta y establece. Para el caso systemd, puede ver que el comando se reescribe para sersystemctl restart network-manager .

Entonces, si bien los tres sistemas init coexisten y tienen cierta compatibilidad, hay capas de complejidad. Para minimizar la complejidad de lo que sucede en el futuro, es mejor usar los archivos de unidad systemd y la systemctlherramienta para administrar los servicios.

Mark Stosberg
fuente