最近遇到機房的一臺虛擬機(測試機器)的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同步。
要否則出問題時,後悔無窮啊~~~