如何创建用于测试的debian软件包的假安装?
我有一个包,以前只针对基于RPM的发行版,现在我正在为基于Debian的发行版构建.deb包 其目的是从用户空间模拟测试安装,该用户空间与正在构建的系统隔离。它可能是多用户的,您不希望仅为了构建软件而需要root访问权限。我们的许多测试已经模拟了安装目录结构。这是下一步使用构建的软件包模拟实际安装的步骤 对于RPM软件包,我能够使用以下方法创建测试安装:如何创建用于测试的debian软件包的假安装?,deb,dpkg,Deb,Dpkg,我有一个包,以前只针对基于RPM的发行版,现在我正在为基于Debian的发行版构建.deb包 其目的是从用户空间模拟测试安装,该用户空间与正在构建的系统隔离。它可能是多用户的,您不希望仅为了构建软件而需要root访问权限。我们的许多测试已经模拟了安装目录结构。这是下一步使用构建的软件包模拟实际安装的步骤 对于RPM软件包,我能够使用以下方法创建测试安装: WSDIR=/where/I/want/my/tests/to/run rpmdb --initdb --dbpath "$WSDIR"/rp
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
需要注意的几点:
是不够的<代码>fakeroot是必需的--强制不使用root
和ldconfig
必须位于路径上。 (因此路径=/sbin:/usr/sbin:$PATH)start-stop-daemon
- 日志文件需要从默认的
/var/log/dpkg.log
- 争论的顺序很重要。如果使用
必须在--root
和--instdir
之前--admindir
- admindir应该以installation dir作为前缀
- 如果包包含任何安装前或安装后脚本(preinst、postinst),则需要--force script chrootless,因为这些脚本通常通过chroot()运行,这使得在fakeroot下尝试时不允许执行操作
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