dpkg: le nouveau script de pré-installation a renvoyé l'état de sortie d'erreur 1

9

J'ai fini par gérer un logiciel destiné à être déployé à l'aide de dpkg. Le package .deb fonctionne très bien sur le test env mais échoue lors du transfert. Les deux exécutent la même version d'Ubuntu mais je ne suis pas sûr à 100% du reste des configurations. Comment déboguer davantage ce problème de dpkg?

L'installation échoue comme ceci:

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
la source
Cette question est également utile si vous rencontrez cette erreur lors de l'utilisation d'apt-get car apt-get appelle dpkg en dessous. Regardez dans la sortie pour le paquet .deb impliqué qui sera probablement sous / var / cache / apt / archives.
e18r

Réponses:

11

Le script .preinst du package échoue pour une raison quelconque.

Pour savoir pourquoi, examinez le script dans /var/lib/dpkg/info/PACKAGENAME.preinst

Si vous voulez voir exactement sur quelle ligne le script échoue, modifiez le script .preinst et ajoutez-le set -ximmédiatement après la #!ligne. Cela active le suivi d'exécution dans le script.

REMARQUE: cela suppose que le script .preinst est un script shell (posix sh ou bash). Presque tous les scripts .preinst (et .postinst, .prerm et .postrm) sont des scripts shell mais ils ne doivent pas l'être, ils peuvent être n'importe quel exécutable. Par exemple, sur ma machine de bureau principale avec 9104 packages installés, 14 sont des scripts perl, 1 est un exécutable compilé (prehst de bash - il ne peut pas supposer qu'un shell fonctionnel est déjà installé), et tous les autres sont des scripts shell ... 9041 sont des scripts shell POSIX, 63 sont des scripts bash. Si le .preinst est perl ou python ou autre chose, vous devrez comprendre comment activer le mode de débogage ou de trace d'exécution ou similaire dans ce langage.

Ensuite, courez dpkg --configure --pending.

Cela amènera dpkg à essayer de configurer le package semi-installé. NE le réinstallez PAS avec dpkg -i, cela remplacera votre script .preinst modifié par la version du package .deb.

Cela peut vous donner suffisamment d'informations pour résoudre le problème. Cela peut être quelque chose de simple comme un code de sortie inattendu ou non capturé d'un programme (la plupart des scripts .preinst etc ont set -e, pour les faire se terminer sur la première erreur), ou en supposant qu'un répertoire existe déjà (et cela peut être dû à une dépendance non déclarée dans le fichier debian / control du paquet - c'est-à-dire qu'il devrait dépendre de foo mais ne le fait pas. installez simplement foo de toute façon)

Une fois qu'il est résolu, exécutez à dpkg --configure --pendingnouveau et le package doit être correctement installé.

Si le script .preinst est bogué, il y a une chance raisonnable que les scripts .postinst (et / ou .prerm et .postrm) le soient aussi. Vous devrez peut-être également les corriger.

N'oubliez pas de soumettre un rapport de bogue à la personne qui a créé le package afin qu'il puisse le corriger.

cas
la source
7

Votre logiciel fourni comprend un "script de pré-installation" (pré-installation) qui échoue. Il s'agit d'un script shell intégré au fichier .deb. Vous pouvez l'extraire avec:

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

Ensuite, vous pouvez regarder out-dir/preinstet voir si vous pouvez comprendre pourquoi il échoue.

Si vous souhaitez modifier ce script et reconstruire le .deb(peut-être pour ajouter du code de débogage), essayez

 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
la source
2

Vous devrez extraire le fichier et voir pourquoi le preinstscript se termine avec du code 1.

Je ne sais pas s'il y a eu une discussion sur UNIX.SE concernant la façon de procéder, mais vous pouvez jeter un œil à cette question d'AskUbuntu pour avoir une idée sur la façon d'extraire.

Après cela, vous devrez exécuter manuellement le preinstscript pour voir pourquoi l'installation du package échoue.

Karlson
la source
1

Si vous souhaitez modifier directement le package, essayez ceci:

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

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

Glenn Plas
la source
On dirait que ce script a été écrit pour modifier le controlfichier (et reconstruire le paquet), pas le preinstscript par le problème de l'OP.
arielf