yum命令报错undefined symbol: CRYPTO_num_locks

yum update报错原因及解决办法

问题描述

在执行yum update的时候,突然遇到如下问题:

-bash-4.2# yum update
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

问题原因

出现这个错误是因为 yum 在执行时依赖的 Python 模块 pycurl 出现了问题,具体是 pycurl 模块与当前的 Python 版本不兼容,导致无法正常工作。pycurl.so 文件中缺少 CRYPTO_num_locks 符号,通常是 OpenSSL 和 Python 版本之间的兼容性问题。

这里牵涉系统多个重要环境的相互问题:gcc和openssl之间有影响,openssl又影响python,python会影响到yum。

解决办法

因为OpensSSL的问题,包括curl, wget命令都不好用了。只能直接下载pycurl,重新安装解决:

源码编译安装pycurl

下载https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.5.tar.gz
安装:

tar -zxvf pypcurl-7.43.0.5.tar.gz
cd pycurl-7.43.0.5
python setup.py build
sudo python setup.py install

安装完成后,验证 pycurl 是否正确安装。你可以通过 Python 命令行来测试:

python -c "import pycurl; print(pycurl.__version__)"

执行yum update, 仍然报错

No module named yum 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 12 2013, 16:18:42) [GCC 4.8.2 20131017 (Red Hat 4.8.2-1)] If you cannot solve this problem yourself, please go to the yum faq at: http://yum.baseurl.org/wiki/Faq

可能是系统存在多个版本的python,即有python2.x.x,又有python3.x.x。

但是yum必须使用python2.x.x。

方法是:执行如下命令找到系统中所有的python2.x.x版本:

find / -type f -executable -name 'python2*'

输出可能类似于这样:

/usr/bin/python2.6
/usr/bin/python2.7


对每一个,运行:

/usr/bin/python2.x

然后在弹出的提示中,输入:

>>> import yum

找到那个不报错的python,然后再运行如下命令,找到yum使用的python的路径:

cat `which yum` | head -1

输出结果可能是:

#!/usr/bin/python2

然后运行:

ln -s /usr/bin/python2.x /usr/bin/python2

用正常的python版本替换yum使用的python即可。

在 CentOS 7 系统中,使用 `yum` 时遇到 `/usr/lib64/python2.7/site-packages/pycurl.so: undefined symbol: CRYPTO_num_locks` 错误,通常是由于 `pycurl` 模块与当前系统中使用的 OpenSSL 版本不兼容所致。此问题通常出现在系统升级了 OpenSSL 库之后,导致 `pycurl` 仍试图调用旧版本中已弃用的符号 `CRYPTO_num_locks`,而该符号在新版本中已被移除[^1]。 ### 问题原因 `pycurl` 是基于 `libcurl` 构建的 Python 模块,而 `libcurl` 又依赖于系统的 OpenSSL 库。当 OpenSSL 被升级到 1.1.x 版本后,`CRYPTO_num_locks` 函数已被移除,但旧版本的 `pycurl` 仍尝试调用该函数,从而引发符号未定义错误。这种情况会导致 `yum` 命令无法正常运行,因为 `yum` 依赖于 Python 的 `pycurl` 模块进行网络请求[^2]。 ### 解决方案 #### 方法一:更新 `pycurl` 模块 通过升级 `pycurl` 到兼容 OpenSSL 1.1.x 的版本(如 7.43.0 及以上),可以解决此问题。由于系统自带的 `pycurl` 可能无法直接升级,建议使用 `pip` 安装新版: ```bash pip install pycurl --upgrade --ignore-installed ``` 此操作将覆盖系统默认的 `pycurl` 模块,并使用与新版本 OpenSSL 兼容的实现,从而修复符号缺失问题[^3]。 #### 方法二:回退 OpenSSL 版本 如果无法升级 `pycurl`,可以考虑将 OpenSSL 降级到 1.0.x 版本。此方法适用于无法更改 `pycurl` 的环境,但需要注意降级 OpenSSL 可能会影响其他依赖其新功能的服务。 ```bash # 安装 EPEL 仓库 yum install epel-release # 安装旧版本 OpenSSL yum downgrade openssl-1.0.2k-21.el7_9.x86_64 ``` 此操作需确保系统中所有依赖 OpenSSL 的服务兼容 1.0.x 版本,否则可能导致其他组件异常。 #### 方法三:使用替代源重新安装 `pycurl` 如果系统中已有多个版本的 Python 或 `pycurl` 混乱,建议使用 `easy_install` 或 `pip` 指定 Python 2.7 的路径重新安装: ```bash /usr/bin/easy_install-2.7 pycurl ``` 此方式可确保新版本的 `pycurl` 被正确安装到 Python 2.7 的路径下,避免与系统模块冲突[^4]。 ### 验证修复 完成上述操作后,运行以下命令验证 `yum` 是否恢复正常: ```bash yum clean all yum makecache yum update ``` 若不再出现 `undefined symbol: CRYPTO_num_locks` 错误,则表示问题已解决。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值