我们有一个 2005 年安装的旧服务器(Fedora Core 4)。该服务器从未更新过。它运行一个特殊的软件,可以在不直接连接到外界的情况下监控生产线。
升级系统是没有问题的。
某些实用程序存在错误或缺少选项。缺少其他一些实用程序。
我必须在此服务器上安装一些脚本。主要问题是 Bash 实在是太老了并且缺少一些有用的东西。我不喜欢破解那些经过良好测试的脚本的想法。
有没有办法运行较新的 Bash 并安装新程序,同时让系统保持不变?
也许像 BusyBox 那样?或者在 chroot 内? chroot 的问题是难以访问真实系统。例如我的备份脚本将无法工作。
答案1
我认为最简单的方法是将程序和库从另一个安装批量复制到单独的目录中。例如,从像 systemrescuecd 这样的 live-cd 中,它可能包含您需要的所有内容,仅几百兆字节,复制到 /opt/new/ 中。这允许您复制而无需搜索/查找/猜测/测试需要哪些库。
然后,您可以使用LD_LIBRARY_PATH=/opt/new/lib/ ; /opt/new/bin/diff
或运行这些程序LD_LIBRARY_PATH=/opt/new/lib/ ; /opt/new/bin/bash
。这应该可以完美地工作,直到实用程序不再读取它们不再理解的旧配置文件。或者更糟糕的是,直到他们不写入为止。
一旦成功,您可以将新库复制到 /lib/ 中,以便忘记 LD_LIBRARY_PATH 技巧。只要文件名不冲突,这就是安全的(我认为,欢迎其他建议)。
如果您敢的话,甚至可以用新的二进制文件替换旧的二进制文件(仅适用于选定的二进制文件),但这对于生产服务器来说可能不是一个好主意。
答案2
您可以在专用用户的主目录中编译并安装所需的工具。
该专用用户的环境变量应设置为首选可执行文件和库的本地版本,例如PATH
和LD_LIBRARY_PATH
。
所需的步骤类似于:
- 创建新用户:
cooluser
- 创建一个
~cooluser/Local
目录 ~cooluser/.profile
根据需要 编辑设置环境:PATH=${HOME}/Local/bin:${PATH}
LD_LIBRARY_PATH=${HOME}/Local/lib:${LD_LIBRARY_PATH}
- 下载所需工具的来源
- 配置该工具,以便将 intself 安装在
~cooluser/Local
- 例如
./configure --prefix=~cooluser/Local
- 例如
- 编译并安装
显然您需要gcc
机器上的许多其他开发工具。如果您没有它们,您可以在运行某些操作系统版本的另一台(虚拟?)机器上编译这些工具,并~cooluser/Local
在准备好时传输目录。
答案3
如果您要安装很多程序,手动维护它们将会很痛苦。我建议在 chroot 中安装较新的发行版。
如果您习惯了,可以安装 Fedora。我不知道它是否有帮助在 chroot 中安装的工具。如果没有,Debian 及其衍生版本会这样做,反引导程序。本指南可能有帮助。这样的旧版本 Fedora 没有 schroot,但您仍然可以安装 rpm。
如果您无法让 schroot 工作,请手动使用绑定挂载填充 chroot。如果您在 上安装了发行版/new
,并且没有使用 schroot,请将这些条目添加到/etc/fstab
:
/ /new/old rbind rbind
/dev /new/dev rbind rbind
/home /new/home rbind rbind
/tmp /new/tmp rbind rbind
proc /new/proc proc defaults
sysfs /new/sys sysfs defaults
由于您将使用绑定安装,请确保将备份脚本配置为不遍历任何绑定安装目录,否则您将备份它们两次,一次在原始位置,一次在新位置。
答案4
Bash 依赖于 libc,它太旧了,成功编译的机会非常有限。也许告诉我们你的 bash 版本缺少什么东西会有所帮助。