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

如何创建用于测试的debian软件包的假安装?,deb,dpkg,Deb,Dpkg,我有一个包,以前只针对基于RPM的发行版,现在我正在为基于Debian的发行版构建.deb包 其目的是从用户空间模拟测试安装,该用户空间与正在构建的系统隔离。它可能是多用户的,您不希望仅为了构建软件而需要root访问权限。我们的许多测试已经模拟了安装目录结构。这是下一步使用构建的软件包模拟实际安装的步骤 对于RPM软件包,我能够使用以下方法创建测试安装: WSDIR=/where/I/want/my/tests/to/run rpmdb --initdb --dbpath "$WSDIR"/rp

我有一个包,以前只针对基于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 
但是,我被
rpmdb--initdb
步骤的等价物卡住了

请注意,我可以使用以下方法解压缩归档文件:

dpkg-deb -x "$DEB" $WSDIR/install
但我更希望更接近于如何安装真正的软件包。 另外,我认为这不会运行
预安装
后安装
脚本

类似的问题建议使用
deboosttrap
创建
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管理目录呢

交叉张贴为


2017年11月24日更新

我尝试过从[Cowdesser][1](在引擎盖下使用Deboosttrap)创建的环境中使用dpkg目录进行复制,或者从/var/lib/dpkg复制真实的dpkg目录,但我仍然收到相同的错误消息,因此可能错误(和/或--admindir选项)并不是我认为的意思

请注意:

sudo dpkg --force-not-root --root=$WSDIR/install  --admindir=/var/lib/dpkg --install "$DEB"
确实有效。所以这与admin dir有关。
我还将这个问题重新命名为“如何创建dpkg管理目录”是一个有趣的问题,但答案不一定是我问题的解决方案。

对于简单依赖性的快速测试,您可以使用“dpkg-i”然后使用“dpkg-P”和“apt get autoremove”在系统上直接安装,以清除包并清除依赖项

另一个更安全但速度较慢的解决方案是使用autopkgtest软件包:

创建dpkg数据库的最简单方法如下:

$ mkdir -p db/{updates,info}
$ touch db/{status,diversions,statoverride}
如果要将其用作非根,当前最好的方法是使用
fakeroot

$ mkdir -p fsys
$ PATH=/sbin:/usr/sbin:$PATH fakeroot dpkg --log=/dev/null --admindir=db --instdir=fsys -i pkg.deb
但是要考虑到在
--admindir
--instdir
之后传递
--root
将重置这些路径,我认为这就是您在这里遇到的问题

同时使用
sudo
强制非root
也没有多大意义:)而且绝对没有使用fakeroot的局限性。在不久的将来,可以在一些本地树中完全不受特权地运行dpkg。多亏了吉勒姆·乔弗。 将其副本粘贴到此处:

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
需要注意的几点:

  • --强制不使用root
    是不够的<代码>fakeroot是必需的

  • ldconfig
    start-stop-daemon
    必须位于路径上。 (因此路径=/sbin:/usr/sbin:$PATH)

  • 日志文件需要从默认的
    /var/log/dpkg.log

  • 争论的顺序很重要。如果使用
    --root
    必须在
    --instdir
    --admindir
    之前

  • admindir应该以installation dir作为前缀

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


关键在于将我的构建与我构建的系统隔离开来。dpkg-我不会有那种孤立感。另外,我认为修改/var/lib/dpkg需要root访问权限。autopkgtest看起来很有趣,但我不想寻找其他测试框架。特别是我仍然需要支持非debian平台,我认为这个问题可能属于超级用户,而不是这里。我无法移动它,所以我将在悬赏结束后交叉发布并删除/关闭。
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