非根软件包管理器


51

从我的研究中,我似乎注意到所有软件包管理器都坚持要以特权用户身份使用,并且必须将其安装到中/

通常,我想做的是创建一个一次性帐户,编译一些软件,然后安装$HOME该帐户。我可以尝试各种设置,然后在完成后销毁该帐户。

但是,编译软件变得乏味。

我的经验确实仅限于yum,但我不明白为什么我无法将回购文件放入其中,~/etc/yum.repos.d而无法将所有内容安装到家庭帐户中。

有什么理由为什么必须将软件包管理员用作特权用户来安装软件?

Answers:


35

二进制软件包的编译是假设它们将安装到中的特定位置/。这并不总是容易改变的,并且需要额外的QA努力(首先这很困难!)来确定特定二进制文件是否可重定位。

在某种程度上,您可以使用fakechroot之类的内容以非root用户身份在子目录中创建整个系统,但这是乏味且脆弱的。

使用源代码包会更好。 Gentoo PrefixRootless GoboLinux都是软件包管理器,它们可以安装在非/位置,并且非root用户可以使用。


3
我要补充说,有2种可重定位性。软件包可以假设它总是在某个地方,或者其他东西在某些地方(例如/bin),或者可以假定它安装在--prefix指定的地方。尽管后者可能会被那些项目解决,但是前者需要在源代码上打补丁。
Maciej Piechotka,2011年

Gentoo前缀,无根和Nix的另一种选择是pkgsrc。它来自NetBSD,但可以在多种平台上使用。
Michael Ekstrand 2012年

2
二进制软件包的编译是假设它们将被安装到特定的位置,/这听起来像是一项要求,也许在30年前就可以了,但现在还没有。例如,该env程序不是要解决此类问题吗?如果不是这样,很容易想到一种配置任何二进制文件以在特定位置查找其他二进制文件的方案。
Piotr Dobrogost

1
@PiotrDobrogost可以扩展到是,可以扩展到不可以。例如,对于/etc或(根据我的知识)/usr/lib/<packagename>/或没有环境变量/usr/libexec/<packagename>//usr/share可以通过本世纪某个时候发布的XDG变量进行更改,并且不一定在较早的程序中采用。
Maciej Piechotka 2015年

28

有一个软件包管理器项目-Nix-一个有趣的基础思想(“ 功能性 ” pkg管理器),它还支持按用户操作:

多用户支持

从版本0.11开始,Nix具有多用户支持。这意味着非特权用户可以安全地安装软件。每个用户可以具有不同的配置文件,即Nix存储区中出现在用户PATH中的一组软件包。如果用户安装了另一个用户先前已安装的软件包,则不会再次构建或下载该软件包。同时,一个用户不可能将特洛伊木马注入到可能被另一用户使用的程序包中。

我要补充的注意事项: Nix应该可以在您选择的类Unix系统中使用(例如Linux发行版)。

可以通过Nix软件包管理器( Nixpkgs)安装相关的大量软件包,这些软件包是为许多平台构建的

  • 32位和64位x86上的GNU / Linux(i686-linux和x86_64-linux)
  • Mac OS X(i686-darwin和x86_64-darwin)
  • FreeBSD(i686-freebsd和x86_64-freebsd)
  • OpenBSD(i686-openbsd)
  • Windows / Cygwin(i686-cygwin),

和相关的发行版-NixOS

NixOS是基于Nix的Linux发行版。它不仅使用Nix进行软件包管理,还使用它来管理系统配置(例如,在/ etc中构建配置文件)。这意味着,除其他事项外,可以轻松地将系统的整个配置回滚到较早的状态。另外,用户可以安装没有root特权的软件。阅读更多…

以及相关的“连续”构建系统Hydra


4
不错的总结。最近宣布了GNU Guix。基于nix的GNU软件包管理器。savannah.gnu.org/forum/forum.php?forum_id=7436
达沃拉克2012年

2
@Davorak nix和之间的区别是什么guix。既然现在我真的nix在工作中使用,我想知道是否可以考虑将其guix作为所需工具的另一种实现。我可以在某处阅读差异摘要吗?也许,您甚至可以在这里用这样的总结写一个答案,宣布另一个替代解决方案?
imz –伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2015年

6

首先,这是由于依赖性。用户可能未安装某些软件包-如PolicyKit。因此,这将给打包者贡献额外的负担,他们需要提供空闲时间,并且通常安装程序就像键入sudo(单用户工作站)或烦扰管理员一样容易。

