it-swarm-es.tech

¿Cómo empaquetar un servicio systemd?

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

He agregado 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 [email protected] --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 se refieren a 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é mal mi paquete?
  2. Tenía la impresión de que --with = systemd crearía estos scripts para mí.

Actualización

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.

9
trampster

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

Querrá 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 [email protected] --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.

5
battlemidget

Cuando no incluya los scripts de inicio SysV o Upstart, indique a dh_installinit que no modifique los scripts postinst/postrm/prerm. dh_systemd lo manejará.

override_dh_installinit:
    dh_installinit --noscripts

Esto se aplica a debhelper nivel de compatibilidad <10 y con 10 aunque dh_systemd se haya fusionado en debhelper.

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

3
Lucas