问题发生

试图通过编译安装升级Linux服务器的glibc库版本,install失败以后,shell中的大部分命令(ls,cat,rm,cp,ln,scp,vi,yum等)都执行报错,尝试新的ssh连接时提示拒绝连接。

命令报错类似:

# ls
ls: relocation error: /usr/lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference

或者

bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

可补救·操作空间

  • 有ssh客户端连接着这台服务器没有断开
  • 原始的低版本glibc库文件还在
  • cd,pwd,export,echo,sln,chmod命令可用,输入ls+两次TAB键可以提示目录下所有文件

开始尝试修复

步骤1

glibc是Linux系统底层库,许多shell命令乃至bash本身都依赖这套动态链接库。
以上问题出在/lib64(/usr/lib64)目录下的软连接损坏,或连接的so库文件版本不统一,或所连接的so库文件本身存在问题。
解决思路就是把以下软连接全部恢复为指向原始版本(低版本)。
前提是先到/lib64目录下,用ls+两次TAB键的方法确认好自己系统下的libc-<x.xx>.so最低版本号(也就是好用的版本)是哪个。

lrwxrwxrwx.  1 root root       10 Jul  4 16:55 ld-linux-x86-64.so.2 -> ld-2.17.so
lrwxrwxrwx.  1 root root       14 Jul  4 16:55 libanl.so.1 -> libanl-2.17.so
lrwxrwxrwx.  1 root root       23 Jul  4 16:55 libBrokenLocale.so.1 -> libBrokenLocale-2.17.so
lrwxrwxrwx.  1 root root       15 Jul  4 16:55 libcidn.so.1 -> libcidn-2.17.so
lrwxrwxrwx.  1 root root       16 Jul  4 16:55 libcrypt.so.1 -> libcrypt-2.17.so
lrwxrwxrwx.  1 root root       12 Jul  4 16:55 libc.so.6 -> libc-2.17.so
lrwxrwxrwx.  1 root root       13 Jul  4 16:55 libdl.so.2 -> libdl-2.17.so
lrwxrwxrwx.  1 root root       12 Jul  4 16:55 libm.so.6 -> libm-2.17.so
lrwxrwxrwx.  1 root root       14 Jul  4 16:55 libnsl.so.1 -> libnsl-2.17.so
lrwxrwxrwx.  1 root root       21 Jul  4 16:55 libnss_compat.so.2 -> libnss_compat-2.17.so
lrwxrwxrwx.  1 root root       17 Jul  4 16:55 libnss_db.so.2 -> libnss_db-2.17.so
lrwxrwxrwx.  1 root root       18 Jul  4 16:55 libnss_dns.so.2 -> libnss_dns-2.17.so
lrwxrwxrwx.  1 root root       20 Jul  4 16:55 libnss_files.so.2 -> libnss_files-2.17.so
lrwxrwxrwx.  1 root root       21 Jul  4 16:55 libnss_hesiod.so.2 -> libnss_hesiod-2.17.so
lrwxrwxrwx.  1 root root       22 Jul  4 16:55 libnss_nisplus.so.2 -> libnss_nisplus-2.17.so
lrwxrwxrwx.  1 root root       18 Jul  4 16:55 libnss_nis.so.2 -> libnss_nis-2.17.so
lrwxrwxrwx.  1 root root       18 Jul  4 16:55 libpthread.so.0 -> libpthread-2.17.so
lrwxrwxrwx.  1 root root       17 Jul  4 16:55 libresolv.so.2 -> libresolv-2.17.so
lrwxrwxrwx.  1 root root       13 Jul  4 16:55 librt.so.1 -> librt-2.17.so
lrwxrwxrwx.  1 root root       15 Jul  4 16:55 libutil.so.1 -> libutil-2.17.so

步骤2

由于ln命令已经不能使用,可使用sln命令,创建/修复软连接。命令格式:sln <被指向的文件> <软连接名>。假设需要回退到版本号XXX,那么只需以下命令就可以修复。

cd /lib64
sln  ld-XXX.so              ld-linux-x86-64.so.2
sln  libanl-XXX.so          libanl.so.1
sln  libBrokenLocale-XXX.so libBrokenLocale.so.1
sln  libcidn-XXX.so         libcidn.so.1
sln  libcrypt-XXX.so        libcrypt.so.1
sln  libc-XXX.so            libc.so.6
sln  libdl-XXX.so           libdl.so.2
sln  libm-XXX.so            libm.so.6
sln  libnsl-XXX.so          libnsl.so.1
sln  libnss_compat-XXX.so   libnss_compat.so.2
sln  libnss_db-XXX.so       libnss_db.so.2
sln  libnss_dns-XXX.so      libnss_dns.so.2
sln  libnss_files-XXX.so    libnss_files.so.2
sln  libnss_hesiod-XXX.so   libnss_hesiod.so.2
sln  libnss_nisplus-XXX.so  libnss_nisplus.so.2
sln  libnss_nis-XXX.so      libnss_nis.so.2
sln  libpthread-XXX.so      libpthread.so.0
sln  libresolv-XXX.so       libresolv.so.2
sln  librt-XXX.so           librt.so.1
sln  libutil-XXX.so         libutil.so.1

