当非root用户删除libc.so.6之后。。。

         某天晚上,我美滋滋地边看论文边安装TensorFlow,身心非常愉悦,直到安装过程中,出现了这么一个错误

/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found

     后来网上搜索解决方案,才知道是GCC版本太老了,libstdc++.so.6下没有这个3.4.19版本的glibc。于是我按照教程 https://github.com/qiwsir/ITArticles/blob/master/Linux/upgrade_gcc_on_Centos.md。将GCC的版本更新到4.8.1。然后再用命令查询:

strings libstdc++.so.6.0.18|grep GLIBCXX

       此时已经看到了版本中有GLIBCXX_3.4.19。

    (1)如果是在自己的用户目录下操作,就需要 从路径/usr/local/lib64拷贝文件libstdc++.so.6.0.18到路径/usr/lib64下

cp /usr/local/lib64/libstdc++6.0.18 /usr/lib64

 (2)此时要删除原来的软链接,在这之前最好备份软链接(可以看看后面惨痛的教训)

rm -r libstdc++.so.6

 (3)重新创建新的软链接,链接新的库

ln libstdc++.so.6.0.20 libstdc++.so.6

(4)再执行如下指令发现,有了新的库

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

     我以为这样就完美解决了,科科科,太naive了。再次安装的时候,我发现它又报错了

 ImportError: /lib64/libc.so.6: version `GLIBC_2.17' not found

     通过 strings /usr/lib64/libc.so.6 | grep GLBC_ 查询时,我发现版本只到了2.12。哇,我又开始在网上找教程解决问题。https://blog.csdn.net/chenvast/article/details/79103288

       在安装glibc库的过程中非常完美,没有问题。但是在那一步删除链接时出现了问题。在上文中提到,发现ls指令不能用的问题,我没有遇到,于是我就傻缺地跳过了该步骤,直接删除了libc.so.6。后来。。。。,就没有后来了,我发现所有指令除了cd,一些原始简单的指令可以执行,其余都会报找不到libc.so.6的错误。

        此时,我还是很淡定,没事,百度看看怎么补救,没想到解决方案还是比较简单的,再重新创建链接就可以了吧,于是,如网上所说

LD_PRELOAD=/lib64/libc-2.12.so ln -s /usr/local/glibc-2.17/lib/libc-2.17.so /lib64/libc.so.6

         注意,这里的LD_PRELOAD的值必须是你原本的libc版本,我是怎么知道原来的版本呢,因为之前用strings指令查询过,版本只到了2.12。我运行了上述指令,哇,不行还是报找不到/lib64/libc.so.6。这时,我才开始急了,what?怎么办。最后不断地搜索,找到了这样一条指令,执行成功啦~~~

export LD_PRELOAD=/lib64/libc-2.12.so

        我开始执行了一些比较复杂的指令,发现可以执行,心情舒畅。然而我再到/usr/lib64创建链接时,发现所有指令(除了一些简单的指令可以)还是不能执行,不断地sudo,也不能执行。我现在才意识到,sudo都不能执行了,我是个非root用户,如果要创建系统链接,必须sudo。我心里想着,完了完了完了。到现在才知道libc.so.6是跟系统大多数指令相关的链接,删了,指令就不能执行了,连root都登不上了,只要服务器的ssh一断,我的账号也不能上了。

       最后的最后,我把这件事报告给了上面,选择重新安装系统,幸好是只是我一个人在服务器节点上跑一些实验程序,并没有什么重要的资源,并且我一向在本机上都会备份,没有重大的损失。

       总结如下经验:

  1. 不要摸黑干坏事(更新系统的一些库),此时脑子不清楚。并且,不要三心二意,开启多个进程,此时脑子更不清楚。
  2. 非要更新库时,最好获取root权限,这样出了问题不会束手束脚。如果是root用户使用 LD_PRELOAD=/lib64/libc-2.12.so ln -s /usr/local/glibc-2.17/lib/libc-2.17.so /lib64/libc.so.6这个指令应该是可以恢复的,但是如果是非root,你只能重新安装系统或紧急恢复(暂时还没有找到什么新方法)。
  3. 不要被前面的成功冲昏了头脑,一招出错,满盘皆输。小心谨慎。
  4. 一定要备份,备份,备份(重要的事情说三遍,并且描个红)

猜你喜欢

转载自blog.csdn.net/ever_idea/article/details/82710818