it-swarm.cn

有什么方法可以获取APT将软件包安装到我的主目录吗?

有什么办法让 [〜#〜] apt [〜#〜] 将软件包安装到我的主目录?

我不想在整个系统范围内进行更改。

另外,是否有任何基于主目录的linux软件包管理器?

42
Joel McCracken

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

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

#debootstrap lenny lenny-chroot

这将在lenny-chroot目录中创建Lenny chroot。

现在我们可以输入chroot:

# chroot lenny-chroot

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

17
David Pashley

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

引用文档,Linuxbrew功能包括:

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

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

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

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

7
hayalci

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

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

4
the dsc

您可以使用 fakechroot -在其网站上查看演示。

2
niutech

不,我认为你不能。

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

另一个是使用dpkg -X将其解压缩到您选择的目录中。

1
ynimous

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

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

1
ephemient

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

1
Ian Kelling

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

因此,通常我首先使用apt-get download package_name下载一个deb文件。然后,我运行./install package_name_blabla.deb,并手动确定解压缩文件中/usr的每次出现,是否应该用$PREFIX/usr代替。

该决定完全取决于系统安装了哪些软件包以及使用此方法安装了哪些软件包。通常,例如pkg-config文件需要此替换,而诸如#!/usr/bin/Perl之类的Shebang行则不需要。一般的经验法则是,生成的路径应指向现有文件。

使用这种方式安装软件包后,您显然需要以某种方式告诉其他程序有关它们的信息。这可以通过将正确的值附加到LD_LIBRARY_PATHPATHPYTHONPATHPKG_CONFIG_PATHCMAKE_MODULES_PATHCMAKE_PREFIX_PATH等来实现。

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

另外APT显然不知道这些软件包,因此它将永远显示为缺少。)但这很有意义-谁想安装依赖于用户的安装。

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

0
Martin Pecka

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

我能想到的最好的环境是chroot的环境,就像人们在64位系统上处理32位应用程序一样。就像在chroot中调用debootstrap一样,这会增加开销,但是在Shell包装器脚本很有趣的情况下, symlinking ,它可能会做您想要的。

0
kbyrd

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

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

0
Rory

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

0
Perkins

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

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

rpm --initdb --dbpath DIRECTORY

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

  • --prefix
  • --relocate
0
Andrew Case

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

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

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

0
Jeremy Bouse