Debianパッケージでサードパーティのシステムサービスを起動する方法

Debianパッケージでサードパーティのシステムサービスを起動する方法

systemd-networkdたとえば、インターフェイスIPを設定する設定を含むDebianパッケージがあります。

systemd-networkdこれはランタイムにのみ意味があります。

だから、サービスがアクティブで実行されていることを確認したいと思います。しかし、postinstに入れるのは間違っているようです。

systemctl enable systemd-networkd
systemctl start systemd-networkd

この問題を解決する正しい方法は何ですか?

ベストアンサー1

通常、パッケージが配布するサービス内でそれを使用することに問題はありませんsystemctl enablepostinstDebian パッケージの多くは、ベンダーのdeb-systemd-helperデフォルト値を尊重し、サービスを明示的に無効にしたりブロックしたりするなど、詳細を処理します。

systemd-networkd.servicesystemd自己配布されます。を確認すると、それを管理するために使用される単位を表示systemd.postinstできます。systemdsystemctl

$ dpkg -S /lib/systemd/system/systemd-networkd.service
systemd: /lib/systemd/system/systemd-networkd.service

$ grep systemd-networkd.service -C3 /var/lib/dpkg/info/systemd.postinst
if [ -n "$2" ]; then
    _systemctl daemon-reexec || true
    ...
    _systemctl try-restart systemd-networkd.service || true
    _systemctl try-restart systemd-journald.service || true
fi

ただし、他のパッケージが所有するサービスを有効にすることは一般的ではありません。 代わりに、単位関係の使用を検討してください。

パッケージが独自のシステムユニットを展開する場合(このネットワーク構成に応じて)、[Unit]セクションに以下を追加するだけです。

[Unit]
Requires=systemd-networkd.service
After=systemd-networkd.service

これにより、起動時にデバイスが起動します。起動に失敗した場合、systemd-networkd.serviceデバイスは起動しません。systemd-networkd.service

パッケージにユニットがない場合は、単にこれを行うターゲットを作成することを検討してください。

# /lib/systemd/system/mypackage.target
[Unit]
Description=MyPackage unit dependency management
Requires=systemd-networkd.service
After=systemd-networkd.service

[Install]
WantedBy=multi-user.target

その後、管理者スクリプトはそれを管理します。

# postinst
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
        deb-systemd-helper unmask 'mypackage.target' >/dev/null || true

        if deb-systemd-helper --quiet was-enabled 'mypackage.target'; then
                deb-systemd-helper enable 'mypackage.target' >/dev/null || true
        else
                deb-systemd-helper update-state 'mypackage.target' >/dev/null || true
        fi
fi
# prerm
if [ "$1" = remove ] ; then
        deb-systemd-invoke stop 'mypackage.target' >/dev/null || true
fi
# postrm
if [ "$1" = remove ] ; then
        systemctl --system daemon-reload >/dev/null || true
fi
if [ "$1" = "purge" ]; then
        deb-systemd-helper purge 'mypackage.target' >/dev/null || true
fi

debhelper を使用してdebian/rulesパッケージを作成する場合は、次のように使用することを検討してください。dh_installsystemdこれにより、管理者スクリプトのプレースホルダ@DEBHELPER@に自動的に追加されます。

おすすめ記事