systemd-networkd
たとえば、インターフェイスIPを設定する設定を含むDebianパッケージがあります。
systemd-networkd
これはランタイムにのみ意味があります。
だから、サービスがアクティブで実行されていることを確認したいと思います。しかし、postinstに入れるのは間違っているようです。
systemctl enable systemd-networkd
systemctl start systemd-networkd
この問題を解決する正しい方法は何ですか?
答え1
通常、パッケージが配布するサービス内でそれを使用することに問題はありませんsystemctl enable
。postinst
Debian パッケージの多くは、ベンダーのdeb-systemd-helper
デフォルト値を尊重し、サービスを明示的に無効にしたりブロックしたりするなど、詳細を処理します。
systemd-networkd.service
systemd
自己配布されます。を確認すると、それを管理するために使用される単位を表示systemd.postinst
できます。systemd
systemctl
$ 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@
に自動的に追加されます。