Debianパッケージを通じてsystemdファイルを条件付きで有効にする


8

サービスをインストールするdebパッケージを作成しました。

私たちの組み込みデバイスでは、このパッケージでサービスを自動的に有効にしたいと思います。開発者のワークステーションでは、systemctl start foo手動で開発者に作業を依頼します(サービスが重いため、デスクトップ環境で常に実行していると、リソースを消費するだけです)。

apt-getステップ中にユーザーに決定を促すにはどうすればよいですか?それが最善の解決策ですか?

注、私が使用してパッケージを作成したdh_makedebhelperし、それを有効に:

%:
    dh $@ --with=systemd

override_dh_systemd_enable:
    dh_systemd_enable --name=foo foo.service

回答:


11

systemdプリセットを使用して、systemdサービスがインストール時にデフォルトで有効または無効になるかどうかに影響を与えることができます。

Debianプリセットでは、インストール時にすべてのサービスがデフォルトで有効になります。したがって/etc/systemd/system-preset/80-foo.preset、次の行を含むなどのファイルを送信することで、開発ワークステーションにプリセットを送信するだけで済みます(デフォルトの動作は、本番環境で実行したいことと一致します)。言う

disable foo.service

Puppet、Chef、Ansibleなどのシステムを使用して開発ワークステーションを管理している場合は、それらを使用してそのようなsystemdプリセット構成を出荷できます。これにより、開発ワークステーションのみにポリシーを適用し、本番環境に適用するのは簡単になります。マシン。

.debパッケージはsystemctl presetコマンドを使用してサービスを有効にする必要があります。このコマンドは事前設定された構成を尊重するためです。

@JdeBP@sourcejedi(のようなDEB-ヘルパーでアウトポイント、Debianはマクロdh_systemd_enableすでに、彼らが呼び出すことを行う)deb-systemd-helperを使用しますこれはsystemctl preset()削除(ただし、パージを行う場合という小さな注意点がデフォルトでパッケージを、そして後でそれを再インストールし、それはあなたがプリセットファイルを削除した場合でも、サービスを有効にしません)を参照してください。このコメントをdeb-systemd-helperenable操作

    # We use 'systemctl preset' on the initial installation only.
    # On upgrade, we manually add the missing symlinks only if the
    # service already has some links installed. Using 'systemctl
    # preset' allows administrators and downstreams to alter the
    # enable policy using systemd-native tools.

プリセットのsystemd機能の詳細については、systemdプリセットsystemctl presetそれを実装するコマンドのmanページを参照してください。


1
これはまさに私が必要としたものです。私はメタパッケージを介して開発環境をデプロイしているので、これらの*.presetファイルをそのパッケージの一部としてインストールできます。
スチュワート

4
知っておくべき重要な癖はdeb-systemd-helper、パッケージが初めてインストールされたときにのみプリセットが参照されるということです。その後、パッケージが削除されるまで、Debianツールによって維持されている並列データベースが代わりに参照されます。 news.ycombinator.com/item?id=18320131
JdeBP

1
だから、deb-systemd-helperプリセットを使用して表示されます。そして、これは.debパッケージ内の手動のsystemctl presetコマンドを必要とせずに機能するはずです。Debian固有の癖は、パッケージを削除(ただしパージしない)するとどうなるかです。後でパッケージを再インストールすると、プリセットファイルを削除してもサービスは有効になりません。salsa.debian.org/debian/init-system-helpers/blob/debian/1.56/...
sourcejedi

@sourcejediコメントとdeb-systemd-helperコメントへのリンクを回答に組み込みました。ありがとう!
filbranden 2018年

5

インストール中にユーザーにプロンプ​​トを表示する場合は、を使用する必要がありますdebconf。これには、Debianポリシーが関連するコンテキストでなくても、多くの利点があります。これは、さまざまなフロントエンドをサポートし、一貫したエンドユーザーエクスペリエンスを提供します。さまざまな「レベル」をサポートしています。プレシードをサポートしています。事前シードとは、パッケージを事前に構成できることを意味します。その場合、プロンプトはまったく表示されません。レベルが異なるということは、特定の状況でのみ表示されるようにプロンプ​​トを設定できることを意味します。次に、デフォルトで(組み込みターゲットの場合)プロンプトを表示せずにパッケージをインストールし、パッケージをインストールするときにフロントエンドを適切に設定してプロンプトが表示されるように開発者に指示できます。

ただし、できるだけプロンプトを出さない方がよいと思います。これは、エンドユーザーの設定を処理する他の方法があり、ユーザー設定の処理がメンテナースクリプトを複雑にするサービスに特に当てはまります(パッケージで生成されたスクリプトを参照してください。これらは、以下を使用して、いくつかの微妙な問題に対処していdeb-systemd-helperます。あなたの好みの処理を上にして、すべてを複製する必要があります)。

開発者がサービスを実行する必要がない場合は、パッケージをインストールする前にサービスをマスクでき、サービスが有効になることはありません。

sudo systemctl mask foo

開発者がsystemdユニットを使用してサービスを実行する必要がある場合は、パッケージを初めてインストールした後でサービスを無効にすることができ、その後のインストールではこれが記憶されます。

sudo apt install foo
sudo systemctl disable --now foo

デフォルトでは、サービスが有効になります。


いい答えです。 debconfは私が考えていたもののように見えますが、可能な場合はプロンプトを出さないことが最善であることに同意します。については知っていましたsystemctl disableが、ユーザーがインストール中に「ステップをスキップする」のを回避できるようにしようとしていました。*.presetsFilippeによって提案されたソリューションは、これを解決します。
スチュワート

確かに、プリセットは法案にぴったりです!
Stephen Kitt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.