libc.so.6共享庫恢復

最近遇到機房的一臺虛擬機(測試機器)的libc庫的軟鏈libc.so.6被刪除了,實際文件libc.2.4.so還在。linux

機器現狀:shell

還有shell遠程連入,可是各類命令都不能再使用:運維

/bin/ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directorypost

網上搜索了一番,找到這個解決方案:測試

# 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.63d

==》get

分析: 因爲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。虛擬機

 

 

============it

如今拋出另外一個問題:沒有shell鏈接了怎麼辦?或者是libc.so完全被刪除了咋辦?

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

1.實體機:

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

2.虛擬機:

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

好比virtualbox的:

 

末了,囉嗦一下:

linux 命裏操做需謹慎啊,特別是rm命令!!!

對於重要的機器作好主備備份,定時rsync同步。

要否則出問題時,後悔無窮啊~~~

相關文章
相關標籤/搜索