Пользовательское расположение для “символьной ссылки установки” файла юнита systemd?

Вопрос или проблема

Включение службы 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 (например, при обновлении встроенной системы), вы можете рассмотреть следующие альтернативные пути:

  1. Создание пользовательского скрипта: Можно написать скрипт, который будет восстанавливать или создавать необходимые символические ссылки после обновления файловой системы. Этот скрипт можно добавить в cron или как post-update hook.

  2. Использование внешнего хранилища: Если у вас есть возможность использовать внешнюю файловую систему или USB-накопитель, на который можно сохранять конфигурации и ссылки, вы можете создать механизм, который будет управлять их восстановлением после обновления системы.

  3. Изменение процесса обновления: Если вы контролируете процесс обновления системы, вы можете учесть создание необходимых символических ссылок после завершения обновления.

  4. Запись статуса в базе данных: Вместо работы с символическими ссылками можно хранить статус сервиса в базе данных или конфигурационных файлах на отдельном носителе, который не затрагивается при обновлении.

Заключение

На текущий момент изменения в расположении символических ссылок для системных юнитов в systemd не поддерживаются. Однако, существуют альтернативные подходы, которые могут помочь достичь вашей цели. Стратегическое планирование работы с системными юнитами и обновлением вашей встроенной системы позволит вам справиться с этой задачей более эффективно.

Оцените материал
Добавить комментарий

Капча загружается...