/lib64/libc.so.6 错误导致的系统崩溃

缘由

    我们有个同事要安装一个软件,就用yum 安装,然后就悲剧。安装完成之后 发现无论执行任何命令都会报错,如下错误

psgrep: relocation error: : /usr/lib64/libpthread.so.0: relocation error: symbol __libc_dl_error_tsd, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference/usr/lib64/libpthread.so.0: symbol __libc_dl_error_tsd, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference

吓尿了,遇到这种错误就懵逼了,以为系统坏了,这个坏了可不是重做系统就好了(这个服务器是在异地,真要出问题 都要飞过去了)。

    此时最最重要一点是不要关闭当前窗口,不要重新启动机器! 一旦关闭窗口将无法重新连接(可以自己新建窗口试下),重启机器后也将无法进入系统 。比较幸运的是 我们当时开了两个窗口,要不然就麻烦了

原因

  • libc.so.6是C运行时库 glibc的软链接,程序启动和运行时,是根据libc.so.6软链接找到glibc库

  • lib64/libc.so.6是一个软链接,指向/lib64/libc.so-2.1x,2.1x表示其对应版本,去兼容相应CentOS版本

  • 很多基本命命令依赖glibc,libc.so.6链接对应版本不一致将导致系统的几乎所有程序不能工作

解决过程

    由于我们也是第一次遇到,没撒经验 那就搜索了,根据相关文章思路 以及通过少的可怜可以执行的命令试错 大致知道了原因:应该是有人升级了内核,但是升级失败了,导致服务器存在两个内核,在执行yum的过程中应该把错误的内核指向了 /lib64/libc.so.6 。我们通过 命令发现 /lib64/libc.so-2..xx.so 有两个版本(tab 命令补全还可以使用),我们参考了其他机器发现都使用2.17 版本 。

    但是我们在 执行  “sln /usr/lib64/libc-2.17.so /usr/lib64/libc.so.6” 过程中 发现 一直提示 一个很奇怪的错误,最后我们发现 其实 /lib64/libc-2.17.so 文件其实也是有问题的,幸好我们查找整个服务器备份了一个 2.17 的 so 文件(喜极而泣),然后把 这个 so 替换了 /lib64/libc-2.17.so 。发现软链之后就解决了一些问题。

解决方法

    主要指向如下命令,就可以解决。

sln /usr/lib64/ld-2.17.so /usr/lib64/ld-linux-x86-64.so.2
sln /usr/lib64/libc-2.17.so /usr/lib64/libc.so.6