· 檔案實際上是乙個指向inode的鏈結, inode鏈結包含了檔案的所有屬性, 比如許可權和所有者, 資料塊位址(檔案儲存在磁碟的這些資料塊中). 當你刪除(rm)乙個檔案, 實際刪除了指向inode的鏈結, 並沒有刪除inode的內容. 程序可能還在使用. 只有當inode的所有鏈結完全移去, 然後這些資料塊將可以寫入新的資料.
· proc檔案系統可以協助我們恢復資料. 每乙個系統上的程序在/proc都有乙個目錄和自己的名字, 裡面包含了乙個fd(檔案描述符)子目錄(程序需要開啟檔案的所有鏈結). 如果從檔案系統中刪除乙個檔案, 此處還有乙個inode的引用:
1.第一種方法 lsof
當程序開啟了某個檔案時,只要該程序保持開啟該檔案,即使將其刪除,它依然存在於磁碟中。這意味著,程序並不知道檔案已經被刪除,它仍然可以向開啟該檔案時提供給它的檔案描述符進行讀取和寫入。除了該程序之外,這個檔案是不可見的,因為已經刪除了其相應的目錄索引節點。
在/proc 目錄下,其中包含了反映核心和程序樹的各種檔案。/proc目錄掛載的是在記憶體中所對映的一塊區域,所以這些檔案和目錄並不存在於磁碟中,因此當我們對這些檔案進行讀取和寫入時,實際上是在從記憶體中獲取相關資訊。
大多數與 lsof 相關的資訊都儲存於以程序的 pid 命名的目錄中,即 /proc/1234 中包含的是 pid 為 1234 的程序的資訊。每個程序目錄中存在著各種檔案,它們可以使得應用程式簡單地了解程序的記憶體空間、檔案描述符列表、指向磁碟上的檔案的符號鏈結和其他系統資訊。
lsof 程式使用該資訊和其他關於核心內部狀態的資訊來產生其輸出。所以lsof 可以顯示程序的檔案描述符和相關的檔名等資訊。也就是我們通過訪問程序的檔案描述符可以找到該檔案的相關資訊。
程序在執行中,接下來我就把/var/log/messages這個檔案刪掉
shell> rm /var/log/messages
刪掉之後,我再來看看這個程序的變化
shell> lsof |grep /var/log/messages
rsyslogd 1737 root 1w reg 8,2 5716123 652638 /var/log/messages (deleted)
大家看到有變化了吧, 對比兩個之後發現多了(deleted)。要找到這個檔案在哪還要看看這個
pid:1737 fd:1 那我們有直接進入/proc/1737/fd/1用ll檢視一下
shell> cd /proc/1737/fd/
shell> ll
total 0
lrwx------ 1 root root 64 dec 23 13:00 0 -> socket:[11442]
l-wx------ 1 root root 64 dec 23 13:00 1 -> /var/log/messages (deleted)
l-wx------ 1 root root 64 dec 23 13:00 2 -> /var/log/secure
lr-x------ 1 root root 64 dec 23 13:00 3 -> /proc/kmsg
l-wx------ 1 root root 64 dec 23 13:00 4 -> /var/log/maillog
看到了1對應/var/log/messages (deleted),看看檔案是不是我們要的檔案:
shell> head -5 1
nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swversion="5.8.10" x-pid="1241" x-info=""] start
nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpuset
nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpu
nov 14 03:11:11 localhost kernel: linux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (red hat 4.4.7-4) (gcc) ) #1 smp fri nov 22 03:15:09 utc 2013
對比備份檔案:
shell> head -5 /var/log/message_bac
nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swversion="5.8.10" x-pid="1241" x-info=""] start
nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpuset
nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpu
nov 14 03:11:11 localhost kernel: linux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (red hat 4.4.7-4) (gcc) ) #1 smp fri nov 22 03:15:09 utc 2013
對比發現資料是一樣的,恢復
shell> cat 1 > /var/log/messages
對於許多應用程式,尤其是日誌檔案和資料庫,這種恢復刪除檔案的方法非常有用。
2.第二種方法 extundelete
測試誤操作刪除以下檔案
/usr/local/dbdata/gperftools-2.4.tar.gz #檔案
/usr/local/dbdata/pcre-8.32 #目錄
執行誤操作:
# rm -rf /usr/local/dbdata/gperftools-2.4.tar.gz /usr/local/dbdata/pcre-8.32
將誤操作所在分割槽進行唯讀保護
如果確定檔案被誤刪,在沒有備份的情況下請馬上對分割槽實施寫入保護(預防新的寫入覆蓋誤刪的塊資料,因此許可權給唯讀):
# #
資料恢復工具安裝
工具安裝部署
官方**是 ,其目前的穩定版本是extundelete-0.2.4.
# wget
解壓安裝
依賴包# yum -y install gcc-c++ e2fsprogs.x86_64 e2fsprogs-devel.x86_64
# tar -jxvf extundelete-0.2.4.tar.bz2
# cd extundelete-0.2.4
# ./configure
# make && make install
驗證安裝結果
# extundelete -v
檔案恢復過程
恢復指定檔案:
原理:從根節點(inode=2)開始找到被刪除檔案的i節點,然後recover i節點。
以下是模擬刪除gperftools-2.4.tar.gz(檔案)和pcre-8.32 (目錄)
先檢測被刪除的檔案有哪些:
# extundelete /dev/sdb --inode 2
可以看到,有以下兩個
gperftools-2.4.tar.gz 15 deleted
pcre-8.32 655361 deleted
注意:恢復過程不要在誤刪分割槽進行,謹防inode. block塊相互覆蓋
先恢復檔案(可根據檔名進行恢復):
# extundelete /dev/sdb --restore-file gperftools-2.4.tar.gz
恢復目錄(根據目:# extundelete /dev/sdb --restore-directory pcre-8.32
最後會在當前目錄下看到乙個名為recovered_files的目錄,在目錄裡就可以看到被誤刪除的檔案以及目錄:
根據上面操作證明extundelete 工具可以實現對誤刪資料的恢復,而且操作簡單。
總結:使用rm一定要謹慎
磁碟按照功能進行分割槽是必要的
linux恢復意外刪除的檔案
author skate time 2013 10 12 linux恢復意外刪除的檔案 當程序開啟某個檔案時,只要該程序保持開啟該檔案,即使將其刪除,它依然存在於磁碟中。這意味著,程序並不知道檔案已經被刪除,它仍然可以向開啟該檔案時提供給它的檔案描述符進行讀取和寫入。除了該程序之外,這個檔案是不可見...
Linux 恢復誤刪除的檔案
目標內容 恢復linux下誤刪除的檔案 1.恢復linux下誤刪除的檔案 刪除檔案和資料夾 rm rf 檔名或目錄名 r 遞迴刪除 可以刪除目錄和目錄裡面的東西 f 強行刪除 ext4檔案系統上刪除檔案,可以恢復 extundelete windows恢復誤刪除的檔案 final data v2.0...
恢復刪除的檔案
1 當程序開啟了某個檔案時,只要該程序保持開啟該檔案,即使將其刪除,它依然存在於磁碟中。這意味著,程序並不知道檔案已經被刪除,它仍然可以向開啟該檔案時提供給它的檔案描述符進行讀取和寫入。除了該程序之外,這個檔案是不可見的,因為已經刪除了其相應的目錄索引節點。2 在 proc 目錄下,其中包含了反映核...