web-dev-qa-db-ja.com

systemdを使用したシステムでのDebconfエラー

インストール中にdebconfを使用してUbuntu16.04でパッケージを構成すると、次の問題が発生しました。

より正確には、パッケージはdebconfを使用して構成ファイルを保存し、その直後にpostinstスクリプトでサービスが開始されます。このサービスはまた、debconfモジュールを使用して、前のステップで保存された構成をロードします。

ただし、systemdで開始されたサービスは、次のエラーで失敗します。

debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable

私が見つけたものから、dpkgはまだdebconfフロントエンドでこのファイルにアクセスしており、別のフロントエンドを開始しようとするとサービスがクラッシュします(環境変数DEBIAN_HAS_FRONTENDは渡されません)サービスへ)。スクリプトで環境変数DEBIAN_HAS_FRONTENDを強制しようとしましたが、他のエラーが表示されます。

dpkgプロセスが終了し、debconfがすでに終了した後、デーモンを強制的に起動する必要があると思います。何かアイデアはありますか?

2
joacomug

まず、スタンドアロンプ​​ログラムでdebconfを使用するのは間違っていると感じます。引用するにはman debconf-devel、セクションその他のスクリプト:

他のスタンドアロンプ​​ログラムでdebconfを使用することもできます。ここで注意すべき問題は、debconfが意図されたものではなく、レジストリとして使用してはならないということです。結局のところ、これはUNIXであり、プログラムは/ etc内のファイルによって構成されており、あいまいなdebconfデータベース(とにかくキャッシュにすぎず、吹き飛ばされる可能性があります)ではありません。したがって、スタンドアロンプ​​ログラムでdebconfを使用する前に、じっくり考えてください。

同じマニュアルページは、前のセクション(POSTINST SCRIPT)の実際の問題にも役立ちます。

Postinstがデーモンを起動する場合は、必ずdebconfに最後にSTOPを指示してください。そうしないと、postinstがいつ実行されるかについてdebconfが少し混乱する可能性があるためです。

つまり、発行db_stopデーモンを起動する前(debconf自体を使用しない場合でも)。

1
Ferenc Wágner

それで、ようやく問題を見つけました。将来誰かに役立つ場合に備えて投稿します。

私が言ったように、私はpostinstスクリプトからサービスを開始しようとしていて、サービスはdebconfigを使用していくつかの構成パラメーターをフェッチしようとしましたが、debconf実行中のインスタンスがすでに1回あったため(すべての構成はconfigではなく、postinstファイルで行われました)。

問題は、debconfを使用していないときに、postinstスクリプトの実行中にアクティブなdebconfフロントエンドがあったことでした。ただし、confmodueをロードする行にコメントしました。

# . /usr/share/debconf/confmodule

どうやら、 dpkg-reconfigure (そして私はdpkgも推測します)ファイルの「confmodule」文字列と一致する場合はconfmoduleがロードされると考えます(configpostinstおよびprerm)。そのため、confmoduleを効果的にロードしていなかったのに、dpkg-reconfigureがフロントエンドを解放していなかったため、サービスは別のdebconfインスタンスを開始できませんでした。解決策は、単にその行を削除することでした。

1
joacomug