如何在非默认path上的Linux或Solaris上安装软件包?

通过“默认path”,我的意思是“ /usr/local ”,或其他由根pipe理的path(“系统path”)。

我必须在几个Linux(RedHat)或Solaris(10, 本地区域 )服务器上安装许多应用程序包(我的意思是: svnhttpdgitperlpython ,…)。

但:

  • 这些服务器pipe理许多不同的应用程序(有时使用不同版本的svn或perl或…)
  • 我不是这些服务器上的pipe理员(没有sudo root的我)

我尝试使用,例如在Solaris上, pkgadd -R尝试安装预编译的软件包在自定义path(即在特定用户的homedir内,而不是正常的默认path/usr/local/... ),但是说预编译的软件包都带有对/usr/...其他资源的引用:

ldd /path/to/local/installed/packages将显示许多对系统path的依赖关系:

 ldd /home/myuser/usr/local/git libz.so => /usr/local/lib/libz.so libiconv.so.2 => /usr/local/lib/libiconv.so.2 libsocket.so.1 => /usr/local/libsocket.so.1 ... 

这不会,因为:

  • 在Solaris中,我无法在/usr上写入任何内容,只能从全局区域写入,而不能从本地区域写入。
  • 在Solaris或Linux中,我不是root,所以我不能在系统path中写任何东西。
  • 我不pipe理这些服务器上的升级,所以如果任何库更改,它可能会打破我安装的许多服务。

为了在同一个(Linux或Solaris)服务器上以独立的方式安装不同的“服务” ,每个服务器都可能需要自己的版本(perl,python,…), 你会推荐做什么?

我在下面提出一个解决scheme,但是如果你有其他的select,我很感兴趣。

迄今为止唯一的解决scheme是:

  • 兼容安装( 作为非root )多个应用程序,
  • 允许每个应用程序拥有自己的一组依赖关系(从一组依赖关系到另一个依赖关系使用潜在的不同版本)

是:

重新编译一切

(一切,我的意思是即使gcc本身,如果需要,因为我们的Solaris服务器上默认安装的/usr/swf/bin/gcc甚至比先决条件gcc 3.4.6旧)

在这个全局重新编译中使用的所有版本都来自sunfreeware ,它将详细说明所有必要的依赖关系,并将提供一个指向每个包的源的链接。
这在Linux和Solaris上都可以使用。

每个软件包源被下载,编译并安装到$HOME/usr/local (即不在系统path中)。
关键是有一个.bashrc (例如)将改变$ PATH为了没有任何/usr/bin/usr/local/bin在里面,但只有$HOME/usr/local/bin


我发现随着时间的推移几个优点

  • /usr的库可能会更改,这对当前正在运行的几个服务没有影响(因为它们都已经被编译到自己的一组依赖项中,安装在$HOME/usr/local
  • 运行已编译应用程序的非root用户在他自己的环境中拥有相当多的root权限 ,并且该用户可以启动/终止/更新/重新编译$HOME/usr/local内的任何元素
  • $HOME创build一个新目录很容易,并且再次编译所有依赖项以testing给定应用程序的升级。 你可以结束几个版本的同一个软件包,并从一个版本到另一个版本进行testing/切换。
  • 你可以控制编译选项,如果你想要的话,编译一个Apache Httpd,并且所有的模块都可以被激活,这非常容易(相对于你预先编​​译好的包来说)。

主要缺点是:

  • 任何完整的编译都需要花费时间(Linux上最多1小时,Solaris上3-4小时)。
    但是你并不总是需要重新编译一切。
  • 每个软件包的编译选项都不相同,而且设置正确可能相当复杂
  • 使用正确的值设置环境variables( LDFLAGSCFLAGSCPPFLAGSLD_LIBRARY_PATH )可能非常棘手
  • 如果没有脚本能够为您提供正确的依赖关系并启动编译,那就意味着: 手动过程,这是一个拖动。
    (我正在制作该脚本,并将其发布到GitHub上)

有一个选项可以为每个服务设置一个chroot环境,并在其下安装这些包。 它肯定会引起一些膨胀,因为你需要基本上将很多库复制到chroot环境中。 但它确实将您的服务与其他人隔离,反之亦然,并使您能够对环境进行全面的(根本性)控制。

这仍然需要root权限来设置和访问chroot环境。

随后的访问可以使用例如SSH进行pipe理:

http://www.techrepublic.com/blog/opensource/chroot-users-with-openssh-an-easier-way-to-confine-users-to-their-home-directories/229

在Solaris上,您可以使用$ ORIGIN魔术字来定义RPATH。 例如,如果你有以下布局,你可以在你的二进制文件的RPATH中将RPATH定义为'$ ORIGIN /../ lib',并将-R标志传递给链接器。

 /usr/local/bin/foo /usr/local/lib/libfoo.so.1 

但是,如果布局是由用户指定的,则不起作用。 例如,用户可以将bindir设置为/ usr / local / bin / sparcv9和libdir到/ usr / local / lib / sparcv9。 在这种情况下,设置应该是$ ORIGIN /../../ lib / sparcv9。

传统上,为Solaris编译的所有二进制文件都使用硬编码的RPATH,这使得它们不可重定位。

还有一件事要看,可以configurationdynamic链接器。