根目錄下目錄和文件被誤挪位後的恢復過程

 2010年12月17日下午,接到一個老學員小李的求救電話,說是不小心把根目錄下的所有東西mv到一個子目錄後無法執行任何命令了,有無辦法解救。我先是問誰幹的,小李說是他的頭兒乾的。如果是小李乾的,我是肯定會狠批他一頓,因爲我在培訓時一直強調***型命令要謹慎操作的。既然不是小李乾的,我也就不說什麼了,就回答說用光盤啓動rescue模式進去後挪回去即可。但是小李說服務器不在本地,而是遠程外地的。我趕緊問是否還保持着ssh遠程登錄會話,回答說是,我就讓他不要退出,否則就沒法挽救了。然後告訴小李說設置LD_PRELOAD等幾個庫路徑相關的參數然後讓mv、cp等命令能恢復工作後再繼續下一步,具體的可以先上網查一下。

 

過了若干時間,小李來個短信問具體怎麼做,我回復說無法表達清楚。然後小李就來了個電話,請我幫忙操作恢復。當時正在上課,本來不是很方便,但是轉念一想,正好趁這個機會讓學員通過VNC看看這種情況下我的實際恢復操作過程,現場直播一下,也是一個很好的學習機會。於是跟學員徵求了一下意見,他們一致同意,於是就跟小李說我可以嘗試操作進行恢復,然後就請小李加我QQ好友,開始QQ遠程協助。

 

通過QQ連接到小李的桌面後,看到一個SecureCRT的會話界面,命令行執行提示ld-linux.so.2: Bad ELF Interpreter。然後執行ls、mv、cp等命令,大多提示command not found。很明顯,由於此前是在/下做了做了類似mv * /var/abc的操作,所以這些命令所在的位置已經從根挪到了/var/abc下了。由於bash內部命令還可以用,可以cd、pwd之類的。此時由於ls無法使用,所以無法列出目錄內容。但是cd /var/abc/bin後,先敲入ls空格後再敲兩次TAB鍵,會提示顯示目錄內容。此時使用./ls、./mv、./cp等,依然會提示有錯。甚至/var/abc/lib/ld-linux.so.2 /var/abc/bin/ls的形式仍然提示錯誤。

 

命令找到了,但是由於依賴的庫已經從/lib挪到了/var/abc/lib,因此會由於動態鏈接庫無法找到而無法正確執行。如果能把庫挪回原位,那就不用擔心不能執行了;但是爲了挪回原位,就要使用mv或者cp甚至是rsync等命令,但是這又依賴/lib下的庫。似乎陷入了一個死循環,不可解脫的死扣。

 

但是執行./ls和執行/var/abc/lib/ld-linux.so.2 /var/abc/bin/ls可以看到提示信息有所不同。而執行/var/abc/lib/ld-linux.so.2時會有幫助提示。由於以前做過開發,想起了一些關於運行庫的設置,於是嘗試export LD_LIBRARY_PATH="/var/abc/lib:/var/abc/usr/lib"然後再運行./ls命令,就發現可以正常運行了。於是下面就簡單了。爲了避免二次犯錯,先是cd /var/abc; /var/abc/lib/ld-linux.so.2 /var/abc/usr/bin/rsync -av --progress --partial  lib usr/lib bin sbin usr/bin usr/sbin etc / -R確保把基本系統複製回原位,然後再/var/abc/lib/ld-linux.so.2 /var/abc/usr/bin/rsync * / -R恢復全部數據;至此可以算是完滿恢復了。至於/var/abc這個目錄下冗餘的數據,就交由小李來做進一步的處理了。爲了以防萬一,我請小李不用關閉原來的ssh會話,另開闢一個新會話看看能否正常登錄,然後確認系統是否正常;回覆說已經能夠正常登錄,於是我的操作完成,直接斷開遠程協助退出了。

 

這一次江湖救急之所以能夠順利進行,主要是因爲ssh會話還在保持,否則退出後就無法再上去了。除了打飛的到現場用光盤rescue恢復外別無他法。屆時要直接啓動系統都很困難了:vmlinuz和initrd.img都五臟移位了,還得設置grub參數,對於經驗不足者而言這個過程很麻煩。我在恢復期間還把LD_LIBRARY_PATH先誤寫成了LDLIBRARY_PATH,是因爲看了ld-linux.so.2的提示信息才糾正過來的。

 

小結一下:

#設置動態鏈接庫路徑,讓命令知道動態鏈接庫所在,這樣子就能夠保證基本的文件數據操作命令正常執行了。

export LD_LIBRARY_PATH="/var/abc/lib:/var/abc/usr/lib"

#使用已能夠正常運行的基本文件操作命令恢復文件系統樹

cd /var/abc; /var/abc/lib/ld-linux.so.2 /var/abc/usr/bin/rsync -av --progress --partial * / -R

 

以前也有一些學員參加工作後忘記了培訓期間的警告,非得要弄出大事,刻骨銘心才無法忘記。比如說遠程修改iptables的各個鏈缺省策略爲DROP的;有直接setup後修改網卡設置重啓出錯的;有rm -fr /etc甚至是rm -fr /的。

 

這期學員(VC20100913)最近看到我的不少實戰操作。由於整個桌面都通過VNC共享給他們,所以屏幕上的任何信息他們都能看得一清二楚。相信這次實戰操作能夠給他們一些信心。後續還會在一些生產系統上演示一些實際操作給他們看。

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