dpkg: nuovo script pre-installazione ha restituito lo stato di uscita dell'errore 1


9

Ho finito per occuparmi di un software che doveva essere distribuito usando dpkg. Il pacchetto .deb funziona bene sull'ambiente di test ma non riesce nella gestione temporanea. Entrambi eseguono la stessa versione di Ubuntu ma non sono sicuro al 100% del resto delle configurazioni. Come eseguire il debug di questo problema dpkg ulteriormente?

L'installazione non riesce in questo modo:

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

Questa domanda è utile anche se si riscontra questo errore durante l'utilizzo di apt-get perché apt-get chiama dpkg sotto. Cerca nell'output il pacchetto .deb coinvolto che probabilmente sarà sotto / var / cache / apt / archives.
e18r

Risposte:


11

Lo script .preinst del pacchetto non riesce per qualche motivo.

Per scoprire perché, esamina lo script in /var/lib/dpkg/info/PACKAGENAME.preinst

Se vuoi vedere esattamente su quale riga non funziona lo script, modifica lo script .preinst e aggiungi set -xsubito dopo la #!riga. Questo attiva la traccia di esecuzione nello script.

NOTA: ciò presuppone che lo script .preinst sia uno script di shell (posix sh o bash). Quasi tutti gli script .preinst (e .postinst, .prerm e .postrm) sono script di shell ma non devono essere, potrebbero essere eseguibili. ad esempio sulla mia macchina desktop principale con 9104 pacchetti installati, 14 sono script perl, 1 è un eseguibile compilato (prehst di bash - non si può presumere che sia già installata una shell funzionante), e tutto il resto sono script di shell ... 9041 sono script shell POSIX, 63 sono script bash. Se il .preinst è perl o python o qualcos'altro, dovrai capire come abilitare la modalità di traccia del debug o dell'esecuzione o simile in quella lingua.

Quindi corri dpkg --configure --pending.

Questo farà provare a dpkg a configurare il pacchetto semi-installato. NON reinstallarlo con dpkg -i, che sovrascriverà lo script .preinst modificato con la versione nel pacchetto .deb.

Questo potrebbe darti informazioni sufficienti per risolvere il problema. Potrebbe essere qualcosa di semplice come un codice di uscita imprevisto o non rilevato da un programma (la maggior parte degli script .preinst ecc. Hanno set -e, per farli terminare al primo errore), o supporre che esista già una directory (e ciò potrebbe essere dovuto a una dipendenza non dichiarata nel file debian / control del pacchetto - cioè dovrebbe dipendere da foo ma non lo fa. basta installare foo comunque)

Una volta risolto, esegui di dpkg --configure --pendingnuovo e il pacchetto dovrebbe essere installato correttamente.

Se lo script .preinst è difettoso, c'è una ragionevole possibilità che lo saranno anche gli script .postinst (e / o .prerm e .postrm). Potrebbe essere necessario risolverli.

Non dimenticare di inviare una segnalazione di bug a chiunque abbia creato il pacchetto in modo che possano risolverlo.


7

Il software in pacchetto include uno "script pre-installazione" (preinst) che non funziona. Questo è uno script di shell incorporato nel file .deb. Puoi estrarlo con:

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

Quindi puoi guardare out-dir/preinste vedere se riesci a capire perché non sta funzionando.

Se vuoi modificare quello script e ricostruire .deb(forse per aggiungere un po 'di codice di debug), prova

 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

2

Dovrai estrarre il file e vedere perché lo preinstscript esce con il codice 1.

Non sei sicuro che ci sia stata una discussione su UNIX.SE relativa a come farlo, ma puoi dare un'occhiata a questa domanda da AskUbuntu per avere un'idea su come estrarre.

Dopodiché dovrai eseguire manualmente lo preinstscript per capire perché l'installazione del pacchetto non riesce.


1

Se vuoi modificare il pacchetto direttamente prova questo:

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

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


Sembra che questo script sia stato scritto per modificare il controlfile (e ricostruire il pacchetto), non lo preinstscript per il problema del PO.
arielf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.