关于CRITICAL:yum.cli的一个解决方法记录

道锋潜鳞
2023-06-28 / 2 评论 / 165 阅读 / 正在检测是否收录...

问题一览

站长在一次偶然使用yum更新软件包的时候,意外的出现如下故障


CRITICAL:yum.cli:Config error: Error accessing file for config file:///etc/yum.conf

已有解决方法一览

经过一番百度搜索,网上大部分的解决方法有如下几个

1.重新安装yum
2.重新创建/etc/yum.conf文件
3.使用rpm卸载当前安装的包

202307030938544074.png

思考

问题说明,在经过一段时间的尝试之后,发现这些方法均为不行
在一次偶然中,发现了另外一个故障

#:curl http://www.baidu.com
curl(6):Could not resolve host: http; Unknown error

这又是什么情况,难道正常curl不是应该会解决http协议头的问题吗?

接下来,在yum的一次报错中,我又注意到了一个点,yum在这次报错中,同样也出现了

#:curl <a mirror>
curl(6):Could not resolve host: http; Unknown error

这个问题?

由此,联想到可能是因为curl的问题。可问题来了,curl为什么会出问题?

如果将请求协议去掉,换成

[root@dwXEapYVRDHb ~]# curl www.baidu.com

202307030939492150.png

则完全没问题。这又是什么情况呢。

第一次尝试

想了一个上午没想明白,但是灵光一闪,突然想到,站长之前因为centos7.9的glibc版本过低,手动编译安装了glibc-2.29,原ldd版本为2.17,升级后变为2.29。想到在更新之前完全没有问题,更新后才发现这个故障。有很大理由怀疑是这个问题

于是乎想到了libcurl

libcurl是c/cpp使用时的链接库,常用的http get,post请求,http,ftp下载等都支持

curl的功能实现是依赖libcurl.so这个动态链接库的,通常位于/lib64或者/usr/lib64中,4.x版本的链接库地址为libcurl.so.4

使用ll查看这个链接库软连接指向

[root@dwXEapYVRDHb lib64]# ll | grep libcurl
lrwxrwxrwx   1 root root    16 Jun 28 14:15 libcurl.so -> libcurl.so.4.3.0
lrwxrwxrwx   1 root root    16 Jun 28 14:15 libcurl.so.4 -> libcurl.so.4.3.0
-rwxr-xr-x   1 root root  429K Nov 17  2020 libcurl.so.4.3.0
[root@dwXEapYVRDHb lib64]# 

可以看到,系统版本中的libcurl位4.3版本,似乎与glibc的2.29差距较大,4.3作为比较老的版本,可能不能支持glibc2.29的运行时(虽然说还是想不明白,这东西不是向下兼容吗)

于是尝试更新libcurl.so

前往 https://curl.haxx.se/download.html 下载了最新的curl包,libcurl也包含在其中。截止完篇,curl版本最新为8.1.2,libcurl版本为4.8.0

[root@dwXEapYVRDHb envs]# wget https://curl.se/download/curl-8.1.2.tar.gz
[root@dwXEapYVRDHb envs]# tar xvf curl-8.1.2.tar.gz
[root@dwXEapYVRDHb envs]# cd curl-8.1.2
#编译设置,这里如果包暂时没有,可以先临时编译一次,等yum修复后,再完整编译一次替换
#注意,请勿使用openssl11 如果openssl11的cflags会导致yum出现另外一个问题
#使用默认安装的openssl就行,如果没有,那很抱歉,找个教程,编译一个吧
[root@dwXEapYVRDHb envs]# ./configure --with-openssl --with-amissl --with-bearssl --with-gnutls --with-mbedtls --with-schannel --with-secure-transport --with-nghttp2 --with-nghttp3  --with-ngtcp2 --enable-websockets --with-quiche --with-msh3
#加速编译
[root@dwXEapYVRDHb envs]# make -j 4
[root@dwXEapYVRDHb envs]# make install

到这里,不出意外的话,你已经编译好了最新的curl,但是还没结束,libcurl.so.4.x不会移动到你的lib目录里面,如果你怕出现问题,你可以选择export LD_LIBRARY_PATH到

<你的编译目录>/lib/.lib

下,当然也可以选择将

<你的编译目录>/lib/.lib

下的 libcurl.so.4.x 直接复制到/lib64中

#复制头包
[root@dwXEapYVRDHb envs]# \cp -rf <你的编译目录>/include/curl/ /usr/include/
#复制库
[root@dwXEapYVRDHb envs]# cp <你的编译目录>/lib/.lib/libcurl.so.4.8.0 /lib64
#切入目录
[root@dwXEapYVRDHb envs]# cd /lib64
#删除原有4.3.0的so
#删除的是软连接,没有安全问题,4.3.0的原文件是同目录下的libcurl.so.4.3.0
[root@dwXEapYVRDHb lib64]# rm -rf libcurl.so.4
[root@dwXEapYVRDHb lib64]# rm -rf libcurl.so
#创建4.8.0的软连接
[root@dwXEapYVRDHb lib64]# ln -s libcurl.so.4.8.0 libcurl.so
[root@dwXEapYVRDHb lib64]# ln -s libcurl.so.4.8.0 libcurl.so.4

测试

使用curl再次测试同样的命令

[root@dwXEapYVRDHb lib64]# curl https://pic.loongapi.com/
... ....

正常了

使用yum再试试

[root@dwXEapYVRDHb lib64]# yum update
No packages marked for update

没问题了

插曲

如果使用了openssl11的话,curl正常的时候,yum会提示pycurl.so异常

报错大概如下:

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

网上提供的很多方法都是说ldconfig的问题

但是实测极大可能是因为编译的时候用了openssl11或者只创建了libcurl.so.4的链接没创建libcurl.so的链接

1

评论 (2)

取消
  1. 头像
    Cherry
    Windows 10 · Google Chrome

    感谢博主,之前在换libc版本,然后就遇到了这个问题,按照其他博客的方法一直没有解决,原来还是libc库的问题

    回复
    1. 头像
      道锋潜鳞 作者
      Android · Google Chrome
      @ Cherry

      感谢支持

      回复