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
Réponses:
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 -x
immé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 --pending
nouveau 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.
la source
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:
Ensuite, vous pouvez regarder
out-dir/preinst
et 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), essayezla source
Vous devrez extraire le fichier et voir pourquoi le
preinst
script se termine avec du code1
.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
preinst
script pour voir pourquoi l'installation du package échoue.la source
Si vous souhaitez modifier directement le package, essayez ceci:
Source: http://ubuntuforums.org/showthread.php?t=636724
la source
control
fichier (et reconstruire le paquet), pas lepreinst
script par le problème de l'OP.