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

7

Acabei lidando com um software destinado a ser implantado usando o dpkg. O pacote .deb funciona bem no env de teste, mas falha no escalonamento. Ambos estão executando a mesma versão do Ubuntu, mas eu não estou 100% certo do resto das configurações. Como depurar ainda mais esta questão 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
    
por Petteri Hietavirta 17.09.2012 / 14:23

4 respostas

10

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

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

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

NOTA: Isso pressupõe que o script .preinst seja um script de shell (seja posix sh ou bash). Quase todos os scripts .preinst (e .postinst, .prerm e .postrm) são scripts de shell, 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 (bash's preinst - não pode presumir que existe um shell funcional já instalado), e todos os demais são scripts de shell ... 9041 são scripts shell POSIX, 63 são scripts bash. Se o .preinst for perl ou python ou qualquer outra coisa, você terá que descobrir como habilitar o modo de rastreamento de depuração ou de execução ou semelhante nesse idioma.

Em seguida, execute dpkg --configure --pending .

Isso fará com que o dpkg tente configurar o pacote semi-instalado. NÃO o reinstale com dpkg -i , que sobrescreverá seu script .preinst editado com a 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 detectado de um programa (a maioria dos scripts .preinst etc tem set -e , para torná-los encerrados 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 - isto é, ele deve depender de foo mas não instala foo de qualquer maneira)

Após a correção, execute dpkg --configure --pending novamente e o pacote deverá estar instalado corretamente.

Se o script .preinst estiver com bugs, há uma chance razoável de que os scripts .postinst (e / ou .prerm e .postrm) também estejam. Você pode precisar corrigi-los também.

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

    
por 18.09.2012 / 03:06
7

Seu pacote de software inclui um "script de pré-instalação" (preinst) que está falhando. Este é um script de shell embutido no arquivo .deb. Você pode extrair com:

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

Então você pode olhar para out-dir/preinst e ver se consegue descobrir por que falhando.

Se você quiser 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
    
por 17.09.2012 / 14:44
2

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

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

Depois disso, você terá que executar manualmente o script preinst para ver porque a instalação do pacote falha.

    
por 17.09.2012 / 14:44
1

Se você quiser editar o pacote diretamente, tente isto:

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

    
por 19.09.2012 / 17:13