dpkg: o novo script de pré-instalação retornou o status de saída de erro 1

9

Acabei lidando com um software destinado a ser implantado usando o dpkg. O pacote .deb funciona bem no ambiente de teste, mas falha na preparação. Ambos estão executando a mesma versão do Ubuntu, mas não tenho 100% de certeza do resto das configurações. Como depurar ainda mais esse problema do dpkg?

A instalação falha assim:

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
fonte
Essa pergunta também é útil se você encontrar esse erro ao usar o apt-get porque o apt-get está chamando o dpkg por baixo. Procure na saída o pacote .deb envolvido, que provavelmente estará em / var / cache / apt / archives.
e18r

Respostas:

11

O script .preinst do pacote está falhando por algum motivo.

Para descobrir o porquê, examine o script em /var/lib/dpkg/info/PACKAGENAME.preinst

Se você deseja ver exatamente em qual linha o script está falhando, edite o script .preinst e adicione set -ximediatamente após a #!linha. Isso ativa o rastreamento de execução no script.

NOTA: Isso pressupõe que o script .preinst seja um shell (posix sh ou bash). Quase todos os scripts .preinst (e .postinst, .prerm e .postrm) são shell scripts, mas não precisam ser, podem ser executáveis. por exemplo, na minha máquina desktop principal com 9104 pacotes instalados, 14 são scripts perl, 1 é um executável compilado (preinst do bash - ele não pode assumir que já existe um shell em funcionamento) e todo o resto são scripts de shell ... 9041 são scripts de shell POSIX, 63 são scripts de bash. Se o .preinst for perl, python ou qualquer outra coisa, você precisará descobrir como habilitar o modo de rastreamento de depuração ou de execução ou similar nessa linguagem.

Então corra dpkg --configure --pending.

Isso fará com que o dpkg tente configurar o pacote semi-instalado. NÃO o reinstale comdpkg -i , que substituirá o script .preinst editado pela versão no pacote .deb.

Isso pode fornecer informações suficientes para corrigir o problema. Pode ser algo simples como um código de saída inesperado ou não capturado de um programa (a maioria dos scripts .preinst etc tem set -e, para fazê-los terminar no primeiro erro), ou assumindo que um diretório já existe (e isso pode ser devido a uma dependência não declarada no arquivo debian / control do pacote - ou seja, ele deve depender do foo, mas não. basta instalar o foo de qualquer maneira)

Depois de corrigido, execute dpkg --configure --pendingnovamente, e o pacote deve estar instalado corretamente.

Se o script .preinst estiver com erros, há uma chance razoável de que os scripts .postinst (e / ou .prerm e .postrm) também estejam. Pode ser necessário corrigi-los também.

Não se esqueça de enviar um relatório de bug para quem criou o pacote para que ele possa corrigi-lo.

cas
fonte
7

Seu software empacotado inclui um "script de pré-instalação" (pré-instalação) que está falhando. Este é um script de shell incorporado ao arquivo .deb. Você pode extraí-lo com:

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

Então você pode olhar out-dir/preinste ver se consegue descobrir por que está falhando.

Se você deseja modificar esse script e reconstruir o .deb(talvez para adicionar algum código de depuração), tente

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

Você precisará extrair o arquivo e ver por que o preinstscript sai com o código 1.

Não tenho certeza se houve uma discussão no UNIX.SE relacionada a como fazer isso, mas você pode dar uma olhada nesta pergunta no AskUbuntu para ter uma idéia de como extrair.

Após isso, você precisará executar manualmente o preinstscript para ver por que a instalação do pacote falha.

Karlson
fonte
1

Se você deseja editar o pacote diretamente, tente o seguinte:

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

Glenn Plas
fonte
Parece que este script foi gravado para modificar o controlarquivo (e reconstruir o pacote), não o preinstscript pelo problema do OP.
Arielf 26/05