dpkg: новый предустановочный скрипт вернул ошибку выхода из состояния 1

9

В итоге я столкнулся с программным обеспечением, предназначенным для развертывания с использованием dpkg. Пакет .deb отлично работает в тестовой среде, но не проходит при постановке. Оба работают под управлением одной и той же версии Ubuntu, но я не уверен на 100% в остальных конфигурациях. Как отладить эту проблему dpkg дальше?

Установка терпит неудачу как это:

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
Петтери Хиетавирта
источник
Этот вопрос также полезен, если вы сталкиваетесь с этой ошибкой при использовании apt-get, потому что apt-get вызывает dpkg внизу. Посмотрите в выходных данных для задействованного пакета .deb, который, вероятно, будет находиться в / var / cache / apt / archives.
e18r

Ответы:

11

Сценарий .preinst пакета по какой-то причине не работает.

Чтобы узнать почему, изучите сценарий в /var/lib/dpkg/info/PACKAGENAME.preinst

Если вы хотите точно определить, в какой строке скрипта происходит сбой, отредактируйте скрипт .preinst и добавьте его set -xсразу после #!строки. Это включает трассировку выполнения в скрипте.

ПРИМЕЧАНИЕ. Предполагается, что сценарий .preinst является сценарием оболочки (posix sh или bash). Почти все сценарии .preinst (и .postinst, .prerm и .postrm) являются сценариями оболочки, но они необязательно должны быть исполняемыми. например, на моей основной настольной машине с установленными пакетами 9104, 14 являются сценариями perl, 1 - это скомпилированный исполняемый файл (preinst bash - он не может предполагать, что уже установлена ​​работающая оболочка), а все остальные являются сценариями оболочки ... 9041 - это сценарии оболочки POSIX, 63 - сценарии bash. Если .preinst - это perl или python или что-то еще, вам придется выяснить, как включить режим отладки или трассировки выполнения или аналогичный в этом языке.

Тогда беги dpkg --configure --pending.

Это заставит dpkg попытаться настроить наполовину установленный пакет. НЕ переустанавливайте его dpkg -i, это отменит ваш отредактированный скрипт .preinst версией из пакета .deb.

Это может дать вам достаточно информации для решения проблемы. Это может быть что-то простое, например неожиданный или неперехваченный код выхода из программы (большинство сценариев .preinst и т. Д., Позволяющие set -eзавершить их при первой ошибке), или предположение, что каталог уже существует (и это может быть из-за необъявленной зависимости). в файле debian / control пакета - т.е. он должен зависеть от foo, но не зависит. просто установите foo в любом случае)

Как только это исправлено, запустите dpkg --configure --pendingснова, и пакет должен быть правильно установлен.

Если скрипт .preinst содержит ошибки, есть достаточный шанс, что скрипты .postinst (и / или .prerm и .postrm) тоже будут. Возможно, вам придется их исправить.

Не забудьте отправить отчет об ошибке любому, кто сделал пакет, чтобы он мог его исправить.

саз
источник
7

В комплект поставки программного обеспечения входит «сценарий предварительной установки» (preinst), который не работает. Это shell-скрипт, встроенный в файл .deb. Вы можете извлечь его с помощью:

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

Тогда вы можете посмотреть out-dir/preinstи понять, можете ли вы понять, почему это не удается.

Если вы хотите изменить этот скрипт и перестроить .deb(возможно, добавить некоторый код отладки), попробуйте

 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
источник
2

Вам нужно будет извлечь файл и посмотреть, почему preinstскрипт завершает работу с кодом 1.

Не уверен, что обсуждался вопрос о том, как это сделать, в UNIX.SE, но вы можете взглянуть на этот вопрос из AskUbuntu, чтобы получить представление о том, как его извлечь.

После этого вам нужно будет вручную запустить preinstскрипт, чтобы увидеть, почему установка пакета не удалась.

Карлсон
источник
1

Если вы хотите редактировать пакет напрямую, попробуйте это:

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

Источник: http://ubuntuforums.org/showthread.php?t=636724

Гленн Плас
источник
Похоже, этот сценарий был написан для изменения controlфайла (и перестройки пакета), а не preinstсценария в соответствии с проблемой OP.
Ариэльф