2008/03/17

[Linux] Linux 上面的檔案救援

最近在處理檔案救援(undelete)的工作,所以找了不少軟體(R-Studio, recuvia) 來處理,不過說真的,也不知道這些軟體在做些什麼事情,所以做起來格外的心虛,畢竟是 windows 的軟體。所以最後還是去看了一下,在 Linux 底下手工的技巧:
(以下都是摘要人家的內容)

1. 先 mount -o remount,ro /dev/sda1
2. 再來 debugfs /dev/sda1
# lsdel
debugfs:lsdel
debugfs: 2692 deleted inodes found.
Inode Owner Mode Size Blocks Time deleted
164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001
# dump /tmp/xxx.sav


或用 mi 來處理
debugfs:mi
# 把deletion time改成0(未删除),Link count改成1。改好後退出(quit)
# 再下 fsck /dev/sda1 就會跑到 lost+found/ 底下了。


一個檔案在 ext3 底下的分布情況如下:
filefrag -v icon.png
Checking icon.png
Filesystem type is: ef53
Filesystem cylinder groups is approximately 85
Blocksize of file icon.png is 4096
File size of icon.png is 25311 (7 blocks)
First block: 1003570
Last block: 1007890
Discontinuity: Block 1 is at 1003574 (was 1003570)
Discontinuity: Block 5 is at 1007882 (was 1003577)
Discontinuity: Block 6 is at 1007890 (was 1007882)


* 每一個檔案配置(至少)一個 inode 來記錄它裡面存放的資料(metadata)和 block index。小於 12 個 block 的文件,只配一個 inode ,大於的,就直接在 inode 後面再串接下一個 inode 的位置。(註~ 看不大懂,回去翻書)

換句話說,我們也可以用 dd 也可以反刪除救回檔案:
確認 block size :
tune2fs -l /dev/sda1 |grep -i 'block size'
Block size: 4096

dd if=/dev/sda1 of=xxx.sav.1 bs=4096 count=1 skip=103570
1+0 records in
1+0 records out

dd if=/dev/sda1 of=xxx.sav.2 bs=4096 count=1 skip=103574
1+0 records in
1+0 records out
... # block 數量愈多,愈麻煩...


vfat 上面的處理 (對記憶卡/flash 也有用)
dosfsck sdc1 -v -r -u filename

--
參考連結:
ext3 的檔案系統介紹
大陸的論壇討論 ext2/3 的部份
ext3的反刪除動作: 用 dd 就可以回復了
--
與本篇無關的附記:
* Ext3 的特點
日誌系統
(效能慢,但風險小)原資料和檔案內容都在提交到主檔案系統前寫入。這樣將提高穩定性但性能上有所損失,因為所有的資料都要寫入2次。這個動作是為了防止像 kernel panic 或突然斷電的情況發生時,會讓系統上的資料與索引(metadata)發生不一致的情況。

反刪除
和ext2不同,ext3將把被刪除檔案的i節點(inode)中的塊指標(block index)清除。這樣做,在(unclean)載入檔案系統後,重放日誌時,可以簡化對檔案系統的訪問。但這造成了檔案在反刪除上的難度。用戶唯一的補救是在硬碟中grep資料,並且要知道檔案的起始和結束信號。這提供了比ext2在刪除檔案上稍微高一些的安全性,或許這中安全既是優點也是缺點。

Ext3在寫入日誌時,並不做校驗比對(checksum)。如果barrier=1沒有作為載入時的參數(在檔案/etc/fstab 上的參數,或 mount 時的選項),且硬體又是無次序的寫入 buffer ,在系統 crash 時會嚴重損壞檔案系統(該選項在大多數流行的Linux發行版中都沒有被啟用,所以大多數發行版的處境都很危險。)

[Windows] git-bash 底下的工具

因為工作轉到 Windows 平台上的關係,所以很多工具改到 Windows 上面運作,跟著在 TortoiseGit 底下使用 git-bash 來維護自己的專案原始碼。結果就是裝了前面提過的 auto-hotkey 使用熱鍵來提昇自己的平台操作速度; 但除了 hotkey...