在 CentOS 7 上安全地升级 glibc

Pac*_*qui 11 update upgrade glibc libc6 centos7

我在 CentOS 机器上尝试了一个 python 应用程序,它给了我以下错误:

ImportError: /usr/lib64/libc.so.6: version `GLIBC_2.18' not found (required by /tmp/_MEI2BYIr4/libstdc++.so.6)
Run Code Online (Sandbox Code Playgroud)

我一直想升级 GLIBC,但是在阅读了一些论坛之后,我似乎可以破坏系统。你知道有什么替代方案吗?

谢谢

Sim*_*ood 17

检查它是否确实需要

首先检查 python 应用程序,因为它可能已经过时并且可能误读了glibc版本。CentOS 显示已安装的基本版本并已打补丁以跟上变化,这可能只是修复代码中正在寻找的版本作为快速修复的一种情况,但如果应用程序正在积极开发中,您需要如果可以,请让开发人员知道或自己分叉。

glibcCentOS 7 的最新版本应该是2.17-196.el7_4.2

如果需要,容器化

如果绝对有必要运行这个应用程序,官方的 RHEL 方法是容器化,但你仍然需要提供一个可用的 glibc,这在 CentOS 7 中是不可能的。

作为最后的手段,安装glibc在非标准位置

如果这不可行,并且作为绝对的最后手段,可以安装glibc比 2.18更新的版本,因为它已经有 9 年历史并且glibc已经针对多个漏洞进行了更新,我不确定如果它将使用makeCentOS 7 中的版本构建,但任何更新的版本都应按如下方式工作:

  • 这可能会影响您计算机的功能,因此请确保您知道自己在做什么

您可以glibc在服务器上的其他地方构建您需要的版本,并将其添加到LD_LIBRARY_PATH应用程序中。请注意,这必须仅针对应用程序执行。

wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
tar zxvf glibc-2.18.tar.gz
cd glibc-2.18
mkdir build
cd build
../configure --prefix=/opt/glibc-2.18
make -j4
sudo make install
Run Code Online (Sandbox Code Playgroud)

然后运行一个二进制文件,你需要用它patchelf来更新它的解释器

patchelf --set-interpreter /opt/glibc-2.18/lib/ld-linux-x86-64.so.2 program_you_are_running
Run Code Online (Sandbox Code Playgroud)

并且您需要启用它以查找新的 glibc 库,或者通过

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/glibc-2.18/lib
Run Code Online (Sandbox Code Playgroud)

或者您可以使用patchelf更新二进制文件的 rpath(您可以将其与上一个pathelf命令结合使用)

patchelf --set-rpath /opt/glibc-2.18/lib:/usr/lib64 program_you_are_running
Run Code Online (Sandbox Code Playgroud)

如果您更改,LD_LIBRARY_PATH请不要为整个系统导出它,因为所有未修改的二进制文件patchelf都会出现段错误。

/opt 是安装第三方应用程序和库的标准位置,但您可以使用系统路径以外的任何路径。

  • 在 _NON-standard_ 路径中安装库绝对没有错。这里的问题是 _exporting_ LD_LIBRARY_PATH,正如@PacoelCuqui 发现的那样,它破坏了一切,因为那样由任何带有导出的 shell 运行的所有程序都使用新的 libc。诀窍是不导出 LD_LIBRARY_PATH 而是将它放在命令行上需要它的唯一二进制文件之前:`$ LD_LIBRARY_PATH=/opt/glibc-2.18/lib my_special_program`。这里的一个复杂问题是它必须在 `python prog.py` 之前使用,这意味着 Python 也可以使用新的 libc 运行——这可能是一个问题。 (7认同)
  • 这是一种正确的答案,但它也非常危险。我认为这里的压力还不够。在 1990 年代末和 2000 年代初,当人们试图就地升级 glibc 时,我们花了数年时间处理损坏的系统。如果不小心,可能会不小心将系统 glibc 替换为不同版本并导致系统损坏。 (2认同)