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


9

結局、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

この質問は、apt-getがその下でdpkgを呼び出しているため、apt-getの使用中にこのエラーが発生した場合にも役立ちます。おそらく、/ var / cache / apt / archivesの下にある.debパッケージの出力を確認してください。
e18r 2017年

回答:


11

パッケージの.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)スクリプトもバグである可能性があります。それらを修正する必要がある場合もあります。

彼らがそれを修正できるように、パッケージを作った人にバグレポートを提出することを忘れないでください。


7

パッケージ化されたソフトウェアには、失敗する「インストール前のスクリプト」(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

2

ファイルを抽出して、preinstスクリプトがコードで終了する理由を確認する必要があります1

これを行う方法に関連してUNIX.SEに関する議論があったかどうかはわかりませんが、AskUbuntuからのこの質問を見て、抽出方法についてのアイデアを得ることができます。

この後、手動でpreinstスクリプトを実行して、パッケージのインストールが失敗した理由を確認する必要があります。


1

パッケージを直接編集したい場合は、これを試してください:

#!/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


このスクリプトは、OPの問題ごとのスクリプトcontrolではなく、ファイルの変更(およびパッケージの再構築)のために作成されたようですpreinst
arielf 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.