¿Puede systemd conservar su estado tras los reinicios?

¿Puede systemd conservar su estado tras los reinicios?

Estoy trabajando en la configuración de un servidor Linux que tendrá docenas de demonios controlados por systemd. Los demonios se agrupan en objetivos para que puedan activarse o desactivarse en grupos, pero los administradores del sistema pueden controlar manualmente los servicios individuales. Estoy buscando una manera de preservar el estado (qué servicios están activados) mediante un reinicio. La idea es que las personas que depuran, prueban y desarrollan en el servidor puedan reiniciarlo si es necesario y hacer que el sistema vuelva a tener la misma configuración que tenía antes del reinicio.

La funcionalidad de systemd snapshotparece ideal para esto, pero hasta donde sé, no se puede escribir una instantánea en el disco para usarla más adelante.

Mi plan inicial era crear un enlace simbólico multi-user.target.wants/a un servicio llamado bootingup.service. Cada objetivo que active el administrador del sistema se reescribirá bootingup.service.d/bootingup.confpara iniciar el objetivo que acaba de activarse. Esto significaría que al arrancar el sistema activaría el objetivo lanzado más recientemente, pero no recordaría ningún servicio que se haya activado/desactivado individualmente.

¿Hay alguna manera de hacer que systemd recuerde el estado de todos los servicios durante el reinicio?

Respuesta1

Voy a comenzar esta respuesta con:

Le recomiendo que obligue a los desarrolladores a usar elementos como , enabley en los servicios correctamente en lugar de realizar un volcado y restauración de lo que se está ejecutando.disableafterwantssystemd

Ahora que lo saqué de mi sistema...


systemctl snapshotpuede ayudarte a hacer lo que estás buscando.

Cuando se ejecuta systemctl snapshot ${SNAPSHOT_NAME} systemdse crea una unidad llamada ${SNAPSHOT_NAME}.snapshot. Esta unidad parece existir sólo en la memoria. Sin embargo, aún puedes consultarlo usando systemctl.

El uso systemctl show ${SNAPSHOT_NAME}.snapshotenumerará toda la información systemdrecopilada para la instantánea, de particular interés para usted serían las secciones Wants=/ After=(que parecen ser iguales) que enumeran todas las unidades que estaban activas en el momento de la instantánea. Si analizara esa lista y la incluyera en un objetivo personalizado, podría lograr lo que está buscando usando systemctl isolate ${CUSTOM_TARGET}.

aislar systemctl

Inicie la unidad especificada en la línea de comando y sus dependencias y detenga todas las demás. Si se proporciona un nombre de unidad sin extensión, se asumirá una extensión de ".target".

Esto es similar a cambiar el nivel de ejecución en un sistema de inicio tradicional. El comando de aislamiento detendrá inmediatamente los procesos que no estén habilitados en la nueva unidad, posiblemente incluido el entorno gráfico o la terminal que esté utilizando actualmente.

Tenga en cuenta que esto solo se permite en unidades donde AllowIsolate= está habilitado. Consulte systemd.unit(5) para obtener más detalles.

Incluso podría escribir un servicio que actualice las secciones ${CUSTOM_TARGET} Wants/ Afteral apagar.

Respuesta2

Creo que deberías usar algún administrador de configuración como Puppet o Ansible para hacer esto, el administrador de configuraciones es la mejor manera de mantener tu sistema como lo deseas. Las instantáneas de Systemd no persisten durante el reinicio.

información relacionada