最近遇到機房的一臺虛擬機(測試機器)的libc庫的軟鏈libc.so.6被刪除了,實際文件libc.2.4.so還在。
機器現狀:
還有shell遠程連入,但是各種命令都不能再使用:
/bin/ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
網上搜索了一番,找到這個解決方案:
# LD_PRELOAD=<real libc> ln ......
相當於直接調用 ln命令,
所以,
先刪除連接 :
# cd /lib
# LD_PRELOAD=/lib/libc-2.3.6.so.bak rm libc.so.6
再建立新連接 :
# LD_PRELOAD=/lib/libc-2.3.6.so.bak ln -s /lib/libc-2.3.6.so.bak libc.so.6
==》
分析: 由於shell仍然連入,因此此種方案可行。
原理就是:
linux調用so的庫文件時,搜素路徑爲當前路徑,再是系統lib目錄。
但是提供了一個LD_PRELOAD系統變量來改變這個順序。設置LD_PRELOAD了後,庫加載的順序就改爲:
搜素路徑爲: LD_PRELOAD ,當前路徑,再是系統lib目錄。
(LD_PRELOAD還有其他妙用,可以參見之前的博文:linux下實現inject&hook)
因此,本次問題解決就很簡單了: LD_PRELOAD=/lib64/libc.2.4.so ln -s libc.2.4.so libc.so.6
搞定。。。
針對這個問題,網上還有種方法是說使用busybox,但是至少在騰訊tlinux機器上,出現此種問題,busybox不能使用的。
原因是這個機器版本的busybox依賴libc。
============
現在拋出另一個問題:沒有shell連接了怎麼辦?或者是libc.so徹底被刪除了咋辦?
=》解決也比較簡單了(對於機器在機房的童鞋來說,你就認了吧,好好請運維吃飯,讓他跑跑腿。。。):
1.實體機:
直接拆下硬盤,在相同版本的linux機器上掛載,人工copy過去。
2.虛擬機:
關閉出問題的虛擬機,當前虛擬機同一個母機的其他虛擬機,增加虛擬硬盤,選擇出問題的虛擬機硬盤文件,搞定後,和實體機處理的方式就一樣了。