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 snapshot
parece 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.conf
para 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 , enable
y en los servicios correctamente en lugar de realizar un volcado y restauración de lo que se está ejecutando.disable
after
wants
systemd
Ahora que lo saqué de mi sistema...
systemctl snapshot
puede ayudarte a hacer lo que estás buscando.
Cuando se ejecuta systemctl snapshot ${SNAPSHOT_NAME}
systemd
se 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}.snapshot
enumerará toda la información systemd
recopilada 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}
.
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
/ After
al 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.