Я работаю над настройкой сервера 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}
.
Запустить указанный в командной строке модуль и его зависимости и остановить все остальные. Если указано имя модуля без расширения, будет принято расширение ".target".
Это похоже на изменение уровня выполнения в традиционной системе init. Команда isolate немедленно остановит процессы, которые не включены в новом модуле, возможно, включая графическую среду или терминал, которые вы используете в данный момент.
Обратите внимание, что это разрешено только на юнитах, где включен AllowIsolate=. Подробности см. в systemd.unit(5).
Вы даже можете написать службу, которая обновляет разделы ${CUSTOM_TARGET}
Wants
/ After
при завершении работы.
решение2
Я думаю, что вам следует использовать какой-нибудь менеджер конфигурации, например Puppet или Ansible, чтобы сделать это, менеджер конфигурации — лучший способ сохранить вашу систему такой, какой вы хотите ее видеть. Снимки Systemd не сохраняются после перезагрузки.