dpkg: nouveau script de pré-installation renvoyé erreur exit status 1

J'ai fini par traiter avec un logiciel destiné à être déployé en utilisant dpkg. Le package .deb fonctionne correctement sur l'environnement de test mais échoue lors de la mise en scène. Tous les deux exécutent la même version d'Ubuntu mais je ne suis pas sûr à 100% du rest des configs. 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 

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, éditez le script .preinst et ajoutez set -x immédiatement après le #! ligne. Cela active le suivi de l'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 n'ont pas besoin d'ê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é (bash's preinst – il ne peut pas supposer qu'un shell fonctionne déjà) et tout le rest sont des scripts shell … 9041 sont des scripts shell POSIX, 63 sont des scripts bash. Si le .preinst est perl ou python ou quelque chose d'autre, vous devrez find comment activer le debugging ou le mode trace d'exécution ou similaire dans cette langue.

Exécutez ensuite dpkg --configure --pending .

Cela entraînera dpkg à essayer de configurer le package semi-installé. NE PAS le réinstaller avec dpkg -i , qui écrasera votre script .preinst édité avec 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 directory existe déjà (et cela peut être dû une dépendance non déclarée dans le file debian / control du package – c.-à-d. qu'elle devrait dépendre de foo mais ne l'est pas.

Une fois que c'est réparé, exécutez dpkg --configure --pending again, et le package devrait être correctement installé.

Si le script .preinst est bogué, il y a des chances raisonnables que les scripts .postinst (et / ou .prerm et .postrm) le soient aussi. Vous devrez peut-être les réparer aussi.

N'oubliez pas de soumettre un rapport de bogue à quiconque a fait le package afin qu'ils puissent le corriger.

Votre logiciel packagé inclut un "script de pré-installation" (preinst) qui échoue. Ceci est un shell-script incorporé dans le file .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 comprendre pourquoi il échoue.

Si vous voulez modifier ce script et rebuild le .deb (peut-être pour append du code de debugging), 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 

Vous devrez extraire le file et voir pourquoi le script preinst avec le 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 coup d'œil à AskUbuntu pour get 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 du package échoue.

Si vous souhaitez éditer le package directement, 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