起因:
centos7.6默认的glibc版本过老,想要升级一下,照着网上的教程操作,make install之后,让我改名libc.so.6 ld-linux-x86-64.so.2,再重建软链接(很难想象写某些文章的作者是怎么成功的,给这两文件改完名系统还能用?),执行之后,服务器执行命令报错如下。
处理方法:
未重启服务器
如果未重启服务器,以下操作默认在/usr/lib64目录下操作的(未实操,我重启了服务器)
如果出现了以上报错,千万不要重启服务器,当前连接的ssh也不要断开,当前服务器新打开ssh连接不上去的。
1、如果只是误改了libc.so.6(没有新建软链接的情况),通过sln命令(ln -s这个命令是报错的)新建一个对应的软链接, sln libc-2.17.so(so文件名根据实际情况操作,与当前操作系统对应的版本,tab补全是可以用的,下文不再解释) libc.so.6,理论上这个命令就能解决问题
sln libc-2.17.so libc.so.6
2、修改了libc.so.6 ld-linux-x86-64.so.2,使用如下命令
sln libc-2.17.so libc.so.6
sln ld-2.17.so ld-linux-x86-64.so.2
3、修改了libc.so.6 ld-linux-x86-64.so.2并且新建了对应的软链接到新的so文件,这时候sln命令再往上添加软链接就会出问题,unlink命令也是报错的,使用命令:
/usr/lib64/ld-2.17.so --library-path /usr/lib64 /usr/bin/unlink 软链接名称
取消对应的软链接,按照上面的步骤操作即可。
重启了服务器
1、如果是实体机(猜测)
是否可以通过插入centos操作系统u盘或者cd-ram抢救,bios中优先引导对应的介质,然后通过我下面的步骤抢救,注意不要将数据清理掉了。
2、vmware虚拟机(实操)
出问题的机器是vmware的虚拟机,机器关闭后,虚拟机设置勾选CD/DVD驱动器
启动机器,在启动时没有出现预期的centos安装画面
而是引导选择该虚拟机内已安装的系统,在页面任一选项中按e,这时候进入到的是编辑模式,ctrl+c进入了grub引导,esc+esc两次esc之后应该进入了centos的安装画面(如果还是退回了选择操作系统页面,重复一下操作,如果还是不行,按照上面的步骤探索。)
之后进入的如下画面(网上找的图片,参考,操作内容都一样,好像中间还会有个trouble shooting的选项)
选择Rescue a Centos Linux system
输入:1
进入之后,服务器数据都在/mnt/sysimage中,进入目录/mnt/sysimage/usr/lib64重建被修改的软链接
注意!注意!注意!这时候你重建的软链接直接用如下命令,别用绝对路径!!!!
sln libc-2.17.so libc.so.6
sln ld-2.17.so ld-linux-x86-64.so.2
改了什么就重建什么,如果不记得改了什么,拷贝当前系统的/usr/lib64(非常不推荐这种方式,仅仅用于急救启动服务器,这样可能会导致部分服务的链接库出问题)
cp -rf /usr/lib64 /mnt/sysimage/usr/lib64
操作完成后,重启机器。正常启动了服务器,ssh连接也正常。
后记:
正在处理其他问题时,服务器又出问题了。
第一反应就是服务器的so软链接又被修改了,进入/usr/lib64目录,所有命令都用不了,分成两种情况:
1、如果只有libc.so.6被修改了,使用命令
export LD_PRELOAD="/usr/lib64/libc-2.17.so"
之后命令应该都正常了
2、但是我在执行之后依然有报错,说明我修改的ld-linux-x86-64.so.2软链接在作怪
使用如下命令:
/usr/lib64/ld-2.17.so --library-path /usr/lib64 /usr/bin/(这里补全你想要用的命令)
查看/usr/lib64/ld-linux-x86-64.so.2软链接的链接对象,链接到了新编译的ld-2.31.so
删除软链接,重建ld-linux-x86-64.so.2指向ld-2.17.so,命令都可以正常执行,接下来我将/usr/lib64中高版本ld-2.31.so和libc-2.31.so都移出了/usr/lib64目录,问题不再出现,至此服务器问题解决。
某些升级glibc的文章居然能够在修改了动态链接库后正常使用服务器命令,只能感慨作者真强。