星期五, 8月 06, 2010

我的UBUNTU意外毀損救援紀實

以前就知道經常使用的tar指令在操作的時候會自動將目錄開頭的斜線( / )拿掉,雖然知道這個功能的用意是避免解壓縮時蓋掉重要的系統檔,但是從來不覺得這個功能很重要。

直到上週用cpio解一個initrd.img,解開後發現ls指令不能用,重開機開不起來大略看了一下開機錯誤訊息,意識到這已經不是我原來的系統了。

這時候我已經知道是解那個initrd.img時蓋掉了原來的系統,可是我非常確定我是建了一個子目錄在目錄中解壓縮的,這時想起tar的貼心其實也多少造成了管理者的大意,總而言之就是cpio沒有這個貼心的功能。
後悔已經來不及了,只好拿出救援光碟開機。

第一步:
cat initrd.img|cpio -t 先看看這個檔大致有那些內容
評估受影響的有 /lib /usr/lib /bin /sbin /etc
可能不受影響的有 /dev /proc /tmp /sys

第二步:
從備份的/etc目錄複蓋回來

第三步:
從其它電腦複製 /lib /usr/lib /bin /sbin

第四步:
重開機,還是有一些類似的錯誤訊息無法啟動,可能/etc內還是有屬於外來的啟動程式

第五步:
完整刪除/etc,重新還原/etc,重新開機可進入單人模式,部份指令不能執行

第六步:
find /lib|xargs dpkg -S|grep "not found" 找出不屬於任何套件的檔案後,人工判斷後手動刪除
find /usr/lib|xargs dpkg -S|grep "not found" 同樣對/usr/lib/做一次

第七步:
重開機,單人模式正常,無法登入圖形界面,錯誤訊息
/usr/lib/libgconf2-4/gconf-sanity-check-2 和這個檔案有關
網路搜尋和家目錄的權限有關,檢查後沒發現問題

第八步:
處理到這段遇到瓶頸,做了很多事都完全沒有效果,其中包含
dpkg-reconfigure --all 重設所有套件
for pkg in packagelist; do aptitude reinstall $pkg; done; 重新安裝所有已安裝的套件
packagelist是我已安裝的套件列表,我用的simple backaup軟體會自動產生
這個動作花了八小時才完成,可是同樣一點用也沒有

第九步:
重新檢查一次initrd.img,終於有驚人的發現 "它的/tmp目錄權限是774",
比較自已系統的/tmp目錄,果然也被改掉了,原來以為不會被響影的目錄,其實也是最容易修復的目錄,
因為思慮不週竟然花了最多的時間。

第十步:
將/tmp目錄重設為777,重開機,系統完全回復正常。

檢討:
一、目前的備份是否足夠(/etc /home /var中有用到的目錄)﹖應該夠,至少能將系統還原至可用狀態,全備份實在太花時間和空間。
二、操作cpio和其它解縮軟體時一定要小心,一定要用t選項先列出壓縮檔中的目錄。
三、tmp目錄造成X Windows不能登入,以前好像遇過也是花了很多時間才找到,竟然又發生一次。
四、目前用的系統從6.04一直升上來的到現在已經超過4年了,這次發生的意外是目前遇到影響範圍最大的一次意外,雖然沒有重灌但是有的目錄機乎已經是重建一樣,雖然用起來和原來的系統一樣,可是心裡有一點疑惑 "究竟這還是不是原來的系統"

3 則留言:

beck 提到...

cpio --no-absolute-filenames 可不使用絕對路徑

客家小哥 提到...

寶貴的參考意見,
另~可以瞭解你的simple backaup軟體是什麼嗎? 入手Ubuntu一年,最近才真正開始裝在我的notebook... 想要研究一下備份策略,thanks

beck 提到...

simple backaup 在套件庫的名稱是sbackup 另外它會推薦安裝 sbackup-gtk ,同時安裝以後會有一個GUI界面可以設定備份目錄、排除目錄、排除檔案、增量備份排程、完整備份排程、自動定時刪除舊備份、備份結果EMAIL通知等功能,還原檔案時也可以使用GUI界面還原檔案。
我覺得這是一套使用簡單而且功能尚稱完整的備份套件。