¿Cómo usa systemd los guiones /etc/init.d?

120

Acabo de cambiar a Debian Jessie, y la mayoría de las cosas funcionan bien, incluido mi administrador de pantalla gráfica wdm.

La cuestión es que no entiendo cómo funciona esto. Obviamente, mi /etc/init.d/wdmscript se llama, porque cuando puse un principio exitallí, wdm no se inicia. Pero cuando alternativamente cambio el nombre del directorio /etc/rc3.d (mi nivel de ejecución predeterminado solía ser 3), entonces wdm todavía se inicia.

No pude descubrir cómo systemd encuentra este script y no entiendo qué hace con todos los otros scripts init.d.

  • ¿Cuándo y cómo ejecuta systemd scripts init.d?
  • A la larga, ¿debo deshacerme de todos los scripts init.d?
Martin Drautzburg
fuente

Respuestas:

166

La respuesta del caos es lo que dice cierta documentación. Pero no es lo que hace systemd en realidad. (Tampoco es lo que hizo Van Smoorenburg rc. La furgoneta Smoorenburgrc definitivamente no ignoró los encabezados LSB, que insservsolían calcular los pedidos estáticos, para empezar.) La documentación de Freedesktop, como esa página de "Incompatibilidades", de hecho es incorrecta, en Estos y otros puntos. (La HOMEvariable de entorno, de hecho, se establece a menudo, por ejemplo. Esto fue totalmente indocumentado en cualquier lugar durante mucho tiempo. Ahora está documentado en el manual, por lo menos, pero esa página WWW Freedesktop todavía no ha sido corregida.)

El formato de servicio nativo para systemd es la unidad de servicio . La gestión de servicios adecuada de systemd opera únicamente en términos de aquellos, que lee de uno de los nueve directorios donde .servicepueden vivir los archivos (de todo el sistema) . /etc/systemd/system, /run/systemd/system, /usr/local/lib/systemd/system, Y /usr/lib/systemd/systemson cuatro de esos directorios.

La compatibilidad con los rcscripts de van Smoorenburg se logra con un programa de conversión, llamado systemd-sysv-generator. Este programa aparece en el /usr/lib/systemd/system-generators/directorio y, por lo tanto, systemd lo ejecuta automáticamente al principio del proceso de arranque en cada arranque, y nuevamente cada vez que se indica a systemd que vuelva a cargar su configuración más adelante.

Este programa es un generador , un tipo de utilidad auxiliar cuyo trabajo es crear archivos de unidades de servicio sobre la marcha, en un tmpfs donde se encuentran tres más de esos nueve directorios (que están destinados a ser utilizados solo por generadores). systemd-sysv-generatorgenera las unidades de servicio que ejecutan los rcscripts de van Smoorenburg /etc/init.d, si no encuentra una unidad de servicio systemd nativa con ese nombre ya existente en las otras seis ubicaciones.

La gestión de servicios systemd solo conoce las unidades de servicio. Estas unidades de servicio (re) generadas automáticamente se escriben para invocar los rcscripts de van Smoorenburg . Tienen, entre otras cosas:

[Unidad]
SourcePath = / etc / init.d / wibble
[Servicio]
ExecStart = / etc / init.d / inicio de wibble
ExecStop = / etc / init.d / wibble stop

La sabiduría recibida es que los rcscripts de van Smoorenburg deben tener un encabezado LSB y ejecutarse en paralelo sin respetar las prioridades impuestas por el /etc/rc?.d/sistema. Esto es incorrecto en todos los puntos.

De hecho, no se necesita tener una LSB cabecera, y si lo hacen, no systemd-sysv-generatorpueden reconocer las cabeceras más limitadas viejos comentario RedHat ( description:, pidfile:y así sucesivamente). Además, en ausencia de un encabezado LSB, recurrirá al contenido de las /etc/rc?.dgranjas de enlaces simbólicos, leerá las prioridades codificadas en los nombres de los enlaces y construirá un pedido antes / después de ellos, serializando los servicios. No solo los encabezados LSB no son un requisito, y no solo codifican ellos mismos antes / después de los pedidos que serializan las cosas hasta cierto punto, sino que el comportamiento alternativo en su ausencia total es una operación significativamente no paralelizada.

