解决CentOS的yum命令失效的问题

近日笔者对一台装有 CentOS 7.9 系统的服务器反复折腾,玩到最后发现 yum 命令用不了,总是报下面的错误信息:

复制代码
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   /usr/lib64/python2.7/site-packages/pycurl.so: undefined symbol: CRYPTO_num_locks

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.7.5 (default, Nov 14 2023, 16:14:06) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

If you cannot solve this problem yourself, please go to 
the yum faq at:
  http://yum.baseurl.org/wiki/Faq

服务器原先装有 Python 2.7.5,因我安装了 Python 3.10,怀疑是版本冲突造成,尝试删除 Python 3.10 后仍然无济于事,这下 yum 被我玩坏了。yum 命令是基于 Python 2.7.5版的,尽管我尝试使用 pip install yum 也不能重新安装 yum。

我在网上搜了很多解决yum无法使用的问题的文章,绝大部分文章都虎头蛇尾,没有根本解决问题,后来找到下面一文给我提供灵感:

成功解决静态链接库无法yum安装问题!

十分感谢博主"就想做一条闲鱼"。

上面报错信息中提及 /usr/lib64/python2.7/site-packages/pycurl.so 这个文件,我们查看一下这个文件的情况。

CRYPTO_num_locks 是 OpenSSL 库中的一个函数,用于处理加密操作中的锁管理。

在某些版本的OpenSSL中,CRYPTO_num_locks 函数用于获取需要的锁数量,以确保线程安全。

这个函数在多线程应用中尤为重要,因为它帮助管理对加密操作的并发访问。

pycurl.so 是 pycurl 库的共享对象文件,它是 libcurl 的 Python 绑定。

pycurl 库用于在 Python 中执行 URL 请求和数据传输,底层依赖 libcurl 库,而 libcurl 又依赖于 OpenSSL 库来处理 HTTPS 连接和加密操作。

1、查看依赖关系

bash 复制代码
ldd /usr/lib64/python2.7/site-packages/pycurl.so

输出内容类似:

复制代码
        linux-vdso.so.1 =>  (0x00007ffd0d9fe000)
        libcurl.so.4 => /usr/local/lib/libcurl.so.4 (0x00007f0ddb670000)
        libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f0ddb2a4000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0ddb088000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f0ddacba000)
        libnghttp2.so.14 => /lib64/libnghttp2.so.14 (0x00007f0ddaa92000)
        libssl.so.10 => /lib64/libssl.so.10 (0x00007f0dda820000)
        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f0dda3bd000)
        ......

上面提及 pycurl.so 与 libcurl 息息相关,我把命令改一下:

bash 复制代码
ldd /usr/lib64/python2.7/site-packages/pycurl.so | grep "libcurl"

筛选出下面的信息:

2、查看 libcurl 相关的文件

执行命令:

bash 复制代码
ll /usr/local/lib/libcurl*

结果显示:

由此可见,系统中存在多个版本的 libcurl 库,包括 libcurl.so.4.7.0、libcurl.so.4.8.0,以及相应的符号链接(libcurl.so和libcurl.so.4)。

忽然想起来我就是不久前反复安装不同版本的 curl,可能导致 pycurl.so 链接到错误版本的libcurl,引发 yum 无法使用,报出 undefined symbol: CRYPTO_num_locks 错误。

3、删除链接文件

bash 复制代码
cd /usr/local/lib
rm -rf libcurl.so
rm -rf libcurl.so.4

至此,CentOS 的 yum 命令就恢复正常了!

这种问题通常是由库文件冲突或不兼容引起的,解决方法是确保程序加载的是系统默认的库文件,避免自定义安装的库文件干扰系统工具的运行。

相关推荐
David猪大卫27 分钟前
【Linux修炼】环境变量、进程地址空间
linux·c语言·经验分享·笔记·学习·ubuntu·centos
飞飞传输1 小时前
飞驰云联文件交换建设方法论:从单点传输到持续治理
大数据·运维·安全
叼烟扛炮2 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php
Ruiery2 小时前
Linux 6.6内核内存管理深度解析(十五):CMA 连续内存分配器
linux·运维·服务器
测试界的小码农3 小时前
【Linux 命令实战(01):认识 Linux 终端,从零掌握第一个命令】
linux·运维·服务器
布裘3 小时前
【银河麒麟】重启后时区丢失?排查发现 localtime 被业务程序替换成硬链接
linux·运维·网络
huainingning4 小时前
锐捷10.X路由器版本升级不生效问题排查
运维·网络·智能路由器
荣合技术服务4 小时前
HPC 超算集群故障维修实录:找荣合科算维护后,模拟仿真计算又能跑了
运维·服务器·超算服务器·荣合科算
GeW6 小时前
高端化转型进入“补底层”阶段:Linux与数据库的再定位
linux
silent6 小时前
龙芯3B6000M运行Yolov8+FastApi
linux·loongarch·loongnix·龙芯