有没有办法让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权限。 如果你想摆脱它,只要删除基本目录。
PS:这不适用于Ubuntu> = 11.04,或任何其他带有Multiarch的Debian衍生产品。
Linuxbrew是Linux的另一个非root软件包pipe理器(基于OS X常用的Homebrew软件包pipe理系统),可以从源代码编译并将二进制文件保存在主目录中。
引用文档,Linuxbrew的特点是:
除了编译选项外,还有一个中途选项,在编译时使用不同的前缀选项编译成一个包(使用“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/usr
replace。
这个决定完全取决于哪些软件包是系统安装的,哪些是使用这种方法安装的。 通常,例如pkg-config文件需要这个replace,而像#!/usr/bin/perl
这样的shebang行则不需要。 一般的经验法则是生成的path应该指向一个现有的文件。
用这种方式安装软件包,你显然需要以某种方式告诉其他程序。 这可以通过将正确的值附加到LD_LIBRARY_PATH
, PATH
, PYTHONPATH
, PKG_CONFIG_PATH
, CMAKE_MODULES_PATH
, CMAKE_PREFIX_PATH
等来实现
这种方法有一个警告,依赖关系不会自动下载/安装; 你必须手动跟踪他们。
另外APT显然不知道这些包,所以它会永远显示他们失踪。 但这是有道理的 – 谁愿意安装依赖于用户安装的系统范围的应用程序。
如果你想卸载一个程序,你可以使用ar p "$1" data.tar.xz | tar tJ
列出deb档案的内容。 ar p "$1" data.tar.xz | tar tJ
,然后从PREFIX
删除所有这些文件。