web-dev-qa-db-fra.com

dpkg: nouveau script de pré-installation renvoyé EXIT STATURE 1

J'ai fini par faire face à un logiciel destiné à être déployé à l'aide de DPKG. Le paquet .deb fonctionne bien sur le test env mais échoue sur la mise en scène. Les deux fonctionnent la même version de Ubuntu, mais je ne suis pas sûr de 100% du reste des configuration. Comment déboguer ce problème DPKG plus loin?

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
9
Petteri Hietavirta

.preinst scénario échoue pour une raison quelconque de l'emballage.

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

Si vous voulez voir exactement quelle ligne le script échoue sur, modifier le script .preinst et ajouter set -x Immédiatement après le #! ligne. Ceci permet d'activer l'exécution de traçage dans le script.

NOTE: Cela suppose que le script .preinst est un script Shell (soit posix sh ou bash). presque tous .preinst scripts (et .postinst, .prerm et .postrm) sont des scripts Shell, mais ils ne doivent pas être, ils pourraient être tout exécutable. par exemple. sur ma principale machine de bureau avec 9104 paquets installés, 14 sont des scripts Perl, 1 est un exécutable compilé (le preinst de bash - il ne peut pas supposer qu'il ya un fonctionnement Shell 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 devez savoir comment activer le débogage ou le mode trace d'exécution ou similaire dans cette langue.

Puis courez dpkg --configure --pending.

Cela entraînera dpkg pour essayer de configurer le package demi-installé. NE PAS réinstaller avec dpkg -i, Qui va remplacer votre script .preinst édité avec la version dans le paquet .deb.

Cela peut vous donner assez d'informations pour résoudre le problème. Il peut être simple quelque chose comme un code de sortie inattendu ou non capturé un programme (la plupart des scripts .preinst etc ont set -e, Pour les rendre fin à 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é dans le fichier debian/contrôle du paquet - dire qu'il devrait dépendre de foo, mais ne pas seulement. installer foo de toute façon)

Une fois qu'il est fixé, exécutez dpkg --configure --pending À nouveau, et le paquet doit être correctement installé.

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

Ne pas oublier de soumettre un rapport de bogue à celui qui fait le paquet afin qu'ils puissent réparer.

11
cas

Votre logiciel emballé comprend un "script de pré-installation" (PREINST) qui échoue. Ceci est un script shell intégré dans le fichier .deb. Vous pouvez l'extraire avec:

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

Ensuite, vous pouvez regarder out-dir/preinst et voir si vous pouvez déterminer pourquoi il échoue.

Si vous souhaitez modifier ce script et reconstruire le .deb (Peut-être d'ajouter un certain 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
7
jmtd

Vous devrez extraire le fichier et voir pourquoi le script preinst sort avec code 1.

Je ne sais pas s'il y avait une discussion sur UNIX.SE en rapport avec comment faire cela, mais vous pouvez jeter un coup d'œil à cette question de Askubuntu pour avoir une idée sur la façon d'extraire.

Après cela, vous devrez exécuter manuellement le script preinst pour voir pourquoi l'installation de l'emballage échoue.

2
Karlson

Si vous souhaitez modifier le paquet, essayez-le directement:

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

1
Glenn Plas