由於某種原因升級了centOS系統的glibc庫導致了系統linux命令大部分不可使用!

今天由於需要在環境中使用到node,所以準備下載並安裝使用,但是安裝完成後提示如下信息:
111
於是就按照網上的教程下載並安裝了對應的glibc庫,而且刪除了/lib64/目錄下的libc.so.6文件之後,和新的glibc庫建立了軟連接,結果悲劇發生了,接下來我執行的所有Linux命令幾乎都報錯:

error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument  

然後我在網上搜瞭解決辦法,清一色的告訴我備份然後重裝系統!!!
我當時慌的一批!!!貌似備份也挺麻煩,而且這個系統我搗鼓了一個多月,解決了各種bug,不能就這麼毀了!!!於是我不死心的繼續找解決辦法,功夫不負有心人,找到如下一種解決辦法,來自博客:
https://www.jianshu.com/p/216b28535c6b

大概意思如下:
如果發生了和我類似的情況,或者報出如下另外兩種錯誤之一:

Segmentation fault  

或者:

error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory  

那麼這個時候千萬不要關掉你的終端(包括SSH),執行如下命令可以挽救你於水火之中:

cd /lib64
LD_PRELOAD=/lib64/libc-2.12.so ln -sf /lib64/libc-2.12.so libc.so.6  

那麼請注意,上述命令中/lib64/libc-2.12.so這個文件是因系統版本有所差異的,我的系統版本是centOS6.10,而且在刪除libc.so.6之前,我特意觀察了它原始的軟連接是指向libc-2.12.so的,所以我使用的是它,如果你不知道,你可以依次降低文件版本去嘗試,總有一個能執行完成,成功之後你會發現Linux命令能恢復使用了!!!

至於它的原理大致是這樣的:

linux調用so的庫文件時,搜索路徑爲當前路徑,再是系統lib目錄。  
但是如果指定了一個LD_PRELOAD系統變量就能改變這個順序。  
設置LD_PRELOAD了後,庫加載的順序就變成這樣了:
LD_PRELOAD —> 當前路徑 —> 系統lib目錄  

總結

像這樣的要修改系統基礎運行庫的操作,慎用!!!特別是隨便從網上找來的解決方法,一定要慎重,操作之前做好必要的備份工作,並且要多次考察對比(多找幾篇博文去比對),找出最可靠的方案去解決!!!
但是,我是說但是,最好不要去修改系統相關的依賴,除非你知道這將給你帶來什麼樣的後果!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章