RedHat 服务器离线安装不匹配软件引起的故障及修复

这里简述一起在 RedHat 6.5 服务器上错误强制离线安装 CentOS 7 (或者 RedHat 7,这里假设为 CentOS 7)软件包后导致的服务器 rpm 命令失效,ssh 不能连接的情况。并给出相应的修复方法。
先说一下结论:rpm 命令失效和 ssh 不能连接是强制新安装的包依赖的基础库在 RedHat 6 的系统上版本不匹配。修复方式是卸载或用原系统包强制覆盖错误安装的软件包。下面在 VirtualBox 虚拟机上显示一下破坏和修复的过程。视频演示地址:https://www.bilibili.com/video/BV1wL4y1G72b?share_source=copy_web

一、强制安装 CentOS 7 软件包

故障的起因是这台服务器不能连接互联网,需要离线编译安装某软件。于是,服务器的管理员在网上搜索到一篇离线安装此软件的文章,按照文章的方法,用文章中分享的百度网盘的安装包进行离线安装。但是可能是管理员是初学者或者疏忽了没有发现,文章中分享的安装包文件名里面都有 el7,对 RedHat 系有所了解的朋友都知道这些软件包都是 7 系列的,6系统的包名应该是 el6。加之这篇分享的文章里面没有明确是用于什么版本的系统。于是就杯剧了,用文中 rpm 命令安装这些包后,rpm 不能再用了,新执行的 ssh 客户端也无法连接上了。详情如下:

[root@rhel65 test]# ls
cpp-4.8.5-16.el7.x86_64.rpm               openssl098e-0.9.8e-29.el7.centos.3.x86_64.rpm
gcc-4.8.5-16.el7.x86_64.rpm               openssl-1.0.2k-8.el7.x86_64.rpm
glibc-devel-2.17-196.el7.x86_64.rpm       openssl-devel-1.0.2k-8.el7.x86_64.rpm
glibc-headers-2.17-196.el7.x86_64.rpm     openssl-libs-1.0.2k-8.el7.x86_64.rpm
kernel-headers-3.10.0-693.el7.x86_64.rpm  zlib-1.2.7-17.el7.x86_64.rpm
libmpc-1.0.1-3.el7.x86_64.rpm             zlib-devel-1.2.7-17.el7.x86_64.rpm
mpfr-3.1.1-4.el7.x86_64.rpm
[root@rhel65 test]# rpm -Uvh *.rpm --nodeps --force
warning: cpp-4.8.5-16.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                ########################################### [100%]
   1:zlib                   ########################################### [  8%]
   2:mpfr                   ########################################### [ 15%]
   3:libmpc                 ########################################### [ 23%]
   4:openssl-libs           ########################################### [ 31%]
   5:cpp                    ########################################### [ 38%]
   6:zlib-devel             ########################################### [ 46%]
   7:kernel-headers         ########################################### [ 54%]
   8:glibc-headers          ########################################### [ 62%]
   9:glibc-devel            ########################################### [ 69%]
  10:gcc                    ########################################### [ 77%]
  11:openssl-devel          ########################################### [ 85%]
  12:openssl                ########################################### [ 92%]
  13:openssl098e            ########################################### [100%]

[root@rhel65 test]# rpm
rpm: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/lib64/libz.so.1) # rpm 命令无法使用了

# 再执行 
littlebat@i7:~$  ssh root@192.168.1.16
ssh_exchange_identification: read: Connection reset by peer # 新执行的ssh客户端无法连接了

二、系统修复
因为系统故障是错误安装软件造成,所以卸载或用原系统包强制覆盖错误安装的软件包就行。但是安装软件的命令 rpm 已经不能用了。我们先修复 rpm。

从上面执行 rpm 命令的报错信息“rpm: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/lib64/libz.so.1)” 来看,是 rpm 调用的 libz.so.1 动态链接库没有匹配的 libc.so.6 。用 yum provides /lib64/libz.so.1 可知 libz.so.1 是属于 zlib 软件包。只要指定调用原来系统版本的 libz.so.1 就可能正常使用 rpm 来强制安装 RedHat 6.5 系统的 zlib 软件包。从而恢复 rpm 的正常使用。
从网上下载 rhel-server-6.5-x86_64-dvd.iso :http://download.wx.51idc.com:8000/%B2%D9%D7%F7%CF%B5%CD%B3/redhat/6.5/x86_64/rhel-server-6.5-x86_64-dvd.iso

从里面取出原版的 zlib-1.2.3-29.el6.x86_64.rpm ,用 rhel-server-6.5-x86_64-dvd.iso 启动系统,在 救援模式下执行:

rpm2cpio zlib-1.2.3-29.el6.x86_64.rpm | cpio -idmv

然后在 chroot 环境下强制覆盖安装 zlib :

LD_PRELOAD=./lib64/libz.so.1 rpm -Uvh zlib-1.2.3-29.el6.x86_64.rpm --nodeps --force

LD_PRELOAD 的作用就是调用解压出的原系统的 libz.so.1,这个 libz.so.1 是与原系统里的 libc.so.6 匹配的。于是 rpm 就可以正常工作,并且强制修复安装上系统原版本的 zlib 包。

然后,尽量卸载掉新安装的错误的包。

rpm -e openssl-devel zlib-devel cpp gcc libmpc mpfr openssl098e

但是有的强制安装的包无法正常卸载了,因为系统中有的包会依赖于它。如执行:

rpm -e glibc-devel

会报错,原系统中正常的包 perl-devel 是依赖它的:
error: Failed dependencies:
glibc-devel is needed by (installed) perl-devel-4:5.10.1-136.el6.x86_64

保险起见,对于这类不能正常卸载的包,我们采取挂载DVD,强制覆盖安装原版的相应软件包的方法:

rpm -Uvh openssl098e*x86_64.rpm openssl-1.0.1e*x86_64.rpm glibc-devel*x86_64.rpm glibc-headers*x86_64.rpm kernel-headers*x86_64.rpm --nodeps --force

卸载在原版系统中正常应该不存在的 openssl-libs 包。

rpm -e openssl-libs

修复完毕,重启进入系统。测试一下 rpm、yum、ssh 连接正常了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注