
私は最終的に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)スクリプトにもエラーがある可能性があります。問題を解決する必要があるかもしれません。
パッケージ作成者が修正できるようにバグレポートを送信することを忘れないでください。
答え2
パッケージ化されたソフトウェアには失敗した「preinst」が含まれています。これは.debファイルに含まれるシェルスクリプトです。以下を使用して抽出できます。
dpkg-deb -e some-deb.deb out-dir
その後、これを調べて、out-dir/preinst
失敗した理由を特定できるかどうかを確認できます。
スクリプトを修正して再構築するには.deb
(デバッグコードを追加することもできます)、次のことを試してください。
dpkg-deb -x some-deb.deb another-out-dir
dpkg-deb -e some-deb.deb another-out-dir/DEBIAN
(modify another-out-dir/DEBIAN/preinst)
dpkg-deb -b another-out-dir some-deb2.deb
答え3
ファイルを解凍し、preinst
スクリプトがcodeで終了する理由を確認する必要があります1
。
これを行う方法に関連するUNIX.SEについての議論があるかどうかはわかりませんが、見てみましょう。この問題AskUbuntuから抽出する方法を学びます。
その後、preinst
スクリプトを手動で実行して、パッケージのインストールが失敗した理由を確認する必要があります。
答え4
パッケージを直接編集するには:
#!/bin/bash
if [[ -z "$1" ]]; then
echo "Syntax: $0 debfile"
exit 1
fi
DEBFILE="$1"
TMPDIR=`mktemp -d /tmp/deb.XXXXXXXXXX` || exit 1
OUTPUT=`basename "$DEBFILE" .deb`.modfied.deb
if [[ -e "$OUTPUT" ]]; then
echo "$OUTPUT exists."
rm -r "$TMPDIR"
exit 1
fi
dpkg-deb -x "$DEBFILE" "$TMPDIR"
dpkg-deb --control "$DEBFILE" "$TMPDIR"/DEBIAN
if [[ ! -e "$TMPDIR"/DEBIAN/control ]]; then
echo DEBIAN/control not found.
rm -r "$TMPDIR"
exit 1
fi
CONTROL="$TMPDIR"/DEBIAN/control
MOD=`stat -c "%y" "$CONTROL"`
vi "$CONTROL"
if [[ "$MOD" == `stat -c "%y" "$CONTROL"` ]]; then
echo Not modfied.
else
echo Building new deb...
dpkg -b "$TMPDIR" "$OUTPUT"
fi
rm -r "$TMPDIR"