dpkg: el nuevo script de preinstalación devolvió el estado de salida de error 1

9

Terminé tratando con un software destinado a ser implementado usando dpkg. El paquete .deb funciona bien en el entorno de prueba pero falla en la preparación. Ambos ejecutan la misma versión de Ubuntu, pero no estoy 100% seguro del resto de las configuraciones. ¿Cómo depurar más este problema dpkg?

La instalación falla así:

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
fuente
Esta pregunta también es útil si encuentra este error al usar apt-get porque apt-get está llamando a dpkg debajo. Busque en la salida el paquete .deb involucrado que probablemente estará en / var / cache / apt / archives.
e18r

Respuestas:

11

El script .preinst del paquete falla por alguna razón.

Para averiguar por qué, examine el guión en /var/lib/dpkg/info/PACKAGENAME.preinst

Si desea ver exactamente en qué línea está fallando el script, edite el script .preinst y agregue set -xinmediatamente después de la #!línea. Esto activa el rastreo de ejecución en el script.

NOTA: Esto supone que el script .preinst es un script de shell (posix sh o bash). Casi todos los scripts .preinst (y .postinst, .prerm y .postrm) son scripts de shell, pero no tienen que serlo, podrían ser ejecutables. por ejemplo, en mi máquina de escritorio principal con 9104 paquetes instalados, 14 son scripts perl, 1 es un ejecutable compilado (preinst de bash, no puede suponer que ya hay un shell en funcionamiento instalado), y el resto son scripts de shell ... 9041 son scripts de shell POSIX, 63 son scripts de bash. Si el .preinst es perl o python u otra cosa, tendrá que descubrir cómo habilitar la depuración o el modo de seguimiento de ejecución o similar en ese idioma.

Entonces corre dpkg --configure --pending.

Esto hará que dpkg intente configurar el paquete medio instalado. NO lo reinstale con dpkg -i, ya que sobrescribirá su script .preinst editado con la versión en el paquete .deb.

Esto puede darle suficiente información para solucionar el problema. Puede ser algo simple, como un código de salida inesperado o no detectado de un programa (la mayoría de los scripts .preinst, etc. tienen set -e, para que terminen en el primer error), o suponiendo que ya existe un directorio (y esto puede deberse a una dependencia no declarada en el archivo debian / control del paquete, es decir, debería depender de foo pero no lo hace. Simplemente instale foo de todos modos)

Una vez que se solucione, dpkg --configure --pendingvuelva a ejecutarlo y el paquete debe instalarse correctamente.

Si el script .preinst tiene errores, hay una posibilidad razonable de que los scripts .postinst (y / o .prerm y .postrm) también lo estén. Es posible que también necesite repararlos.

No olvide enviar un informe de error a quien creó el paquete para que pueda solucionarlo.

cas
fuente
7

Su software empaquetado incluye un "script de preinstalación" (preinst) que falla. Este es un script de shell incrustado dentro del archivo .deb. Puedes extraerlo con:

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

Luego puedes mirar out-dir/preinsty ver si puedes descubrir por qué está fallando.

Si desea modificar ese script y reconstruir el .deb(quizás para agregar un código de depuración), intente

 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
fuente
2

Deberá extraer el archivo y ver por qué el preinstscript sale con código 1.

No estoy seguro de si hubo una discusión sobre UNIX.SE relacionada con cómo hacer esto, pero puede consultar esta pregunta desde AskUbuntu para tener una idea sobre cómo extraerla.

Después de esto, deberá ejecutar manualmente el preinstscript para ver por qué falla la instalación del paquete.

Karlson
fuente
1

Si desea editar el paquete directamente, intente esto:

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

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

Glenn Plas
fuente
Parece que este script fue escrito para modificar el controlarchivo (y reconstruir el paquete), no el preinstscript por el problema del OP.
arielf