如何创建一个假的debian软件包安装用于测试?

时间:2017-11-03 15:16:51

标签: deb dpkg

我有一个以前只针对基于RPM的发行版的软件包,我现在正在为基于Debian的发行版构建.deb软件包。

目的是从与您正在构建的系统隔离的用户空间模拟测试安装。它可能是多用户的,您不希望仅仅为了构建软件而需要root访问权限。我们的许多测试已经模拟了安装目录结构。这是为了使用构建的软件包模拟实际安装的下一步。

对于RPM软件包,我可以使用以下方法创建测试安装:

WSDIR=/where/I/want/my/tests/to/run
rpmdb --initdb --dbpath "$WSDIR"/rpmdb
rpm --relocate /opt="$WSDIR"/opt --dbpath $WSDIR/rpmdb -i <package>.rpm 

Debian世界中的等价物是:

dpkg --force-not-root --admindir=$WSDIR/dpkg --root=$WSDIR/install --install "$DEB" 

但是,我被困在等同于rpmdb --initdb步骤。

请注意,我可以使用以下方法解压缩档案

dpkg-deb -x "$DEB" $WSDIR/install

但我更愿意接近真正的软件包的安装方式。 此外,我认为这不会运行preinstallpostinstall脚本。

类似的问题建议使用deboostrap创建chroot环境,但这会创建一个完整的新安装。除了过度杀伤之外,它对于自动化测试来说太慢了。在实际测试环境中进一步测试之前,我打算使用它来快速测试安装包。

到目前为止我的实验:

(cd $WSDIR/dpkg && mkdir alternatives info parts triggers updates)
cp /var/lib/dpkg/status $WSDIR/dpkg/status

最多导致:

dpkg: error: unable to access dpkg status area: No such file or directory

并不表示明确错误。

那么 如何创建dpkg管理目录?

交叉发布为https://superuser.com/questions/1271145/how-do-you-create-a-dpkg-admin-directory

立即更新24/11/2017

我尝试使用[cowdancer] [1]创建的环境中的dpkg dir进行复制(在引擎盖下使用deboostrap)或从/ var / lib / dpkg复制真实的dir,但我仍然得到相同的错误消息所以错误(和/或--admindir选项)可能并不意味着我的意思。

请注意:

sudo dpkg --force-not-root --root=$WSDIR/install  --admindir=/var/lib/dpkg --install "$DEB"

确实有效。所以它与admin目录有关。 我还将这个问题重新命名为“你如何创建一个dpkg管理目录”是一个有趣的问题,但答案不一定是解决我的问题。

3 个答案:

答案 0 :(得分:1)

创建dpkg数据库的最小方法是这样的:

$ mkdir -p db/{updates,info}
$ touch db/{status,diversions,statoverride}

如果您想将其用作非root用户,目前最好的方法是使用fakeroot

$ mkdir -p fsys
$ PATH=/sbin:/usr/sbin:$PATH fakeroot dpkg --log=/dev/null --admindir=db --instdir=fsys -i pkg.deb

但请注意,在--root--admindir之后传递--instdir会重置这些路径,我认为这是您在这里遇到的问题。

同样使用sudo--force-not-root没有多大意义? :)并且绝对不如仅使用fakeroot。在不久的将来,可以在某些本地树中运行dpkg完全无特权。

答案 1 :(得分:0)

要快速测试琐碎的依赖关系,您可以使用&#39; dpkg -i&#39;直接在系统上安装。然后&#39; dpkg -P&#39;和&#39; apt-get autoremove&#39;清除包并清理依赖项。

另一个更安全但速度较慢的解决方案可能是使用autopkgtest软件包: https://people.debian.org/~mpitt/autopkgtest/README.package-tests.html

答案 2 :(得分:0)

我最终找到了an answer for this。感谢Guillem Jover所做的一些工作。 在此处粘贴副本:

mkdir fake
mkdir fake/install
mkdir -p fake/dpkg/info
mkdir -p fake/dpkg/updates
touch fake/dpkg/status
PATH=/sbin:/usr/sbin:$PATH fakeroot dpkg --force-script-chrootless --log=`pwd`/fake/dpkg.log --root=`pwd`/fake --instdir `pwd`/fake --admindir=`pwd`/fake/dpkg --install *.deb

一些注意事项:

  • --force-not-root是不够的。 fakeroot是必需的。

  • ldconfigstart-stop-daemon必须在路径上。 (因此PATH = / sbin:/ usr / sbin:$ PATH)

  • 需要从默认的/var/log/dpkg.log

  • 重定位日志文件
  • 参数的顺序很重要。如果使用--root,则必须在--instdir--admindir之前。

  • admindir应该以安装目录作为前缀。

  • 如果该软件包包含任何安装前或安装后脚本(preinst,postinst),则需要--force-script-chrootless,因为这些脚本通常通过chroot()运行,当在fakeroot下尝试时,该操作不允许进行操作

相关问题