通过“默认path”,我的意思是“ /usr/local ”,或其他由根pipe理的path(“系统path”)。
我必须在几个Linux(RedHat)或Solaris(10, 本地区域 )服务器上安装许多应用程序包(我的意思是: svn , httpd , git , perl , python ,…)。
但:
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 ...
这不会,因为:
/usr上写入任何内容,只能从全局区域写入,而不能从本地区域写入。 为了在同一个(Linux或Solaris)服务器上以独立的方式安装不同的“服务” ,每个服务器都可能需要自己的版本(perl,python,…), 你会推荐做什么?
我在下面提出一个解决scheme,但是如果你有其他的select,我很感兴趣。
迄今为止唯一的解决scheme是:
是:
重新编译一切
(一切,我的意思是即使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 ) $HOME/usr/local内的任何元素 $HOME创build一个新目录很容易,并且再次编译所有依赖项以testing给定应用程序的升级。 你可以结束几个版本的同一个软件包,并从一个版本到另一个版本进行testing/切换。 主要缺点是:
LDFLAGS , CFLAGS , CPPFLAGS , LD_LIBRARY_PATH )可能非常棘手 有一个选项可以为每个服务设置一个chroot环境,并在其下安装这些包。 它肯定会引起一些膨胀,因为你需要基本上将很多库复制到chroot环境中。 但它确实将您的服务与其他人隔离,反之亦然,并使您能够对环境进行全面的(根本性)控制。
这仍然需要root权限来设置和访问chroot环境。
随后的访问可以使用例如SSH进行pipe理:
在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链接器。