La razón por la que /etc/rc3.dno parecía importar es que probablemente tenía ese script habilitado a través de otro /etc/rc?.d/directorio. systemd-sysv-generatortraduce estar listado en cualquiera de /etc/rc2.d/, /etc/rc3.d/y /etc/rc4.d/en una Wanted-Byrelación nativa con systemd's multi-user.target. Los niveles de ejecución son "obsoletos" en el mundo systemd, y puede olvidarse de ellos.

Otras lecturas

JdeBP
fuente
2
En Debian, el directorio de generadores del sistema no vive en / usr / lib, sino en / lib packages.debian.org/sid/amd64/systemd/filelist
Braiam
55
Esta es una respuesta directa y sorprendente. Bien hecho señor.
peelman
1
¡Gracias, gracias, gracias por esto! Tratar con una combinación de sistemas Debian 8 y RH / CentOS 7 ha hecho que la administración de la administración de dependencias de servicio SysVInit vs Systemd sea un poco dolor de cabeza, pero esta explicación de lo que está haciendo systemd me ha ayudado mucho a comprender.
Toby
Este generador funciona. También mencionaría, para los seguidores, que si tiene una versión anterior systemdy un script /etc/init.d no está configurado para "arrancar al inicio", seguirá funcionando como se esperaba pero no aparecerá en el show-unidades listas: unix.stackexchange.com/a/518894/8337
rogerdpack
Este generador funciona. También mencionaría, para los seguidores, que si tiene una versión anterior de systemd y un script /etc/init.d que no está configurado para "arrancar al inicio", aún se iniciará / detendrá como se esperaba usando systemctl pero ganó no aparezca en las listas de unidades de presentación: unix.stackexchange.com/questions/517872/… también NB que básicamente "no puede" controlar estos servicios ejecutando /etc/init.d/xx directamente más o systemd obtiene ... confundido sobre lo que se está ejecutando y lo que no: |
rogerdpack
17

Systemd es compatible con las secuencias de comandos de inicio de SysV. De acuerdo con LSB 3.1, el guión de inicio debe tener Convenciones de comentarios informativos , que definan cuándo el guión debe iniciarse / detenerse y qué se requiere para que el guión se inicie / detenga. Esto es un ejemplo:

### BEGIN INIT INFO
# Provides: my-service
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop service my-service
# Description: my-service blah blah ...
### END INIT INFO

Esta es una sección comentada que SysV ignora. Por otro lado, systemd lee esa información de dependencia y ejecuta esos scripts dependiendo de eso.

Pero hay un punto, donde systemd y SysV difieren en términos de scripts de inicio. SysV ejecuta los scripts en orden secuencial en función de su número en el nombre del archivo. Systemd no lo hace. Si se cumplen las dependencias, systemd ejecuta los scripts de inmediato, sin respetar la numeración de los nombres de los scripts. Algunos de ellos probablemente fallarán debido al pedido. Hay muchas otras incompatibilidades que deben considerarse.


Si hay scripts de inicio y archivos .service para el mismo servicio, systemd ejecutará ambos, tan pronto como se cumplan las dependencias (en el caso del script de inicio, los definidos en el encabezado LSB).

caos
fuente
De acuerdo, pero también tengo un montón de archivos .service en / lib / systemd / system /. ¿Qué ejecuta systemd realmente? ¿Qué se especifica en los archivos de servicio (en orden de dependencia), los scripts init.d o ambos?
Martin Drautzburg
@MartinDrautzburg Agregué eso a la respuesta
caos el
1
Como nota al margen, Debian acaba de anunciar que eliminará la compatibilidad con LSB: article.gmane.org/gmane.linux.debian.devel.lsb/1103
enero
systemd es cualquier cosa PERO compatible con los scripts SysV. No solo esa afirmación es incorrecta, sino que el enlace al que se hace referencia deja en claro que solo es "en su mayoría compatible" y la cantidad de esfuerzo necesaria para producir los mismos resultados es exorbitantemente enorme.
Julie en Austin