您如何创建用于测试的 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
但我更愿意更接近于安装真实软件包的方式。
我也不认为这会 运行 preinstall
和 postinstall
脚本。
类似的问题建议使用 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
为必填项。
ldconfig
和 start-stop-daemon
必须在路径上。
(因此 PATH=/sbin:/usr/sbin:$PATH)
日志文件需要从默认值 /var/log/dpkg.log
重新定位
参数的顺序很重要。如果使用 --root
必须在 --instdir
和 --admindir
.
之前
admindir 应该有安装目录作为前缀。
如果软件包包含任何预安装脚本或 post 安装脚本(preinst,postinst),则需要 --force-script-chrootless,因为这些脚本通常是 运行 通过 chroot() 在 fakeroot 下尝试时不允许操作。
我有一个以前只针对基于 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
但我更愿意更接近于安装真实软件包的方式。
我也不认为这会 运行 preinstall
和 postinstall
脚本。
类似的问题建议使用 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
为必填项。ldconfig
和start-stop-daemon
必须在路径上。 (因此 PATH=/sbin:/usr/sbin:$PATH)日志文件需要从默认值
/var/log/dpkg.log
重新定位
参数的顺序很重要。如果使用
--root
必须在--instdir
和--admindir
. 之前
admindir 应该有安装目录作为前缀。
如果软件包包含任何预安装脚本或 post 安装脚本(preinst,postinst),则需要 --force-script-chrootless,因为这些脚本通常是 运行 通过 chroot() 在 fakeroot 下尝试时不允许操作。