抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

导览:涵盖 CentOS 7.9 系统下 yum 命令核心依赖报错的排查手册。记录从源码编译 OpenSSL、Zlib 到 libcurl 的完整操作及宝贵经验分享,同时提供基于 LD_PRELOAD 安全注入的管理指导。这个手册不仅为您提供详实的操作记录,还提供深入的问题解决思路。

CentOS 7.9 修复 yum 报错实验手册

介绍系统动态库冲突与问题背景

报错环境介绍

  • 生产环境中由于底层组件库被意外覆盖或升级,常会导致系统自带的 libcurl 与 Python/yum 产生严重的依赖冲突;
  • 报错核心体现为系统调用时触发 ENOENT 异常,Python 无法加载 yum 的 config 模块,提示 Error accessing file for config;
  • 为保证系统底层安全,我们需要建立独立的系统调用隔离区(/usr/local/syscall),并通过 LD_PRELOAD 环境变量劫持动态库加载路径,以模拟隔离恢复的方式解决冲突.

解决前的报错现象如下所示:

[root@WJ-M8-01 etc]# yum list
Failed to set locale, defaulting to C
CRITICAL:yum.cli:Config error: Error accessing file for config file:///etc/yum.conf

openat(AT_FDCWD, "/usr/lib/python2.7/site-packages/yum/config.so", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python2.7/site-packages/yum/configmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python2.7/site-packages/yum/config.py", O_RDONLY) = 4
openat(AT_FDCWD, "/usr/lib/python2.7/site-packages/yum/config.pyc", O_RDONLY) = 5
CRITICAL:yum.cli:Config error: Error accessing file for config file:///etc/yum.conf

下面是这个博客要实现的内容主题,通过源码独立编译构建纯净依赖链来彻底修复此问题。


独立编译底层依赖链

1. 编译安装 OpenSSL 1.1.1w

为了不干扰原系统,我们将编译产出统一放入 /usr/local/syscall 目录下:

# wget "[https://gh-proxy.org/https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz](https://gh-proxy.org/https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz)"
# mkdir -p /usr/local/syscall
# tar -xvf openssl-1.1.1w.tar.gz
# cd openssl-1.1.1w
# ls
# ./config --prefix=/usr/local/syscall --openssldir=/usr/local/syscall/openssl shared zlib
# make -j 4
# make install

2. 编译安装 Zlib 1.2.13

继续为 libcurl 准备独立的 zlib 依赖库:

# cd /usr/local/src
# wget [https://zlib.net/fossils/zlib-1.2.13.tar.gz](https://zlib.net/fossils/zlib-1.2.13.tar.gz)
# tar -xvf zlib-1.2.13.tar.gz
# cd zlib-1.2.13
# ls
# ./configure --prefix=/usr/local/syscall/
# make -j 4
# make install

3. 编译定制版 Curl (libcurl.so.4)

核心编译步骤,将 ssl 和 zlib 指向我们刚才建立的隔离目录,并精简不必要的模块:

# cd /usr/local/src
# wget [https://curl.se/download/curl-7.85.0.tar.gz](https://curl.se/download/curl-7.85.0.tar.gz)
# tar -xvf curl-7.85.0.tar.gz
# cd curl-7.85.0
# ls
# ./configure --prefix=/usr/local/syscall --libdir=/usr/local/syscall/lib64 --with-ssl=/usr/local/syscall --with-zlib=/usr/local/syscall --disable-curl --disable-manual --disable-ldap --disable-ldaps --without-libpsl --without-libidn2 --without-nghttp2 --without-librtmp --without-gssapi --without-libssh2 --enable-shared --enable-static --disable-curldebug
# make -j 4
# make install

验证与终极修复

验证动态库链接状态

编译完成后,确认新生成的库文件能够正常寻址:

# ldd /usr/local/syscall/lib64/libcurl.so.4
# ls -l /usr/local/syscall/lib64/libcurl.so.4

# 对比环境中其他已有应用的 libcurl 指向(例如 gitlab 环境下的自带库)
# history | grep gitlab
# ldd /opt/gitlab/embedded/lib/libcurl.so.4
# ls -l /usr/local/syscall/lib64/libcurl.so.4
# ldd /usr/local/syscall/lib64/libcurl.so.4

实施一键修复方案

利用 LD_PRELOAD 变量优先加载我们编译的健康依赖库,完美恢复 yum 运行且不影响系统其他组件:

# 临时配置别名进行修复注入
# alias yum='LD_PRELOAD=/usr/local/syscall/lib64/libcurl.so.4 yum'

# 验证效果,yum list 恢复正常输出
# yum clean all
# yum list

评论