私は最終的にdpkgを使って配布するソフトウェアの仕事をしました。 .debパッケージはテスト環境ではうまく機能しますが、準備時には失敗します。どちらも同じバージョンのUbuntuを実行していますが、残りの構成については100%確信できません。このdpkgの問題をさらにデバッグするにはどうすればよいですか?
次のようにインストールが失敗しました。
sudo dpkg -i --debug=7337 package.deb
D000010: ensure_pathname_nonexisting `/var/lib/dpkg/tmp.ci'
(Reading database ... 201812 files and directories currently installed.)
Unpacking myProprietarySoftware (from package.deb) ...
D000001: process_archive oldversionstatus=not installed
D000002: fork/exec /var/lib/dpkg/tmp.ci/preinst ( install )
dpkg: error processing package.deb (--install):
subprocess new pre-installation script returned error exit status 1
D000002: maintainer_script_new nonexistent postrm `/var/lib/dpkg/tmp.ci/postrm'
D000010: ensure_pathname_nonexisting `/var/lib/dpkg/tmp.ci'
D000010: ensure_pathname_nonexisting running rm -rf
D000010: ensure_pathname_nonexisting `/var/lib/dpkg/reassemble.deb'
Errors were encountered while processing:
package.deb
ベストアンサー1
何らかの理由でパッケージの.preinstスクリプトが失敗しました。
理由を確認するには、次のスクリプトを確認してください。/var/lib/dpkg/info/PACKAGENAME.preinst
スクリプトが失敗した行を正確に確認するには、.preinstスクリプトを編集してその行のset -x
直後に追加します。#!
これにより、スクリプトで実行トレースが有効になります。
メモ:これは、.preinstスクリプトがシェルスクリプト(posix shまたはbash)であると仮定します。 ほぼすべて.preinst(および.postinst、.prerm、および.postrm)スクリプトはシェルスクリプトですが、実行可能ファイルである必要はありません。たとえば、9104個のパッケージがインストールされているデフォルトのデスクトップコンピュータでは、14個はPerlスクリプトで、1つはコンパイルされた実行可能ファイル(bashのpreinst - 動作するシェルがインストールされていると仮定できません)、残りはすべてシェルスクリプトです。 ...9041はPOSIXシェルスクリプト、63はbashスクリプトです。 .preinst が Perl や Python などの場合は、その言語でデバッグ、実行追跡モード、または同様のモードを有効にする方法を理解する必要があります。
それからdpkg --configure --pending
。
これにより、dpkgは半分だけインストールされたパッケージを構成しようとします。再インストールしないでくださいdpkg -i
。これにより、編集した.preinstスクリプトが.debパッケージのバージョンで上書きされます。
これにより、問題を解決するのに十分な情報を得ることができます。これは、プログラムの予期しないまたはキャプチャされていない終了コード(ほとんどの.preinstなどのスクリプトに含まれているため、最初のエラーで終了するようにするset -e
)のように、単純またはディレクトリがすでに存在すると仮定している可能性があります(宣言されていないため) 。依存関係)をパッケージのdebian / controlファイルに含めます。つまり、fooに依存する必要がありますが、とにかくfooはインストールされません。
回復後にdpkg --configure --pending
再実行すると、パッケージが正しくインストールされます。
.preinstスクリプトにエラーがある場合は、.postinst(および/または.prermおよび.postrm)スクリプトにもエラーがある可能性があります。問題を解決する必要があるかもしれません。
パッケージ作成者が修正できるようにバグレポートを送信することを忘れないでください。