至此,如果没有操作错误,ls等关键命令、包括ssh连接都应该已经可以正常使用,修复完成。


但是,由于笔者操作过程中的失误(“sln xxx yyy"写成了"sln yyy xxx”),导致ld-2.17.so原始库文件被覆盖成软连接文件,所以需要进一步的补救。

误操作后的二次补救

解决思路就是恢复不小心损坏的ld-2.17.so文件,那么就需要一份可用的ld-2.17.so文件数据。由于笔者使用的是服务器集群,原始文件从其他节点就可以获取。如果是单机服务器,可能需要借助互联网获取ld-2.17.so原始文件。

目前最大的阻碍是:scp,mount,wget等命令都不能使用,需要考虑如何将获取到的原始文件放到问题服务器的磁盘上——解决方法是echo命令+重定向输出文件,具体展开如下:

  1. 以文本编辑器(例如使用Windows上的EmEditor)的二进制模式打开原始文件,全选复制出文件的原始字节内容,如下:
7F 45 4C 46 02 01 01 00  00 00 00 00 00 00 00 00  03 00 3E 00 01 00 00 00  20 11 00 00 00 00 00 00
40 00 00 00 00 00 00 00  48 77 02 00 00 00 00 00  00 00 00 00 40 00 38 00  07 00 40 00 1C 00 1B 00
01 00 00 00 05 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
A0 18 02 00 00 00 00 00  A0 18 02 00 00 00 00 00  00 00 20 00 00 00 00 00  01 00 00 00 06 00 00 00
40 1B 02 00 00 00 00 00  40 1B 22 00 00 00 00 00  40 1B 22 00 00 00 00 00  38 14 00 00 00 00 00 00
10 16 00 00 00 00 00 00  00 00 20 00 00 00 00 00  02 00 00 00 06 00 00 00  00 1E 02 00 00 00 00 00
......(共5107行,略)......
  1. 继续编辑文本,替换复制内容中的" “(1个空格)和” “(2个空格)替换为”\x",并且在每行首也插入"\x",如下:
\x7F\x45\x4C\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x3E\x00\x01\x00\x00\x00\x20\x11\x00\x00\x00\x00\x00\x00
\x40\x00\x00\x00\x00\x00\x00\x00\x48\x77\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x38\x00\x07\x00\x40\x00\x1C\x00\x1B\x00
\x01\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\xA0\x18\x02\x00\x00\x00\x00\x00\xA0\x18\x02\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00
\x40\x1B\x02\x00\x00\x00\x00\x00\x40\x1B\x22\x00\x00\x00\x00\x00\x40\x1B\x22\x00\x00\x00\x00\x00\x38\x14\x00\x00\x00\x00\x00\x00
\x10\x16\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x00\x1E\x02\x00\x00\x00\x00\x00
......(共5107行,略)......
  1. 合并所有行为一行,并去掉所有空格,如下:
\x7F\x45\x4C\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x3E\x00\x01\x00\x00\x00\x20\x11\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x48\x77\x02......(略)......
  1. 将编辑后的十六进制数据与echo命令参数一起,组成echo -e "编辑后的16进制数据" > ~/savetheworld.bin的形式,粘贴到连接着问题服务器的ssh终端,执行。
  2. 经过漫长的等待之后(以小时记,因为回显很慢。可灵活利用shell客户端中类似CommandWindow的功能,在输入框中输入命令来节省时间),生成的~/savetheworld.bin文件就作为损坏的ld-2.17.so文件的替代,重新用上文sln修复软连接的方法,最终修复成功。

END

