libc.so.6被誤刪除後的急救


最近遇到機房的一臺虛擬機(測試機器)的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。

f9c7c03dd567bbee.png!mid


============

現在拋出另一個問題:沒有shell連接了怎麼辦?或者是libc.so徹底被刪除了咋辦?

=》解決也比較簡單了(對於機器在機房的童鞋來說,你就認了吧,好好請運維吃飯,讓他跑跑腿。。。): 

1.實體機:

   直接拆下硬盤,在相同版本的linux機器上掛載,人工copy過去。

2.虛擬機:

   關閉出問題的虛擬機,當前虛擬機同一個母機的其他虛擬機,增加虛擬硬盤,選擇出問題的虛擬機硬盤文件,搞定後,和實體機處理的方式就一樣了。


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