Answers:
Dpkg不具有RPM的--relocate功能。值得考虑的是,有多少RPM软件包支持该功能。基本上,这是无法完成的。
如果要在系统上全局安装某项之前进行测试,则可以使用chroot。为此,您需要能够访问root用户。要做的第一件事是创建一个基本的chroot:
#debootstrap lenny lenny-chroot
这将在lenny-chroot
目录内创建一个Lenny chroot 。
现在我们可以输入chroot:
# chroot lenny-chroot
现在,我们可以执行所需的操作并安装任何东西,而不会破坏系统的其余部分。完成后,只需键入exit或按ctrl-D
您可以使用fakechroot-在其网站上查看演示。
我通常会获取源代码并签出“ INSTALL”之类的文件。通常有说明要做./configure --prefix=somedir
。然后,您必须添加somedir/bin
到您的路径。
根据我自己的经验,没有简单的方法可以使用现有的DEB软件包将其安装到不是chroot环境的另一个目录中。Debian / Ubuntu安装工具dpkg / aptitude / dselect都需要root特权才能正常运行。
现在有了源DEB,您可以修改Debian / rules文件以构建软件包并安装到其他目录树中,但是此时您将不使用已经可用的二进制软件包。
正如其他人提到的那样,您可以使用debootstrap并轻松地构建chroot环境,我过去已经在64位主机上实现了32位环境,但这需要安装至少复制了基本软件包的chroot。如果有足够的空间,并且这是一个可行的解决方案,则可以将其与dchroot
,甚至更好地结合使用schroot
,以轻松执行chroot环境中安装的应用程序。
我很难想象这将如何与发行版中的官方存储库一起使用。它应该如何解决依赖关系?从系统还是从主目录?如果两者都找到不同的版本怎么办?
我能想到的最好的环境是chroot的环境,就像人们在64位系统上对32位应用程序所做的那样。与在chroot中调用debootstrap相比,这会产生更多开销,但是由于有了一些symlinking和shell wrapper脚本,它可能会做您想要的事情。
我有一个解决方案,我已经成功地使用它在学校Debian服务器上安装了BIG协作软件包集合,而我根本没有root访问权限(甚至没有安装另一个软件包管理器)。它既不使用deboostrap
也不使用任何程序包管理器。
该方法部分是手动的,但我已尽力使其变得方便。
它使用了我称为的这个脚本install
(别忘了chmod +x
):
#!/bin/bash
# PREFIX is the installation root, i.e. a directory you have write access to
PREFIX=$HOME
# unpack the archive to $PREFIX
ar p "$1" data.tar.xz | tar xJ -C $PREFIX
# go through all unpacked text files and search for occurences of /usr/...
# we're gonna replace some of them with $PREFIX/usr
files=$(dpkg --contents $1 | grep '^-' | awk '{print $6}' | sed 's/^..//' | sort | uniq)
for f in $files; do
file="${PREFIX}${f}"
if grep -Iq . "$file"; then
if grep -q '/usr' "$file"; then
# interactively ask for each occurence, if it should be replaced
vim -c '%s#/usr#'$PREFIX'/usr#gc' -c 'wq' "$file"
fi
else
echo "Leaving binary file $file unmodified"
fi
done
因此,通常我首先使用下载一个deb文件apt-get download package_name
。然后,我运行./install package_name_blabla.deb
,然后手动确定/usr
解压缩文件中是否存在,每次替换是否应替换$PREFIX/usr
。
该决定完全取决于系统安装了哪些软件包以及使用此方法安装了哪些软件包。通常,例如pkg-config文件需要此替换,而类似shebang的行#!/usr/bin/perl
则不需要。一般的经验法则是,生成的路径应指向现有文件。
使用这种方式安装软件包后,您显然需要以某种方式告诉其他程序有关它们的信息。这可以通过附加正确的值来完成LD_LIBRARY_PATH
,PATH
,PYTHONPATH
,PKG_CONFIG_PATH
,CMAKE_MODULES_PATH
,CMAKE_PREFIX_PATH
等。
这种方法有一个警告,即不会自动下载/安装依赖项。您必须手动跟踪它们。
另外,APT显然不了解这些软件包,因此它将永远显示为缺少。但这很有意义-谁想要安装取决于用户安装的系统范围的应用程序。
如果要卸载程序,可以使用列出deb存档的内容,ar p "$1" data.tar.xz | tar tJ
然后从中删除所有这些文件PREFIX
。