Linux服务器升级GLIBC失败导致shell不可用的问题解决经历相关推荐

  1. 【原创】大叔经验分享(27)linux服务器升级glibc故障恢复

    redhat6系统默认安装的glibc-2.12,有的软件依赖的是glibc-2.14,这时需要升级glibc,下载安装 http://ftp.gnu.org/gnu/glibc/glibc-2.14 ...

  2. CentOS7升级glibc失败导致系统崩溃

    挂载iso镜像 首先通过镜像启动进入CentOS7的救援模式(单用户模式应该也可以,但没有测试过),并将根目录挂载到/mnt/sysimage目录下.创建镜像挂载目录/mnt/cdrom并将镜像重新挂 ...

  3. Linux中升级GLIBC,终结版,测试通过

    CentOS升级GLIBC 应用场景,在运行软件时发生GLIBC-2.xx found-等信息,基本确定是核心库glibc的版本低导致.解决方案之一,升级glibc,当然操作有风险,需谨慎.这也是网上 ...

  4. Linux升级glibc版本汉字乱码,Linux CentOS6升级glibc库过程

    CentOS6升级glibc库过程 hadoop无法加载native库,可能原因是 glibc库版本过低,需要升级. 第一:安装以下软件 yum -y install zlib zlib-devel ...

  5. Linux服务器带宽占用高导致无法登录的处理经验分享

    Linux服务器带宽占用高的情况时有发生,许多情况我们可以通过查看后台运行指令和IP来源来简化处理.处理经验分享供大家参考! 使用 VNC 方式登录实例,针对云服务器进行排障及问题处理:(操作以 Ce ...

  6. linux服务器磁盘空间不足导致tar失败

    那是一天清晨,开发的大兄弟反馈,服务器突然tar不了包了:第一反应,肯定是命令敲错了,要不然就是有人在服务器上搞事情,内心如下图: 突然,业务测试又反馈图片上传不了服务器了,一如既往,到服务器日志目录 ...

  7. linux服务器升级 需要什么,linux服务器升级node版本

    最近部署前端代码时,发现服务器node版本太低,导致前端工程编译不成功.于是升级了一下 下载node安装包 这里我们在node官网下载LTS(即当前稳定版本),找到对应当前服务器环境的node,这里我 ...

  8. Linux配置脚本导出运行,linux服务器部署jar包以及shell脚本的书写

    背景:记录在linux环境下部署jar程序的过程 1 部署过程记录 1.1 程序结构 这里的main函数就在DemRest2.java 文件中. 为了部署方便,要做到以下两点: 1 在导出的jar包中 ...

  9. linux 系统安装 升级glibc库2.14

    首先要下载 rpm安装文件,使用rpm安装方式 如果直接下载 tar.gz压缩包,解压 ln -s -f /opt/glibc-2.14/lib/libc.so.6 /lib64/libc.so.6  ...

最新文章

  1. spring入门(二) 使用注解代替xml配置
  2. 用友服务器文件如何查找,如何查询用友t3服务器地址
  3. 自动装配——@Autowired 构造器,参数,方法,属性都是从容器中获取参数组件的值||自定义组件想要使用Spring容器底层的一些组件 ApplicationContext,BeanFactory
  4. Spark SQL玩起来
  5. math.sqrt 有问题_JavaScript中带有示例的Math.sqrt()方法
  6. C#处理JSON 数据
  7. qtableview点击行将整行数据传过去_掌握这15个可视化图表,小白也能轻松玩转数据分析...
  8. 使用 mybatis + flying + 双向相关建模 的电商后端
  9. DataList控件中使用Xml数据源
  10. trend函数用oracle实现,Excel函数TREND函数的用法
  11. 用Java实现24点游戏
  12. Android常见面试题字节跳动、阿里、腾讯2019实习生Android岗部分面试题
  13. Vant Webapp步骤表单
  14. linux无法安装at命令,在Ubuntu/Debian/CentOS/Fedora下安装At及各种At命令的用法
  15. 图像超分辨率重建(pytorch)
  16. PG服务进程(Postgres)——BeginReportingGUCOptions向客户端汇报GUC
  17. msata、mini pcie 、pcie x4接口引脚定义及原理图方案设计
  18. python sort 多级排序_python sort、sorted高级排序技巧
  19. 中兴智能视觉大数据研发人脸识别门禁考勤机、精准的人脸识别对比
  20. 小程序跳转到另一个小程序,参数传递以及调试,H5跳转小程序,小程序内嵌H5,

热门文章

  1. 频率与波长转换工具(十二)
  2. 微信小程序 | IM交友聊天功能大汇总
  3. 产品方法论总结(1)——产品思维产品设计的5个层次
  4. 解压密码忘记了怎么办
  5. C语言--日期问题(黑色星期五问题)
  6. Elasticsearch索引容量管理实践
  7. 根据经纬度获取地址 :位置名称 区 市 省 国家 邮编
  8. 近段时间的学习碎片整理(10)
  9. Ktx:简化Android开发的Kotlin库
  10. 计算机系女学霸,女学霸高考692分,未来想当“程序员”,霸气发言让男生无地自容...