$ HOME中有安装选项

  • 语言原始的“程序包管理器”通常开箱即用(如Ruby的gem或Haskell的cabal)或稍作调整(我为python忘了名字)就支持它。
  • 好旧的./configure --prefix=$HOME/sandbox --enable-cool-feature && make all install(或类似jhbuild的变体)。
  • 程序在$ HOME几年前安装。但是我找不到它-我猜几乎没有人使用过它们,因为他们是自己安装的,也可能是管理员。

1
我真的看不出这是多么令人信服的论点。仅仅因为一个软件包因为没有被作为root调用而无法工作并不意味着这个想法是不可行的。预计PolicyKit在这种情况下不起作用。没有root特权也可以安装许多其他软件包。我知道软件包管理器(Python是EasyInstall),但是它们并不像yum或apt-get那样在全球范围内适用。有人知道Maciej所指程序的名称吗?
Elmt 2011年

1
@elmt:可能是stow,可能仍然会让您感兴趣(但这是一种工具,而不是软件包的源代码)。
吉尔(Gilles)“所以,别再邪恶了”,

@Gilles:不-它具有GUI,并且被认为是“简单的”。我想目前的方向更多是突触/包装套件。
Maciej Piechotka'1

6

我使用JuJu,它基本上允许在$ HOME / .juju目录中有一个非常小的linux发行版(仅包含软件包管理器)。

它允许通过proot访问位于主目录中的自定义系统,因此,您可以安装没有root特权的任何软件包。它可以在所有主要的Linux发行版上正常运行,唯一的限制是JuJu可以在最低建议版本2.6.32的linux内核上运行。


4

另一个型号截然不同的是0install。它基于这样的想法:您实际上并没有安装软件包,而只是从全局名称空间运行它们,该名称空间会下载,必要时进行编译并缓存要使用的软件。


4

如果您擅长从源代码进行编译并自行解决依赖项,主要是希望包管理器处理部署/取消部署/升级操作,那么您可能想看看GNU Stow或经过某种程度改进的XStow。使用它们,您可以将安装阶段转移到一个单独的目录(通常在下$PREFIX/stow),然后从您的真实前缀开始存放到软件的符号链接。这样就很容易将其完全删除。我成功地使用它来管理我所在大学的自定义安装软件。


3

我的经验确实仅限于yum,但我不明白为什么我无法将回购文件放入〜/ etc / yum.repos.d并让yum将所有内容都安装到家庭帐户中。

主流的Linux软件包管理器将世界视为sysadmin,它将机器视为单个实体。这使您可以获得诸如“系统X适用于哪些未解决的勘误表”和“系统X与系统Y有何不同”之类的问题的答案。这还允许yum具有可用的“历史记录”,具有rpmdb版本以及执行“ yum --security update”等操作。

有一些软件包管理器,例如“零安装”,它们试图像用户那样查看世界……即。什么应用程序有机会获得。

您可能会认为后者是更好的模型,但是IMNSHO的原因是您没有听说过零安装,但听说过yum。


2

有一个新成员即将到来:“ JuNest(被监禁的用户NEST)-基于Arch Linux的发行版,可在任何Linux发行版上运行而无需root访问。” @https ://github.com/fsquillace/junest 优点是它没有引入新的软件包格式,因此在非常容易安装(最少:约320M)之后,便有了完整的Arch Linux存储库(超过13000个)包ATM)就在您的指尖。


1

具体来说installpkg,Slackware使用的工具可以。从手册页:

--root /otherroot
       Install using a location other than / (the default) as the root of the 
       filesystem to install on. In the example given, use /otherroot instead.
       Setting the ROOT environment variable does the same thing.

但是,我不知道能做到这一点的任何更好的前端(例如slapt-get,据我所知,不能做到这一点)。从理论上讲,你应该能够别名installpkginstallpkg --root ~/Apps-不过,我认为最前端需要root运行,这违背了点。



0

Yum需要写入数据库,该数据库由root拥有。因此,您不能以普通用户的身份使用它。

您可以尝试在所选目录内解压缩rpm文件(rpm2cpio package.rpm | cpio -idmv)。

但是,当您执行程序时,必须注意修改LD_LIBRARY_PATH以便加载从属库。同样,这将不会处理任何依赖项。

例:

# mkdir new_root
# cd new_root
# wget ftp://mirror.switch.ch/pool/4/mirror/centos/6.7/os/x86_64/Packages/vim-enhanced-7.4.629-5.el6.x86_64.rpm
# rpm2cpio vim-enhanced-7.4.629-5.el6.x86_64.rpm | cpio -idmv
# ./usr/bin/vim -version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jul 24 2015 02:23:23)

上面没有任何依赖的库,否则您将不得不使用类似的东西:

export LD_LIBRARY_PATH=./usr/lib ./usr/bin/program
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.