1 问题背景
近期又遇到多起升级过程中报错,报错信息为 “can not clean repo info before upgrade”,如下图所示:
这是因为在待升级节点执行 dnf clean all
命令时报错
此时很多朋友会有疑问:我的操作系统没有装 dnf ,我的操作系统上不能装 dnf ,等等,那么为什么要去执行 dnf clean all
命令呢?
这要从工具升级的原理说起,在报错信息的上面几行有这样的信息:
......
[ INFO ] - [initramfs]: start upgrade your system by dnf
[ INFO ] - [initramfs]: start construct dnf
[ INFO ] - [initramfs]: replace yum to dnf.
[ INFO ] - [initramfs]: start to delete yum
[ INFO ] - [initramfs]: construct dnf in your system success
[ INFO ] - [initramfs]: your system will use dnf to upgrade.
......
明显可以看到,工具做了一系列操作:
- 开始构建 dnf
- 使用 dnf 去替换 yum
- 开始删除 yum
- 成功在你的操作系统上构建 dnf
- 你的系统将使用 dnf 去升级
dnf 是 yum 的下一代版本,dnf 比 yum更快速和高效,并且 dnf 在解决软件包依赖关系方面比 yum 更强大和智能,能够更好地处理复杂的依赖关系,这也是为什么工具或者以后的操作系统都是用 dnf 作为包管理工具的原因
既然知道了症结所在,那么就可以对症下药了!
2 解决方案
2.1 执行 dnf clean all
命令查看报错
在待升级节点手动执行 dnf clean all
命令查看具体报错:
报错显示是和 openssl 的库文件有关,具体信息为:“这个错误表明你的系统中的 libldap
库试图使用 EVP_md2
这个加密库函数,但是这个函数在当前系统中的 OpenSSL 版本中不存在或未定义。EVP_md2
是一个散列函数,用于计算 MD2 散列值,但在较新版本的OpenSSL 中,可能已经将 MD2 作为过时的算法移除了。”
2.2 查看 openssl 版本
首先执行 rpm -qa | grep openssl
命令查看系统安装的 openssl 版本:系统安装的 openssl 版本为 1.0.2k
其次执行 openssl version -a
查看系统当前在用的 openssl 版本:系统在用的 openssl 版本为 1.1.1w
系统安装的 openssl 版本和在用的版本不同,那么高版本的 openssl 必然是编译安装的,在编译安装 openssl 时,又必须需要指定高版本 openssl 库文件的位置,否则不能正常使用
2.3 查看指定库的位置
在 Centos 操作系统中,总体有三种指定库文件位置的方式:
- 将库文件所在目录添加到
/etc/ld.so.conf
文件中 - 将库文件所在目录添加到指定文件,并将此文件放在
/etc/ld.so.conf.d/
目录中 - 将库文件所在目录添加到
LD_LIBRARY_PATH
环境便变量中
(1)针对前两种指定库文件的方式,可以使用以下方法排查:
① 确定编译安装的 openssl 库文件所在的目录:
② 查找该目录具体写到哪个地方了:
③ 从查找到的文件中注释掉该目录,之后执行 ldconfig
刷新动态链接库
④ 执行 dnf clean all
命令,若无报错则可以到前端点击“重试”按钮继续升级
(2)针对最后一种指定库文件的方式,可以使用以下方法排查:
① 确定编译安装的 openssl 库文件所在的目录:
② 查看 LD_LIBRARY_PATH
变量是否有定义此目录
③ 若有则从该变量中剔除该目录
④ 执行 dnf clean all
命令,若无报错则可以到前端点击“重试”按钮继续升级