【问题标题】:How do you create a fake install of a debian package for use in testing?您如何创建用于测试的 debian 软件包的虚假安装?
【发布时间】:2017-11-03 15:16:51
【问题描述】:

我有一个以前只针对基于 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


2017 年 11 月 24 日更新

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

注意:

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

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

【问题讨论】:

  • 我认为这个问题可能属于超级用户而不是这里。我无法移动它,所以我将在赏金结束后交叉发布并删除/关闭。

标签: deb dpkg


【解决方案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

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

同样使用sudo--force-not-root 没有多大意义? :) 而且绝对比只使用fakeroot 更不受限制。在不久的将来,dpkg 将可以在某些本地树中以完全无特权的方式运行。

【讨论】:

    【解决方案2】:

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

    • 1234563 .

    【讨论】:

      【解决方案3】:

      为了快速测试一些无关紧要的依赖,你可以直接安装在系统上,使用 'dpkg -i' 然后 'dpkg -P' 和 'apt-get autoremove' 来清除包并清理依赖。

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

      【讨论】:

      • 重点是让我的构建与我正在构建的系统隔离。 dpkg -i 不会有那种隔离。我还认为修改 /var/lib/dpkg 需要 root 访问权限。
      • autopkgtest 看起来很有趣,但我不是在寻找另一个测试框架。特别是因为我仍然需要支持非 debian 平台。
      猜你喜欢
      • 2013-03-07
      • 2017-12-30
      • 2016-09-23
      • 2016-10-08
      • 2012-02-15
      • 2018-05-17
      • 2011-01-17
      • 2016-08-03
      • 1970-01-01
      相关资源
      最近更新 更多