Может ли systemd сохранять свое состояние после перезагрузки?

Может ли systemd сохранять свое состояние после перезагрузки?

Я работаю над настройкой сервера Linux, на котором будут десятки демонов, контролируемых systemd. Демоны сгруппированы в цели, так что их можно запускать и останавливать группами, но системные администраторы могут вручную управлять отдельными службами. Я ищу способ сохранить состояние (какие службы активированы) с помощью перезагрузки. Идея заключается в том, что люди, занимающиеся отладкой, тестированием и разработкой на сервере, могут перезагрузить его при необходимости и заставить систему загрузиться в той же конфигурации, что и до перезагрузки.

Функциональность systemd snapshotкажется идеальной для этого, но, насколько я могу судить, вы не сможете записать снимок на диск для использования в дальнейшем.

Мой первоначальный план состоял в том, чтобы создать символическую ссылку на multi-user.target.wants/службу под названием bootingup.service. Каждая цель, которую активирует системный администратор, затем будет перезаписываться bootingup.service.d/bootingup.confдля запуска только что активированной цели. Это означало бы, что при загрузке система активировала бы самую последнюю запущенную цель, но не запоминала бы ни одной службы, которые были бы индивидуально активированы/деактивированы.

Есть ли способ заставить systemd запомнить состояние всех служб после перезагрузки?

решение1

Я начну свой ответ так:

Я рекомендую вам заставить разработчиков правильно использовать такие вещи enable, как disable, afterи wantsв systemdслужбах, а не делать дамп и восстановление того, что работает.

Теперь, когда я выбросил это из головы...


systemctl snapshotможет помочь вам сделать то, что вы ищете.

При запуске systemctl snapshot ${SNAPSHOT_NAME} systemdсоздается блок с именем ${SNAPSHOT_NAME}.snapshot. Этот блок, похоже, существует только в памяти. Однако вы все равно можете запросить его с помощью systemctl.

Использование systemctl show ${SNAPSHOT_NAME}.snapshotвыведет список всей информации, systemdсобранной для снимка, особое внимание следует обратить на разделы Wants=/ After=(которые, похоже, одинаковы), в которых перечислены все активные на момент снимка единицы. Если бы вы проанализировали этот список и поместили его в пользовательскую цель, вы могли бы добиться того, что ищете, используя systemctl isolate ${CUSTOM_TARGET}.

изолировать systemctl

Запустить указанный в командной строке модуль и его зависимости и остановить все остальные. Если указано имя модуля без расширения, будет принято расширение ".target".

Это похоже на изменение уровня выполнения в традиционной системе init. Команда isolate немедленно остановит процессы, которые не включены в новом модуле, возможно, включая графическую среду или терминал, которые вы используете в данный момент.

Обратите внимание, что это разрешено только на юнитах, где включен AllowIsolate=. Подробности см. в systemd.unit(5).

Вы даже можете написать службу, которая обновляет разделы ${CUSTOM_TARGET} Wants/ Afterпри завершении работы.

решение2

Я думаю, что вам следует использовать какой-нибудь менеджер конфигурации, например Puppet или Ansible, чтобы сделать это, менеджер конфигурации — лучший способ сохранить вашу систему такой, какой вы хотите ее видеть. Снимки Systemd не сохраняются после перезагрузки.

Связанный контент