Вопрос или проблема
Я пытаюсь добавить файл службы 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 мог быть не единственной системой инициализации.
Решение
Для устранения данной проблемы вы можете воспользоваться следующим подходом:
-
Переопределение dh_installinit:
Вы уже нашли решение, переопределивdh_installinit
в файлеdebian/rules
следующим образом:override_dh_installinit: true
Этот подход позволяет избежать автоматической генерации скриптов для init.d в устанавливаемом пакете.
-
Убедитесь, что это устраивает ваши требования:
Важно проверить, что после этого изменения ваш systemd-сервис работает как ожидалось и требуется. Проверьте также, что зависимости между сервисами корректно разрешаются на уровне systemd.
Будущее развития и рекомендации
Скорее всего, такая ситуация была специфичной для Jessie; однако, стоит иметь в виду, что в более поздних версиях Debian, таких как Stretch или Sid, использование systemd стало стандартом, и такие проблемы могут не вызывать подобного поведения.
Переход на более современные версии debhelper будет полезен, так как поддержка старых систем инициализации постепенно уходит в прошлое. Изучите возможность обновления до debhelper версии 10 или выше, где взаимодействие с systemd более оптимизировано.
Заключение
Следуя описанным выше шагам, вы сможете успешно создавать .deb пакеты с systemd-сервисами без необходимости включения скриптов init.d, что существенно упрощает процесс управления сервисами в современном Linux-окружении.