Вопрос или проблема
Включение службы systemd для автозагрузки выполняется с помощью включения
её.
Включение создаёт символьную ссылку в определённом месте.
Пример:
$ systemctl enable rsyslog
Создана символьная ссылка /etc/systemd/system/multi-user.target.wants/rsyslog.service → /lib/systemd/system/rsyslog.service.
Документация для systemctl enable
утверждает:
Обратите внимание, что эта операция создаёт только символьные ссылки, указанные в секции “[Install]” файлов единиц.
Я хотел бы изменить расположение, в котором создаются (и проверяются) эти символьные ссылки для конкретной службы.
Возможно ли настроить это расположение на что-то другое?
Как только изменение, о котором я спрашиваю, будет реализовано, поведение будет следующим:
$ systemctl enable rsyslog
Создана символьная ссылка /user/home/multi-user.target.wants/rsyslog.service → /lib/systemd/system/rsyslog.service.
Сценарий, из которого originates этот вопрос, заключается в том, чтобы статус службы (включена/выключена) сохранялся после полного переписывания rootfs (обновление встроенной системы), имея ссылки на отдельном разделе.
Нет. Путь поиска для файлов единиц документирован в man systemd.unit.
Для пользовательских единиц вы можете настроить $XDG_RUNTIME_DIR, но для системных единиц пути фиксированы.
Ответ или решение
Возможность изменения расположения символической ссылки для системного юнита в systemd
Вопрос о возможности изменения расположения символической ссылки, создаваемой при включении системного сервиса с помощью systemctl enable
, требует детального рассмотрения структуры работы systemd и его управления юнитами.
Как работает команда systemctl enable
Когда вы запускаете команду systemctl enable <service>
, systemd создает символическую ссылку на файл юнита в директории, которая зависит от конфигурации юнита, в частности, секции [Install]
. Например, для сервиса rsyslog
команда:
$ systemctl enable rsyslog
сгенерирует символическую ссылку в директории /etc/systemd/system/multi-user.target.wants/
, указывающую на файл юнита, расположенный в /lib/systemd/system/rsyslog.service
.
Изменение расположения ссылок
К сожалению, возможность изменения расположения, где создаются символические ссылки для юнитов, отсутствует в стандартной конфигурации systemd для системных юнитов. В документации, доступной в man systemd.unit
, четко указано, что пути, используемые для системных юнитов, являются фиксированными.
Для пользовательских юнитов можно изменить значение переменной окружения $XDG_RUNTIME_DIR
, но для системных юнитов такая гибкость не предусмотрена.
Альтернативные решения
Если ваша цель — сохранить статус сервиса (включен/выключен) даже после перезаписи файловой системы root (например, при обновлении встроенной системы), вы можете рассмотреть следующие альтернативные пути:
-
Создание пользовательского скрипта: Можно написать скрипт, который будет восстанавливать или создавать необходимые символические ссылки после обновления файловой системы. Этот скрипт можно добавить в cron или как post-update hook.
-
Использование внешнего хранилища: Если у вас есть возможность использовать внешнюю файловую систему или USB-накопитель, на который можно сохранять конфигурации и ссылки, вы можете создать механизм, который будет управлять их восстановлением после обновления системы.
-
Изменение процесса обновления: Если вы контролируете процесс обновления системы, вы можете учесть создание необходимых символических ссылок после завершения обновления.
-
Запись статуса в базе данных: Вместо работы с символическими ссылками можно хранить статус сервиса в базе данных или конфигурационных файлах на отдельном носителе, который не затрагивается при обновлении.
Заключение
На текущий момент изменения в расположении символических ссылок для системных юнитов в systemd не поддерживаются. Однако, существуют альтернативные подходы, которые могут помочь достичь вашей цели. Стратегическое планирование работы с системными юнитами и обновлением вашей встроенной системы позволит вам справиться с этой задачей более эффективно.