升级过程遇到 can not clean repo info before upgrade 报错的解决方案

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.co.conf 文件中
  • 将库文件所在目录添加到指定文件,并将此文件放在 /etc/ld.so.conf.d/ 目录中
  • 将库文件所在目录添加到 LD_LIBRARY_PATH 环境便变量中

(1)针对前两种指定库文件的方式,可以使用以下方法排查:

① 确定编译安装的 openssl 库文件所在的目录:

② 查找该目录具体写到哪个地方了:

③ 从查找到的文件中注释掉该目录,之后执行 ldconfig 刷新动态链接库

④ 执行 dnf clean all 命令,若无报错则可以到前端点击“重试”按钮继续升级

(2)针对最后一种指定库文件的方式,可以使用以下方法排查:

① 确定编译安装的 openssl 库文件所在的目录:

② 查看 LD_LIBRARY_PATH 变量是否有定义此目录

③ 若有则从该变量中剔除该目录

④ 执行 dnf clean all 命令,若无报错则可以到前端点击“重试”按钮继续升级

7 Likes

清晰且全面,牛的 :clap:

1 Like

学习了

此贴必火,赞一个!

此贴必火

大佬厉害