¿Cómo empaquetar un servicio systemd?

12

Estoy tratando de empaquetar una aplicación mono para que se ejecute como un servicio systemd.

He seguido las instrucciones aquí: https://wiki.debian.org/Teams/pkg-systemd/Packaging

Agregué dh-systemd (> = 1.5) a mi compilación del archivo de control de Debian.

He agregado --with = systemd a mi archivo de reglas de la siguiente manera:

%:
    dh $@ --with=cli --with=systemd

Agregué mi archivo de servicio a mi carpeta de debian llamada mypackage.service con los siguientes contenidos:

[Unit]
Description=My Service Description
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/mono /usr/lib/mypackage/myservice.exe

[Install]
WantedBy=multi-user.target

Sin embargo, la construcción ofrece las siguientes advertencias y errores de lintian:

Now running lintian...
E: mypackage: postrm-does-not-call-updaterc.d-for-init.d-script     etc/init.d/mypackage
W: mypackage: init.d-script-not-marked-as-conffile etc/init.d/mypackage
E: mypackage: init.d-script-not-included-in-package etc/init.d/mypackage

Esto me confunde por varias razones

  1. Estas advertencias son sobre init.d, que es el sistema antiguo que se reemplaza por systemd, ¿son estos errores y advertencias incorrectos, debuild cree que estoy usando init.d porque configuré mi paquete incorrectamente?
  2. Tenía la impresión de que --with = systemd crearía estos scripts para mí.

Actualizar

El archivo postrm generado es el siguiente:

#!/bin/sh
set -e
# Automatically added by dh_systemd_start
if [ -d /run/systemd/system ]; then
    systemctl --system daemon-reload >/dev/null || true
fi
# End automatically added section
# Automatically added by dh_systemd_enable
if [ "$1" = "remove" ]; then
    if [ -x "/usr/bin/deb-systemd-helper" ]; then
        deb-systemd-helper mask mypackage.service >/dev/null
    fi
fi

if [ "$1" = "purge" ]; then
     if [ -x "/usr/bin/deb-systemd-helper" ]; then
        deb-systemd-helper purge mypackage.service >/dev/null
        deb-systemd-helper unmask mypackage.service >/dev/null
    fi
fi
# End automatically added section

El archivo prerm generado es el siguiente:

#!/bin/sh
set -e
# Automatically added by dh_systemd_start
if [ -d /run/systemd/system ]; then
    deb-systemd-invoke stop mypackage.service >/dev/null
fi
# End automatically added section
# Automatically added by dh_installinit
if [ -x "/etc/init.d/mypackage" ] || [ -e "/etc/init/mypackage.conf" ]; then
    invoke-rc.d mypackage stop || exit $?
fi
# End automatically added section

El paquete realmente se instala bien y el servicio se inicia correctamente. Los errores de lintian son preocupantes, y me gustaría llegar al fondo de ellos.

vagabundo
fuente
¿Qué contiene tu postrmscript? ¿Tiene la caldera Debhelper?
muru
¿Dónde está? ¿Qué es? las instrucciones no dicen crear uno, y el ejemplo vinculado no tiene uno. Entonces, o bien es autogenerado por dh-systemd o no existe
trampster
2
Consulte debian.org/doc/debian-policy/ch-maintainerscripts.html y wiki.debian.org/MaintainerScripts . Si no sabe cuáles son, debhelper (aka dh) debería estar generando los apropiados. Ejecutar dpkg-deb --controlen el archivo deb generados, y la mirada en el recién creado DEBIANdirectorio para postinst, postrmarchivos.
muru
OK hará que las instrucciones digan "Después de la reconstrucción, su paquete tendrá código adicional en los scripts de mantenimiento postinst, prerm y postrm". dado que estos se generan automáticamente, tengo pocas posibilidades de rellenarlos.
Trampster
Pregunta actualizada con scripts generados postrm y prerm
trampster

Respuestas:

5

Me encontré con este problema también. Esto es lo que se me ocurrió:

Deberá anular dh_installinit y dh_systemd_start, este es un ejemplo de mi servicio de puente de red:

#!/usr/bin/make -f

PKGDIR=debian/tmp

%:
    dh $@ --with systemd

override_dh_installinit:
    dh_systemd_enable -popenstack --name=openstack openstack.service
    dh_installinit -popenstack --no-start --noscripts
    dh_systemd_start -popenstack --no-restart-on-upgrade

override_dh_systemd_start:
    echo "Not running dh_systemd_start"

La fuente completa de mi paquete se puede encontrar aquí: https://github.com/Ubuntu-Solutions-Engineering/openstack-deb/tree/master/debian

También usé https://github.com/lxc/lxd-pkg-ubuntu/blob/dpm-xenial/debian/rules como referencia.

Espero que esto te ayude, ya que me tomó un poco de tiempo resolver esto.

Battlemidget
fuente
4

Cuando no incluya los scripts de inicio SysV o Upstart, indique dh_installinitque no modifique los scripts postinst/ postrm/ prerm. dh_systemdlo manejaré.

override_dh_installinit:
    dh_installinit --noscripts

Esto se aplica al debhelpernivel de compatibilidad <10 y con 10 aunque dh_systemdse haya fusionado debhelper.

De acuerdo con https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=800043 debhelper nivel de compatibilidad 11> = esto tendrá esto solucionado.

Lucas
fuente