Создание .deb с сервисом systemd, но без скриптов инициализации SysV

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

Я пытаюсь добавить файл службы systemd в существующий пакет Debian. Я следовал указаниям https://wiki.debian.org/Teams/pkg-systemd/Packaging, поэтому я создал debian/packagename.service. Поскольку моя версия debhelper — 9.x, я также:

  • добавил dh-systemd в Build-Depends в debian/control
  • добавил --with systemd в команду dh в debian/rules.

Теперь, когда я пересобираю пакет с помощью debuild -i -us -uc -b, он завершает работу с ошибкой с таким выводом:

Now running lintian...
[...]
W: packagename: init.d-script-not-marked-as-conffile etc/init.d/packagename
E: packagename: init.d-script-not-included-in-package etc/init.d/packagename

Похоже, что скрипт сборки ожидает наличия скрипта init.d, если есть файл .service. И действительно, сгенерированный DEBIAN/postinst включает этот раздел:

# Автоматически добавлено dh_installinit
if [ -x "/etc/init.d/infinoted" ]; then
        update-rc.d infinoted defaults >/dev/null
        invoke-rc.d infinoted start || exit $?
fi
# Конец автоматически добавленного раздела

Ожидаемое ли это поведение? Должен ли я всегда включать скрипты инициализации SysV, когда включаю файл .service? Если нет, какой рекомендованный способ избежать генерации этого раздела?

Моя система — Debian Jessie.

Переопределение dh_installinit сработало для меня. Я просто добавил это в debian/rules:

override_dh_installinit:
        true

Система все равно устанавливает unit systemd, и все работает как надо.

Но я все еще не знаю, является ли это ожидаемым поведением или ошибкой. Обратите внимание, что я не тестировал это на Debian Stretch или Sid, только на Jessie.

Ответ или решение

Создание .deb пакета с systemd-сервисом, но без скриптов SysV init, может вызывать некоторые сложности, особенно учитывая использование debhelper версии 9.x на Debian Jessie.

Проблема

Вы настроили ваш Debian пакет так, чтобы он включал файл сервиса systemd, добавив debian/packagename.service, и обновили debian/control и debian/rules соответствующим образом. Несмотря на это, при сборке пакета с помощью debuild -i -us -uc -b, сборка завершается с ошибкой, связанной с отсутствием init.d скрипта. В частности, ошибки lintian указывают на то, что ожидается скрипт init.d, даже если он не включен в пакет.

Вероятная причина

Это связано с тем, что версия debhelper, используемая вами, по умолчанию предполагает наличие скриптов init.d при добавлении systemd сервиса. Такой подход обусловлен необходимостью поддержания совместимости на более старых системах, где systemd мог быть не единственной системой инициализации.

Решение

Для устранения данной проблемы вы можете воспользоваться следующим подходом:

  1. Переопределение dh_installinit:
    Вы уже нашли решение, переопределив dh_installinit в файле debian/rules следующим образом:

    override_dh_installinit:
       true

    Этот подход позволяет избежать автоматической генерации скриптов для init.d в устанавливаемом пакете.

  2. Убедитесь, что это устраивает ваши требования:
    Важно проверить, что после этого изменения ваш systemd-сервис работает как ожидалось и требуется. Проверьте также, что зависимости между сервисами корректно разрешаются на уровне systemd.

Будущее развития и рекомендации

Скорее всего, такая ситуация была специфичной для Jessie; однако, стоит иметь в виду, что в более поздних версиях Debian, таких как Stretch или Sid, использование systemd стало стандартом, и такие проблемы могут не вызывать подобного поведения.

Переход на более современные версии debhelper будет полезен, так как поддержка старых систем инициализации постепенно уходит в прошлое. Изучите возможность обновления до debhelper версии 10 или выше, где взаимодействие с systemd более оптимизировано.

Заключение

Следуя описанным выше шагам, вы сможете успешно создавать .deb пакеты с systemd-сервисами без необходимости включения скриптов init.d, что существенно упрощает процесс управления сервисами в современном Linux-окружении.

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

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