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

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

我所说的“默认路径”是指“ /usr/local”,或者由根管理的其他路径(“系统路径”)。

我必须在一些 Linux(RedHat)或 Solaris (svn10 httpdgitperlpython本地区域) 服务器。

但:

  • 这些服务器管理许多不同的应用程序(有时使用不同的版本svn 或 perl 或 ...)
  • 我不是这些服务器的管理员(sudo root对我来说不行)

我尝试使用,例如在 Solaris 上,pkgadd -R尝试在自定义路径中安装预编译包(即在特定用户的主目录中,而不是在正常的默认路径中/usr/local/...),但所述预编译包都附带对其他资源的引用/usr/...

Aldd /path/to/local/installed/packages将显示许多依赖关系系统路径:

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,因此我无法在系统路径中写入任何内容。
  • 我不管理这些服务器上的升级,因此如果任何库发生变化,都可能会破坏我已安装的许多服务。

为了在同一台(Linux 或 Solaris)服务器上以隔离的方式安装不同的“服务”,您建议怎么做,每个都可能需要自己的版本(perl,python,...)?

我在下面提出了一个解决方案,但如果您有其他选择,我很感兴趣。

答案1

到目前为止我发现的唯一解决方案:

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

是:

重新编译所有内容

(我说的一切,甚至包括gcc它本身,如果需要的话,因为/usr/swf/bin/gcc我们的 Solaris 服务器上默认安装的版本甚至比先决条件gcc3.4.6 还要旧)

本次全局重新编译中使用的所有版本均来自太阳软件,其中将详细说明所有必要的依赖项,并提供每个软件包的源链接。
它适用于 Linux 和 Solaris。

下载、编译每个软件包源,并安装在$HOME/usr/local(IE不是在系统路径中)。
关键是要有一个.bashrc(例如)更改 $PATH为了使其中不包含任何/usr/bin或,而只有。/usr/local/bin$HOME/usr/local/bin


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

  • 中的库/usr可以更改,但这对当前正在运行的几个服务不会产生任何影响(因为它们都是在安装的一组依赖项上进行编译的$HOME/usr/local
  • 运行已编译应用程序的非 root 用户几乎在他自己的环境中,该用户可以启动/终止/更新/重新编译其中的任何元素$HOME/usr/local
  • 很容易在 中创建一个新目录$HOME并重新编译所有依赖项以测试给定应用程序的升级。您可以得到同一个包的多个版本,并从一个版本测试/切换到另一个版本。
  • 您可以控制编译选项,并且使用以下命令编译 Apache Httpd 非常容易全部如果需要,您可以在其中激活模块(与预编译的包相反,您可以根据需要获取所需的模块)。

主要缺点是:

  • 任何完整的编译都需要时间(在 Linux 上最多 1 小时,在 Solaris 上最多 3 到 4 小时)。
    但您并不总是需要重新编译所有内容。
  • 每个软件包的编译选项都不同,并且设置起来可能相当复杂
  • 环境变量(,,,LDFLAGS)的正确设置可能比较棘手CFLAGSCPPFLAGSLD_LIBRARY_PATH
  • 如果您没有能够为您提取正确的依赖项并启动编译的脚本,则意味着:手动的过程,这很麻烦。
    (我正在编写该脚本,并将在 GitHub 上发布)

答案2

有一个选项可以为每个服务设置一个 chroot 环境并在其下安装这些包。这肯定会带来一些麻烦,因为您需要将许多库复制到 chroot 环境中。但它确实将您的服务与其他人的服务隔离开来,反之亦然,并让您完全(像 root 一样)控制环境。

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

后续访问可以使用 SSH 等进行管理:

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

答案3

在 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,这使得它们不可重定位。

另一件值得关注的事情可能是克雷勒,允许配置动态链接器。

相关内容