今天剛剛完æˆåœ¨ ext3 file system 裡拯救被 rm -r blah* åˆªæŽ‰çš„è³‡æ–™çš„ä»»å‹™ã€‚å¸æœƒäº† undelete 新招術。
事情是昨天發生的,我作了一些 googling ä¹‹å¾Œï¼Œç™¼ç¾æœ‰
å¯ä»¥çµ¦ ext2 fs 用。ä¸å¹¸çš„æ˜¯ä¹Ÿåªèƒ½çµ¦ ext2 fs 用,沒辦法用在 ext3 fs 上。
Why not? debian-user mailing list 上有人 這樣å說明 ,我來講的話就是 ext3 在 unlink 檔案的時候會把 inode 裡與檔案相關的資訊一起 zero 掉 (ext2 䏿œƒ)。所以資料雖然還在,但æè¿°æª”案ä½ç½®çš„資訊已經ä¸è¦‹äº†ï¼Œé‚£äº›å·¥å…·å³ç„¡æ³•從 inode 裡找出任何å¯ä»¥ç”¨ä¾† undelete çš„æ±è¥¿ã€‚
ä¸éŽï¼Œinode 這æ¢è·¯èµ°ä¸é€šï¼Œé‚„是有方法。 é‚£ç¯‡æ–‡ç« ä¹Ÿæåˆ°åœ¨ ext3 上唯一能進行 undelete çš„æ–¹æ³•ï¼Œå°±æ˜¯å°æ•´å€‹ç£ç¢Ÿ/分割å€ä½œæŽƒçž„。
為了方便我們掃瞄ç£ç¢Ÿ/分割å€è£¡çš„ block,è¦ç¥å‡º sleuthkit ä¾†ã€‚æˆ‘èŠ±äº†ä¸€é»žæ™‚é–“ç ”ç©¶é€™çµ„å·¥å…·ä¹‹å¾Œï¼Œä¼¼ä¹Žçœ‹ä¸åˆ°æœ‰è‡ªå‹•掃瞄的功能,這表示得è¦è‡ªå·±å¯«ç¨‹å¼ä¾†æžã€‚
ä¸ç”¨è¬›å¤ªå¤šï¼Œç›´æŽ¥åƒè€ƒç¨‹å¼ (Python):
#!/usr/bin/env python # -*- coding: UTF-8 -*- from popen2 import popen3 from time import strftime if __name__ == '__main__': bcnt_start = 00020123 # block æœå°‹èµ·é»ž bcnt_stop = 00223433 # block æœå°‹çµ‚點 # 欲æœå°‹çš„å—串 keyword = "be searched word" # 紀錄檔å稱 logfn = "result.%s.log" % strftime("%Y%m%d-%H%M%S") i = bcnt_start while i <= bcnt_stop: # æ¯æŽƒçž„åˆ°ä¸€å€‹ block 開關一次檔 # ç”¨æ„æ˜¯ flush write buffer (å°ï¼Œé€™ç¨®å¯«æ³•很醜) logfile = open( logfn, 'a+' ) # 顯示進度而已,沒別的用處 q, r = divmod(i, 100) if r == 0: msg = "processed to block %d / %d (%%%f)" % \ ( i, bcnt_stop, float(i-bcnt_start)/(bcnt_stop-bcnt_start)*100 ) print msg logfile.write( msg+"\n" ) # 用 sleuthkit 裡的 dcat å·¥å…·ç¨‹å¼æŠŠå€å¡Šè³‡æ–™æŠ“出來 # ç…§ç†èªªä¸æ‡‰ç”¨ç›´æŽ¥ç”¨ block device /dev/hdb1 çš„ # ä¸éŽæˆ‘沒有多餘åˆå¤ 大的ç£ç¢Ÿä¾†æ”¾ dd image # 這種作法ä¸å¥½ï¼Œèƒ½å…å‰‡å… stdout, stdin, stderr = \ popen3( "dcat -f linux-ext3 -v /dev/hdb1 %d" % i ) str = stdout.read() # å° block 內容作æœå°‹ if str.find( keyword ) != -1: msg = "block %d has %s" % ( i, keyword ) print msg logfile.write( msg+"\n" ) logfile.close() i+=1
這個程å¼åªèƒ½æ‰¾å‡ºå°æ–¼ block size,åˆå…·æœ‰ç›¸åŒå—串內容的檔案資料 (ç•¶ç„¶æ˜¯å› ç‚ºæˆ‘è¦æ•‘的就是這種檔案)。å¯ä»¥ç®—æ˜¯åŠ å¼·ç‰ˆçš„ grep å§ï¼Œä¸éŽè¦æ”¹æˆæœå°‹äºŒé€²ä½è³‡æ–™ä¹Ÿå¾ˆå®¹æ˜“就是了。
程å¼çš„執行效率ä¸å¤ªå¥½ï¼Œç•¢ç«Ÿæ˜¯åªç”¨äº†ä¸‰å分é˜è¶•出來的 (而且我åˆä¸å¤ªæœƒå¯«ç¨‹å¼),用來æœå°‹ 20G å·¦å³çš„資料大概è¦èŠ±å…©å¤©ä»¥ä¸Šçš„æ™‚é–“ (on P4 2.0G w/512MB+ ram)。僅僅是能用而已。
如果需è¦åœ¨ ext3 è£¡é¢æ•‘比較複雜/å¤§çš„æª”æ¡ˆï¼Œå°±å¾—ä»”ç´°ç ”ç©¶ä¸€ä¸‹ ext3 的細節,而且多花點時間寫個真æ£çš„工具出來了。
最後æä¸€ä¸‹ï¼Œè¦èƒ½åœ¨ ext2/ext3 裡把 rm 掉的檔案救回來,有幾個關éµï¼š
儘快 umountï¼›ç£ç¢ŸæŽ›åœ¨ç³»çµ±è£¡æ„ˆä¹…ï¼Œè³‡æ–™è¢«è¦†å¯«æŽ‰çš„æ©Ÿæœƒå°±æ„ˆå¤§ï¼Œä¸€æ—¦è¢«è¦†å¯«æŽ‰ï¼Œè¦æ•‘å›žä¾†å°±ä¸æ˜¯é‚£éº¼ç°¡å–®çš„事了。
如果 rm 錯檔案的慘劇發生在 SGI çš„ XFS ä¸Šï¼Œæ ¹æ“š google 到的資料 顯示,應該會比 ext3 更難 undelete。
æ„ˆäº†è§£æª”æ¡ˆçš„å…§å®¹æˆ–æ ¼å¼ï¼Œæ•‘回檔案的機會愈大。從這次的經驗來看,如果完全ä¸çŸ¥é“æƒ³è¦æ‹¯æ•‘的檔案內容,那在 ext3 上大概就沒辦法把資料抓出來了。這個最後的大絕招「ç£ç¢ŸæŽƒçž„法ã€ï¼Œå®Œå…¨ä¾é å°è³‡æ–™å…§å®¹çš„æŽŒæ¡è€Œè«–æˆæ•—。
希望大家的資料都å¥å¥åº·åº·çš„,é è…¦ä¸æ¸…楚的時候åƒè¬ä¸è¦ä¸‹ rm å–”ï¼å¤§å®¶ä¹Ÿè¦å¹«æˆ‘禱告 >_< 這種事是會發生在任何人身上的 :~~~~
- Previous: Unicode, Big5 and Samba @2005/03/10
- Next: 舞HiME 第二å三話 『愛情ã¨å‹æƒ…ã€éžæƒ…〠@2005/03/14
Please send trackback to: http://blog.seety.org/everydaywork/2005/3/11/248/trackback/.
åˆ é™¤äº†ä¸€ä¸ªç›®å½•ï¼Œè¿™å—硬盘分区约9Gï¼Œç”¨ä½ å†™çš„é‚£ä¸ªå·¥å…·å¤§æ¦‚å¾—å¤šä¹…å‘¢ï¼Ÿæˆ‘çš„æœºåæ¯”较慢IBM T21
ä¸çŸ¥é“现在有没有比较好一点的工具呢?