全面解决/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.22‘下没有GLIBCXX_3.4.22和ImportError: /lib64/libc.so

2 篇文章 0 订阅
1 篇文章 0 订阅

重点: 修改前一定要备份,修改过程如果出现错误不要关闭ssh
修改需要修改两个so,也就是说需要准备好以下两步操作中符合要求的so,请先看完重点在进行操作,贸然修改会对服务器有严重损害,请备份,如果操作出错需急救直接进入出错以及修复教程

如果你准备好了两个符合依赖关系版本的so,那么第二步和第一步基本一致,但一定要记得备份,因为新的so可能不支持某些你原来安装的软件,比如python,php等,除非是为了某个特殊需求必须用到,而且服务器不打算做其它太多的项目,那么可以折腾,否则建议尝试使用docker创建需要的环境。

全面解决/usr/lib64/libstdc++.so.6: version GLIBCXX_3.4.22'下没有GLIBCXX_3.4.22和ImportError: /lib64/libc.so.6: version GLIBC_2.33’ not found

/lib64/libstdc++.so.6: version `GLIBCXX_3.4.22报错是c++环境依赖缺失
修正方案:
1.使用以下命令查看是否缺少

strings /usr/lib64//libstdc++.so.6 | grep GLIBC

查看到列表中缺少版本 `GLIBCXX_3.4.22’

将原来的/usr/lib64/libstdc++.so.6 也就是提示信息的/usr/lib64/libstdc++.so.6重命名为/usr/lib64/libstdc++.so.6-bak(自己根据实际报错信息修改)

mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6-bak

然后查找本机的拥有的libstdc++.so依赖

locate libstdc++.so

正常情况会出现很多,使用第一个命令一一验证哪个libstdc++.so版本拥有 `GLIBCXX_3.4.22’,比如搜索到一个/usr/lib/libstdc++.so.30

strings /usr/lib/libstdc++.so.30| grep GLIBC

查看后发现符合要求(不符合就继续查其它),就将/usr/lib/libstdc++.so.30复制到/usr/lib64/文件夹下

cp /usr/lib/libstdc++.so.30 /usr/lib64/

然后用新的符合要求的libstdc++.so.30建立软连接

ln -s  /usr/lib64/libstdc++.so.6.0.30 /usr/lib64/libstdc++.so.6

然后再用原来的命令检测,发现已经有包含 `GLIBCXX_3.4.22’

strings /usr/lib64//libstdc++.so.6 | grep GLIBC

至此完成

出错以及修复(云服务器直接找客服)

至于第二个ImportError: /lib64/libc.so.6: version `GLIBC_2.33’ not found,不要轻易修改,**如果没有这个文件会导致连接不上shell,不要问我为什么知道。**建议尝试直接使用建立软链接或者覆盖原来文件的方式,找到符合条件的文件覆盖掉(记住这个只是软链,你要找到真正的文件进行覆盖!)。
重要的事 重要的事如果不小心修改了 /lib64/libc.so.6,此时大部分shell命令都会失效,不要慌张,更不要关闭ssh连接(不要问我为什么知道),此时要保持ssh连接不要关闭,因为关闭了就无法再连接了,只能跑系统急救了
未关闭解决方法执行以下命令(linux公社找到的解决答案)

LD_PRELOAD=/lib64/libc-2.26.so ln -s /lib64/libc-2.26.so  /lib64/libc.so.6

记住/lib64/libc-2.26.so必须是你主机存在的文件,所以根据实际情况操作。比如你将/lib64/libc.so.6改名为/lib64/libc.so.6-bak了,那么可以重新建立软链

LD_PRELOAD=/lib64/libc.so.6-bak ln -s /lib64/libc.so.6-bak  /lib64/libc.so.6

或者

sln /lib64/libc.so.6-bak /lib64/libc.so.6

当然你还可以恢复重命名再建立软链接:

LD_PRELOAD=/lib64/libc.so.6-bak mv /lib64/libc.so.6-bak /lib64/libc.so.6

建立软链如上

所以最好的办法就是直接建立软连接覆盖,或者将原来的libc.so.6复制一份作为备份,然后将新的libc.so.xx版本复制到lib64下并重命名为libc.so.6覆盖原文件,也算一种方法(理论可行)

重点 第二个libc.so.6即使找到了符合条件的文件,也可能本机内核不支持(此时还可以升级内核,看了下,放弃),坑点来了,如果你修改了第一个libstdc++.so.6,那么大概率要修改libc.so.6,因为不同版本对应不同依赖。所以此时可以找一个符合依赖关系且符合系统版本的libc.so.6,重新建立软链接,以维持建立好的新libstdc++.so.6动态依赖。否则打道回府,将第一步的libstdc++.so.6修改还原。

正常修改libc.so.6方式:
https://blog.csdn.net/u014634615/article/details/120333287
还有一种人吓傻了关闭了ssh连接的急救
CentOS无法登录root的原因及解决方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
情况一:
如果还连着的ssh终端,没有断开,直接执行如下命令即可恢复:

LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6

情况二:
ssh已经断开,无法新建新的ssh连接,重启系统,报错无法进入系统。
出现报错:Kernel panic - not syncing: Attempted to kill init!
处理办法
进入rescue救援模式,将链接文件复制到被删除的文件系统。
操作步骤如下:
1、开机进入BIOS设置,修改BOOT启动顺序为光盘优先启动 CD-ROM Drive;
2、重启系统后由光盘引导,进入安装启动菜单,选择“Rescue install system”救援模式;
3、进入到Rescue界面,选择Continue
4、系统挂载在/mnt/sysimage下 ,选择OK(如果要到root环境下,运行 chroot /mnt/sysimage 命令,此处不需要)
5、选择进入模式:shell 进入命令行模式,fakd是诊断模式,reboot重启电脑,这里选择shell
6、进入shell命令行,提示符为bash-4.1#
7、不要执行chroot /mnt/sysimage,因为硬盘文件系统就在该目录下,从/lib64下复制软连接即可,操作如下:
bash-4.1# cd /lib64
bash-4.1# cp -d libc.so.6 /mnt/sysimage/lib64/libc.so.6
bash-4.1# reboot
之后即可恢复正常
以上就是CentOS无法登录root的原因及解决方法 作者:云V小编 https://www.bilibili.com/read/cv14139558 出处:bilibili

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值