dpkg: Neues Skript vor der Installation hat den Fehler-Exit-Status 1 zurückgegeben

9

Am Ende hatte ich es mit einer Software zu tun, die mit dpkg bereitgestellt werden sollte. Das .deb-Paket funktioniert in der Testumgebung einwandfrei, schlägt jedoch beim Staging fehl. Beide verwenden dieselbe Ubuntu-Version, aber ich bin mir der restlichen Konfiguration nicht 100% sicher. Wie kann ich dieses dpkg-Problem weiter debuggen?

Die Installation schlägt folgendermaßen fehl:

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
Petteri Hietavirta
quelle
Diese Frage ist auch nützlich, wenn dieser Fehler bei der Verwendung von apt-get auftritt, da apt-get darunter dpkg aufruft. Suchen Sie in der Ausgabe nach dem .deb-Paket, das sich wahrscheinlich unter / var / cache / apt / archives befindet.
e18r

Antworten:

11

Das .preinst-Skript des Pakets schlägt aus irgendeinem Grund fehl.

Um herauszufinden, warum, überprüfen Sie das Skript in /var/lib/dpkg/info/PACKAGENAME.preinst

Wenn Sie genau sehen möchten, in welcher Zeile das Skript fehlschlägt, bearbeiten Sie das .preinst-Skript und fügen Sie es set -xunmittelbar nach der #!Zeile hinzu. Dadurch wird die Ausführungsverfolgung im Skript aktiviert.

HINWEIS: Dies setzt voraus, dass das .preinst-Skript ein Shell-Skript ist (entweder posix sh oder bash). Fast alle .preinst- (und .postinst-, .prerm- und .postrm-) Skripte sind Shell-Skripte, müssen es aber nicht sein, sie können auch ausführbar sein. zB auf meinem Haupt-Desktop-Computer mit 9104 installierten Paketen sind 14 Perl-Skripte, 1 ist eine kompilierte ausführbare Datei (Bashs Preinst - es kann nicht davon ausgegangen werden, dass bereits eine funktionierende Shell installiert ist), und alle anderen sind Shell-Skripte ... 9041 sind POSIX-Shell-Skripte, 63 sind Bash-Skripte. Wenn es sich bei .preinst um Perl oder Python oder etwas anderes handelt, müssen Sie herausfinden, wie Sie den Debugging- oder Ausführungs-Trace-Modus oder ähnliches in dieser Sprache aktivieren.

Dann renne dpkg --configure --pending.

Dies führt dazu, dass dpkg versucht, das halbinstallierte Paket zu konfigurieren. Installieren Sie es NICHT mit dpkg -i, da dies Ihr bearbeitetes .preinst-Skript mit der Version im .deb-Paket überschreibt.

Dies kann Ihnen genügend Informationen geben, um das Problem zu beheben. Es kann etwas Einfaches sein, wie ein unerwarteter oder nicht erfasster Exit-Code aus einem Programm (die meisten .preinst-Skripte usw. haben set -e, um sie beim ersten Fehler zu beenden) oder die Annahme, dass bereits ein Verzeichnis vorhanden ist (und dies kann auf eine nicht deklarierte Abhängigkeit zurückzuführen sein in der Debian / Control-Datei des Pakets - dh es sollte von foo abhängen, tut es aber nicht. installiere einfach foo trotzdem)

Sobald es behoben ist, führen Sie es dpkg --configure --pendingerneut aus und das Paket sollte ordnungsgemäß installiert sein.

Wenn das .preinst-Skript fehlerhaft ist, besteht eine vernünftige Wahrscheinlichkeit, dass auch die .postinst- (und / oder .prerm- und .postrm-) Skripte vorhanden sind. Möglicherweise müssen Sie sie auch reparieren.

Vergessen Sie nicht, einen Fehlerbericht an denjenigen zu senden, der das Paket erstellt hat, damit er es beheben kann.

cas
quelle
7

Ihre Software enthält ein "Pre-Installation-Skript" (Preinst), das fehlschlägt. Dies ist ein Shell-Skript, das in die .deb-Datei eingebettet ist. Sie können es extrahieren mit:

 dpkg-deb -e some-deb.deb out-dir

Dann können Sie schauen out-dir/preinstund sehen, ob Sie herausfinden können, warum es fehlschlägt.

Wenn Sie dieses Skript ändern und neu .deberstellen möchten (möglicherweise, um Debugging-Code hinzuzufügen), versuchen Sie es

 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
jmtd
quelle
2

Sie müssen die Datei extrahieren und sehen, warum das preinstSkript mit Code beendet wird 1.

Ich bin mir nicht sicher, ob es eine Diskussion zu UNIX.SE gab, aber ich kann mir diese Frage von AskUbuntu ansehen, um eine Vorstellung davon zu bekommen, wie man sie extrahiert.

Danach müssen Sie das preinstSkript manuell ausführen, um festzustellen, warum die Paketinstallation fehlschlägt.

Karlson
quelle
1

Wenn Sie das Paket direkt bearbeiten möchten, versuchen Sie Folgendes:

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

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

Glenn Plas
quelle
Es sieht so aus, als ob dieses Skript geschrieben wurde, um die controlDatei zu ändern (und das Paket neu zu erstellen), nicht das preinstSkript gemäß dem OP-Problem.
Arielf