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

Answers:


11

软件包的.preinst脚本由于某种原因而失败。

要找出原因,请检查中的脚本 /var/lib/dpkg/info/PACKAGENAME.preinst

如果要确切查看脚本失败的行,请编辑.preinst脚本并set -x在该#!行之后立即添加。这将打开脚本中的执行跟踪。

注意:这假定.preinst脚本是Shell脚本(posix sh或bash)。 几乎所有 .preinst(和.postinst,.prerm和.postrm)脚本都是shell脚本,但不一定必须如此,它们可以是任何可执行文件。例如,在我的装有9104软件包的主台式机上,14个是perl脚本,1个是已编译的可执行文件(bash的preinst-它不能假定已经安装了有效的shell),其余的都是shell脚本... 9041是POSIX Shell脚本,63是bash脚本。如果.preinst是perl或python或其他名称,则必须弄清楚如何启用调试或执行跟踪模式或使用该语言的类似模式。

然后运行dpkg --configure --pending

这将导致dpkg尝试配置半安装的软件包。不要使用重新安装它dpkg -i,这会用.deb软件包中的版本覆盖您编辑过的.preinst脚本。

这可能会给您足够的信息来解决问题。它可能很简单,例如程序的意外或未捕获的退出代码(大多数.preinst etc脚本具有set -e,使它们在出现第一个错误时终止),或者假定目录已经存在(这可能是由于未声明的依赖性)在软件包的debian / control文件中-即它应该取决于foo,但不依赖。无论如何都只是安装foo)

修复后,dpkg --configure --pending再次运行,该软件包应正确安装。

如果.preinst脚本有错误,那么.postinst(和/或.prerm和.postrm)脚本也有可能存在。您可能还需要修复它们。

别忘了向开发包的任何人提交错误报告,以便他们进行修复。


7

您的打包软件包含失败的“预安装脚本”(preinst)。这是.deb文件中嵌入的shell脚本。您可以使用以下方法提取它:

 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

2

您将需要解压缩文件,并查看preinst脚本为何以code退出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的问题编写脚本。
arielf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.