有什么办法让APT将软件包安装到我的主目录?


Answers:


17

Dpkg不具有RPM的--relocate功能。值得考虑的是,有多少RPM软件包支持该功能。基本上,这是无法完成的。

如果要在系统上全局安装某项之前进行测试,则可以使用chroot。为此,您需要能够访问root用户。要做的第一件事是创建一个基本的chroot:

#debootstrap lenny lenny-chroot

这将在lenny-chroot目录内创建一个Lenny chroot 。

现在我们可以输入chroot:

# chroot lenny-chroot

现在,我们可以执行所需的操作并安装任何东西,而不会破坏系统的其余部分。完成后,只需键入exit或按ctrl-D


8

Linuxbrew是Linux的另一个非根软件包管理器(基于流行的OS X Homebrew软件包管理系统),可从源代码进行编译并将二进制文件保留在主目录中。

引用文档,Linuxbrew功能包括:

  • 可以将软件安装到主目录,因此不需要sudo
  • 安装本机发行版未打包的软件
  • 在本机发行版较旧时安装最新版本的软件
  • 使用同一个程序包管理器来管理Mac和Linux计算机

7

Gentoo前缀完全可以满足您的需求。

它将所有软件包安装到指定目录中。无需root访问权限。如果要摆脱它,只需删除基本目录即可。

PS:这不适用于Ubuntu> = 11.04或任何其他具有Multiarch的Debian衍生产品。


1
Gentoo是从源代码构建的,发帖者似乎想通过软件包安装到特定目录。那不是真的一样。
安德鲁·凯斯

1
我相信@AndrewCase Gentoo也有软件包。它们不是二进制文件这一事实与最终安装无关。
jiggunjer '17

4

就像编译选项的次要补充一样,还有一个中途选择:在编译时使用不同的前缀选项编译到一个包中(使用“ checkinstall”或其他方法)。好处是该软件包将出现在软件包管理器上,例如智能或突触。

除此之外,我认为在某些情况下可能可以下载实际的.deb并通过dpkg install强制使用不同的前缀,但是我认为任何随机软件包都无法做到这一点,但是必须使用安装前导出的位置变量(而不是文字的显式前缀)。我对该程序一无所知,谷歌搜索“ dpkg instdir prefix”。



1

无根GoboLinux可以完全满足您的要求:在您自己的主目录中,没有提升特权的程序包管理器。希望你知道自己在做什么;rootless并不是Gobo上维护最完善的安装模式,几年前我使用它时,需要进行一些调整,因为相对于其他Gobo更改,安装脚本已经过时了。

也有klik可以重新打包很多.debs,可以将软件包安装到您的主目录,并且不需要root特权即可操作...但是初始设置确实需要root。


1

我通常会获取源代码并签出“ INSTALL”之类的文件。通常有说明要做./configure --prefix=somedir。然后,您必须添加somedir/bin到您的路径。


很难获取,编译和保持依赖项更新。
Paolo

这是倒退。问题在于如何使程序包管理器(自1990年代以来更受欢迎)以这种方式运行。
与莫妮卡(Monica)进行的轻量级比赛(

1

不,我认为你不能。

我现在能想到的最好的办法就是使用apt-get source和编译您的软件包。也许您可以以某种方式调整该过程(可以或多或少地自动化)以将软件包安装到家中。

另一种是用于将dpkg -X其提取到您选择的目录中。


0

在极少数情况下,您需要将软件包安装到主文件夹中。

但是,您可以编译软件并将其安装到本地计算机。只需解压缩,然后使用./configure --prefix=$HOME/local或其他目录进行配置即可。然后make,您可以make install像往常一样。这将编译并安装该程序~/local/,例如,您要执行的程序将在其中~/local/bin/programmname


0

根据我自己的经验,没有简单的方法可以使用现有的DEB软件包将其安装到不是chroot环境的另一个目录中。Debian / Ubuntu安装工具dpkg / aptitude / dselect都需要root特权才能正常运行。

现在有了源DEB,您可以修改Debian / rules文件以构建软件包并安装到其他目​​录树中,但是此时您将不使用已经可用的二进制软件包。

正如其他人提到的那样,您可以使用debootstrap并轻松地构建chroot环境,我过去已经在64位主机上实现了32位环境,但这需要安装至少复制了基本软件包的chroot。如果有足够的空间,并且这是一个可行的解决方案,则可以将其与dchroot,甚至更好地结合使用schroot,以轻松执行chroot环境中安装的应用程序。


0

我很难想象这将如何与发行版中的官方存储库一起使用。它应该如何解决依赖关系?从系统还是从主目录?如果两者都找到不同的版本怎么办?

我能想到的最好的环境是chroot的环境,就像人们在64位系统上对32位应用程序所做的那样。与在chroot中调用debootstrap相比,这会产生更多开销,但是由于有了一些symlinking和shell wrapper脚本,它可能会做您想要的事情。


0

我仍然在解决这个问题,但是基本上可以解除所需的引导,并且应该与fakeroot一起使用。debootstrap只是一堆shell脚本,因此我将其分解以查看是什么使它滴答作响。困难的部分将是在安装文件后将其卸载。


我(以及成千上万的其他用户)将全心全意地鼓励这样做。可以利用已有的系统范围内的rpm(或apt替代)数据库以及用户提供的rpm数据库来安装用户定位的rpm。这将是惊人的。这甚至可以合并到主线中。以前有做过任何研究吗?
安德鲁·凯斯

0

不幸的是,我还没有听说过提供这种发行版的发行版(尽管我确信它会超级流行)。您也许可以模仿基于rpm的发行版...我还没有尝试过,但是您可能可以构建基于用户的rpm数据库,然后将rpm安装到用户数据库中。

尝试使用以下方法建立一个新的基于用户的发行版:

rpm --initdb --dbpath DIRECTORY

然后,有几个选项可能会有所帮助:

  • --prefix
  • --relocate

0

我有一个解决方案,我已经成功地使用它在学校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_PATHPATHPYTHONPATHPKG_CONFIG_PATHCMAKE_MODULES_PATHCMAKE_PREFIX_PATH等。

这种方法有一个警告,即不会自动下载/安装依赖项。您必须手动跟踪它们。

另外,APT显然不了解这些软件包,因此它将永远显示为缺少。但这很有意义-谁想要安装取决于用户安装的系统范围的应用程序。

如果要卸载程序,可以使用列出deb存档的内容,ar p "$1" data.tar.xz | tar tJ然后从中删除所有这些文件PREFIX

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.