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

问题描述 投票:3回答:3

我有一个以前只针对基于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管理目录呢?

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


更新24/11/2017

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

注意:

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

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

deb dpkg
3个回答
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


0
投票

要快速测试普通依赖项,可以使用'dpkg -i'然后'dpkg -P'和'apt-get autoremove'直接在系统上安装,以清除包并清除依赖项。

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


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下尝试时不允许操作。
© www.soinside.com 2019 - 2024. All rights reserved.