我所说的“默认路径”是指“ /usr/local
”,或者由根管理的其他路径(“系统路径”)。
我必须在一些 Linux(RedHat)或 Solaris (svn
10 httpd
,git
perl
python
本地区域) 服务器。
但:
- 这些服务器管理许多不同的应用程序(有时使用不同的版本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 服务器上默认安装的版本甚至比先决条件gcc
3.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
)的正确设置可能比较棘手CFLAGS
CPPFLAGS
LD_LIBRARY_PATH
- 如果您没有能够为您提取正确的依赖项并启动编译的脚本,则意味着:手动的过程,这很麻烦。
(我正在编写该脚本,并将在 GitHub 上发布)
答案2
有一个选项可以为每个服务设置一个 chroot 环境并在其下安装这些包。这肯定会带来一些麻烦,因为您需要将许多库复制到 chroot 环境中。但它确实将您的服务与其他人的服务隔离开来,反之亦然,并让您完全(像 root 一样)控制环境。
这仍然需要 root 访问权限来设置和访问 chroot 环境。
后续访问可以使用 SSH 等进行管理:
答案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,这使得它们不可重定位。
另一件值得关注的事情可能是克雷勒,允许配置动态链接器。