1. 程式人生 > >當非root使用者刪除libc.so.6之後。。。

當非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. 一定要備份,備份,備份(重要的事情說三遍,並且描個紅)