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

How do you create a fake install of a debian package for use in testing?

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

目的是模拟来自 user-space 的测试安装,它与您正在构建的系统隔离。它可能是多用户的,您不希望仅仅为了构建软件就需要 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


2017 年 11 月 24 日更新

我尝试使用 [cowdancer][1] 创建的环境中的 dpkg 目录进行复制(在后台使用 deboostrap)或从 /var/lib/dpkg 中复制真实的目录,但我仍然得到相同的结果错误消息,所以也许错误(and/or --admindir 选项)并不完全符合我的意思。

注意:

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

确实有效。所以这与管理目录有关。 我还重新命名了这个问题,因为 "How do you create a dpkg admin directory" 是一个有趣的问题,但答案不一定是我的问题的解决方案。

为了快速测试琐碎的依赖关系,您可以使用 'dpkg -i' 然后 'dpkg -P' 和 'apt-get autoremove' 直接在系统上安装以清除包并清除依赖关系。

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

创建 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

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

还用sudo--force-not-root意义不大? :) 并且绝对比仅使用 fakeroot 更受限制。在不久的将来,在某些本地树中 运行 dpkg 完全没有特权是可能的。

我终于找到了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 应该有安装目录作为前缀。

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