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

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

我不想对系统进行更改。

或者,有没有任何家庭目录的Linux包pipe理器?

Dpkg没有RPM具有的–relocatefunction。 值得考虑的是有多lessRPM包支持这个function。 基本上,这是不能做到的。

你可以做的是使用一个chroot,如果你想testing一些东西,然后在系统上全局安装。 要做到这一点,你需要能够访问根。 首先要做的是创build一个基本的chroot:

  #debootstrap lenny lenny-chroot 

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

现在我们可以inputchroot了:

 # chroot lenny-chroot 

现在我们可以做任何我们想做的事情,并安装任何东西,而不会弄乱系统的其他部分。 完成后,只需键入exit或按ctrl-D即可

Gentoo前缀正是你想要的。

它将所有软件包安装到指定的目录中。 不需要root权限。 如果你想摆脱它,只要删除基本目录。

  • 查看开发人员的post了解一些介绍。
  • 详细的用例
  • 安装(?)信息
  • 项目页面

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

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

引用文档,Linuxbrew的特点是:

  • 可以将软件安装到主目录,因此不需要sudo
  • 安装未由本地分发包打包的软件
  • 当本地发行版本较旧时,请安装最新版本的软件
  • 使用相同的软件包pipe理器来pipe理您的Mac和Linux机器

除了编译选项外,还有一个中途选项,在编译时使用不同的前缀选项编译成一个包(使用“checkinstall”或其他方法)。 优点是软件包将显示在软件包pipe理器上,如aptitude或synaptic。

除此之外,我认为在某些情况下可能会下载实际的.deb文件,并通过dpkg install来强制使用不同的前缀,但是我认为这不是随便什么软件包都可以完成的,但是它们已经被编译它们的位置的一些variables(而不是字面显式前缀),你会在安装之前导出。 我不知道有关该程序的任何信息,谷歌为“dpkg instdir前缀”。

你可以使用fakechroot – 看看他们的网站上的演示。

Rootless GoboLinux可以完全按照你要求的方式进行操作:在你自己的主目录下,没有提升特权的包pipe理器。 希望你知道你在做什么; 无根并不是Gobo中维护得最好的安装模式,几年前当我使用它时,由于安装脚本相对于其他Gobo更改有点过时,所以需要进行一些调整。

也有klik重新打包了几个.deb s,可以将软件包安装到你的主目录,并且不需要root权限来操作…但是初始化设置确实需要root权限。

我通常得到的来源,并检查出一个文件,如“安装”。 通常有指令要做./configure --prefix=somedir 。 那么你必须添加somedir/bin到你的path。

不,我不认为你可以。

我现在能想到的最好的方法就是使用apt-get source并编译你的包。 也许你可以以某种方式调整程序(可以是更多或更less的自动化)来安装你的家中的软件包。

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

很less有情况下需要将软件包安装到主文件夹。

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

根据我自己的经验,使用现有的DEB软件包安装到另一个不是chroot环境的目录是不容易的。 Debian / Ubuntu安装工具dpkg / aptitude / dselect都需要root权限才能正常运行。

现在给定DEB源代码,你可以修改Debian / rules文件,让软件包生成并安装到不同的目录树中,但是你没有使用已经可用的二进制包。

正如其他人所提到的,你可以使用debootstrap并轻松地构build一个chroot环境,在过去我已经在64位主机上创build了一个32位环境,但是这需要至less安装一个至less包含基本包的chroot。 如果你有足够的空间,这是一个可行的解决scheme,你可以将它与dchroot ,甚至更好的schroot耦合,以方便在chroot环境中安装的应用程序的执行。

我很难想象这将如何与分配的官方软件库一起工作。 它应该如何解决依赖关系? 从系统或从您的主目录? 如果在两个版本中都find不同的版本呢?

我能想到的最好的办法就是像64位系统上的32位应用程序一样使用chroot环境。 这是更多的开销,因为你会在chroot中调用debootstrap,但有一些符号化 ,shell包装脚本的乐趣,它可能会做你想做的。

我仍然在解决这个问题,但是基本上是你需要的,并且应该和fakeroot一起工作。 debootstrap只是一堆shell脚本,所以我把它分开,看看是什么让它打勾。 硬件部分将在安装后卸载文件。

不幸的是,我还没有听说过任何提供类似这样的发行版(尽pipe我确信它会超级stream行)。 您可能能够模仿基于rpm的发行版,尽pipe…我还没有尝试过,但是您可能能够构build基于用户的rpm数据库,然后将rpm安装到用户数据库中。

尝试设置一个新的基于用户的发行版:

rpm --initdb --dbpath DIRECTORY

然后有几个选项可以帮助:

  • --prefix
  • --relocate

我有一个解决scheme,我已经成功地用于在学校的Debian服务器上安装一个大量的合作软件包,在那里我根本没有root权限(甚至没有安装另一个软件包pipe理器)。 它不使用deboostrap或任何包pipe理器。

该方法是部分手动的,但我已经尽我所能使它方便。

它使用我称之为install这个脚本(不要忘了chmod +x它):

 #!/bin/bash # PREFIX is the installation root, ie 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/usrreplace。

这个决定完全取决于哪些软件包是系统安装的,哪些是使用这种方法安装的。 通常,例如pkg-config文件需要这个replace,而像#!/usr/bin/perl这样的shebang行则不需要。 一般的经验法则是生成的path应该指向一个现有的文件。

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

这种方法有一个警告,依赖关系不会自动下载/安装; 你必须手动跟踪他们。

另外APT显然不知道这些包,所以它会永远显示他们失踪。 但这是有道理的 – 谁愿意安装依赖于用户安装的系统范围的应用程序。

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