首页 > 系统相关 >Linux服务器升级GLIBC失败导致shell不可用的问题解决经历

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

时间:2024-02-04 10:14:50浏览次数:32  
标签:00 shell libnss GLIBC sln so Linux x00 root

转自

https://blog.csdn.net/u010549608/article/details/126281354?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170696599716800182728626%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170696599716800182728626&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-126281354-null-null.142^v99^pc_search_result_base6&utm_term=relocation%20error%3A%20%2Flib64%2Flibc.so.6%3A%20symbol%20_dl_starting_up%2C%20version%20GLIBC_PRIVATE%20not%20defined%20in%20file%20ld-linux-x86-64.so.2%20with%20link%20time%20reference&spm=1018.2226.3001.4187

问题发生
试图通过编译安装升级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
1
2
或者

bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
1
可补救·操作空间
有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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
步骤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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
至此,如果没有操作错误,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命令+重定向输出文件,具体展开如下:

以文本编辑器(例如使用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
2
3
4
5
6
7
继续编辑文本,替换复制内容中的" “(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
2
3
4
5
6
7
合并所有行为一行,并去掉所有空格,如下:
\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终端,执行。
经过漫长的等待之后(以小时记,因为回显很慢。可灵活利用shell客户端中类似CommandWindow的功能,在输入框中输入命令来节省时间),生成的~/savetheworld.bin文件就作为损坏的ld-2.17.so文件的替代,重新用上文sln修复软连接的方法,最终修复成功。
END
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/u010549608/article/details/126281354

标签:00,shell,libnss,GLIBC,sln,so,Linux,x00,root
From: https://www.cnblogs.com/wcxia1985/p/18005640

相关文章

  • Linux如何查询是哪些进程占用了端口
    Addressalreadyinuse这个提示,想必大家遇到过,怎么能快速找到问题并解决呢?下面有几种姿势可以了解一下.在对网络连接或特定于应用程序的问题进行故障排除时,首先要检查的事情之一应该是系统上实际使用了哪些端口,以及哪个应用程序正在侦听特定的端口。本文介绍了如何使用netstat,s......
  • Docker笔记(一)docker 在linux里面的安装
    Docker笔记(一)docker在linux里面的安装为什么使用docker(docker理念)在开发环境,将源码+配置+软件等其他项目运行的所有的东西,都打包,直接都给运维,这样运维就不需要自己搭建项目运行的环境了,因为你已经拿到了开发人员本地的全部的东西,相当于拿到开发人员全部的东西,直接在运维那里就......
  • Nexpose v6.6.236 for Linux & Windows - 漏洞扫描
    Nexposev6.6.236forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,ReleaseFeb02,2024请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序搜集通过实时覆盖整个网络,随......
  • Shell条件判断:使用[]还是[[]]
    https://mp.weixin.qq.com/s/Gzv2o90dwUlBIDFcnSWpIA在编写Bash脚本时,逻辑表达式通常放在方括号[]中,但实际上,还有另一种方括号[[]]可供选择。这两种方括号在用法和功能上存在一些差异。本文将重点介绍[[]]的优势,并揭示如何判断当前环境是否支持Bash。一、[]与[[]]的区别标准......
  • 如何优化Linux服务器的性能和响应速度?
    Linux服务器是一种常用的服务器操作系统,为了保证系统的稳定和高效运行,优化服务器的性能和响应速度显得尤为重要。如何优化Linux服务器的性能和响应速度?1.系统调整内核参数优化:调整Linux内核参数可以提升服务器的性能。例如,通过修改文件/etc/sysctl.conf来设置TCP/IP相关参数,如增......
  • Linux调度pick_next_task_fair整体框架解读
    pick_next_task_fair是CFS调度类中选择next任务的主要路径,其主要功能是从当前CPU的就绪队列cfs_rq中选出一个可运行的任务作为"next任务",并将前一个任务prev重新放到就绪队列。 下面是这段代码框架流程解读。1判断rq->cfs.nr_running>0?如果不满足说明没有可运行任务则gotoidl......
  • linux清理磁盘空间
    根目录/仍然使用了100%的空间,可能会导致系统运行受阻。可以尝试以下方法来释放根分区的空间:删除不需要的文件:检查根目录中是否有不必要的文件或目录,并删除它们以释放空间。清理日志文件:检查/var/log/目录中是否有大型日志文件,并根据需要删除或归档它们。清理软件......
  • linux 查看端口并关闭端口命令
    1.查看服务器端口情况:lsof-i:端口号(lsof-i需要root用户的权限)相关命令:lsof-i:8080--查看8080端口占用lsofabc.txt--显示开启文件abc.txt的进程lsof-cabc--显示abc进程现在打开的文件lsof-c-p1234--列出进程号为1234的进程所打开的文件lsof-ggid--显示归......
  • Splunk Enterprise 9.2.0 (macOS, Linux, Windows) - 机器数据管理和分析
    SplunkEnterprise9.2.0(macOS,Linux,Windows)-机器数据管理和分析SIEM、全面的日志管理和分析平台请访问原文链接:https://sysin.org/blog/splunk-9/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org混合世界的数据平台快速、大规模地从可见性转向行动,以实现安......
  • linux的java服务启动,停止sh脚本
    #!/bin/bash#######################################################Copyright2019PhamNgocHoai##LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#Youmay......