dpkg:新しいプレインストールスクリプトはエラー終了ステータス1を返します。

dpkg:新しいプレインストールスクリプトはエラー終了ステータス1を返します。

私は最終的に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"

源泉:http://ubuntuforums.org/showthread.php?t=636724

関連情報