问题一览
站长在一次偶然使用yum更新软件包的时候,意外的出现如下故障
CRITICAL:yum.cli:Config error: Error accessing file for config file:///etc/yum.conf
已有解决方法一览
经过一番百度搜索,网上大部分的解决方法有如下几个
1.重新安装yum
2.重新创建/etc/yum.conf文件
3.使用rpm卸载当前安装的包
思考
问题说明,在经过一段时间的尝试之后,发现这些方法均为不行
在一次偶然中,发现了另外一个故障
#: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
则完全没问题。这又是什么情况呢。
第一次尝试
想了一个上午没想明白,但是灵光一闪,突然想到,站长之前因为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的链接
感谢博主,之前在换libc版本,然后就遇到了这个问题,按照其他博客的方法一直没有解决,原来还是libc库的问题
感谢支持