如何恢復LINUX中意外刪除的文件?
當進程打開某個文件時,只要該進程保持打開該文件,即使將其刪除,它依然存在于磁盤中。這意味著,進程并不知道文件已經被刪除,它仍然可以向打開該文件時提供給它的文件描述符進行讀取和寫入。除了該進程之外,這個文件是不可見的,因為已經刪除了其相應的目錄索引節點。在這種情況可以通過lsof來恢復這些文件。
在/proc目錄下,其中包含了反映內核和進程樹的各種文件。/proc目錄掛載的是在內存中所映射的一塊區域,所以這些文件和目錄并不存在于磁盤中,因此當我們對這些文件進行讀取和寫入時,實際上是在從內存中獲取相關信息。大多數與lsof相關的信息都存儲于以進程的PID命名的目錄中,即/proc/12中包含的是PID為12的進程的信息。每個進程目錄中存在著各種文件,它們可以使應用程序簡單地了解進程的內存空間、文件描述符列表、指向磁盤上的文件的符號鏈接和其他系統信息。lsof程序使用該信息和其他關于內核內部狀態的信息來產生其輸出。所以lsof可以顯示進程的文件描述符和相關的文件名等信息。也就是我們通過訪問進程的文件描述符可以找到該文件的相關信息。
下面舉例說明
我/tmp目錄下創建了腳本文件,時刻在后臺運行,但是tmp目下會被系統定時刪除的,但犯懶不想重寫腳本,想把原來的找回,具體步驟如下。
1.查看已經被刪除的文件diamon.sh,已經不存在了
[root@centos5 ~]# ll /tmp/
total 28
-rw-r--r-- 1 root root 402 Sep 26 14:19 load_tab.sh
srwxrwxrwx 1 mysql mysql 0 Sep 16 15:20 mysql.sock
drwx------ 2 root root 4096 Oct 12 15:44 ssh-hiPBw10887
drwx------ 2 root root 4096 Oct 10 16:12 ssh-lUXbjf6337
2. 使用lsof來查看當前哪個進程正在打開文件”/tmp/diamon.sh“
[root@centos5 ~]# lsof | grep diamon
sh 8455 root 255r REG 253,0 173 764298 /tmp/diamon.sh (deleted)
[root@centos5 ~]#
從上面的輸出可以看到,進程8455正在以只讀的方式打開這個文件,打開的文件描述符為255,同時文件/tmp/diamon.sh被標記刪除。然后我查看文件" /proc/8455/fd/255"
[root@centos5 ~]# more /proc/8455/fd/255
#variables
dir=/tmp
while (true)
do
v_num=`ps -ef | grep load_tab | grep -v grep | wc -l`
if [ $v_num -lt 4 ] ; then
sh /tmp/load_tab.sh > /dev/null 2>&1 &
fi
done
[root@centos5 ~]#
3. 已經找到已經被刪除的文件了嗎然后利用I/O重定向將其恢復到指定文件中,如下
[root@centos5 ~]# cat /proc/8455/fd/255 > /tmp/diamon.sh
檢查文件已經被恢復了
[root@centos5 ~]# ll /tmp
total 36
-rw-r--r-- 1 root root 173 Oct 12 16:53 diamon.sh
-rw-r--r-- 1 root root 402 Sep 26 14:19 load_test10.sh
srwxrwxrwx 1 mysql mysql 0 Sep 16 15:20 mysql.sock
drwx------ 2 root root 4096 Oct 12 15:44 ssh-hiPBw10887
drwx------ 2 root root 4096 Oct 10 16:12 ssh-lUXbjf6337
[root@centos5 ~]#
查看恢復的文件內容是否正常
[root@centos5 ~]#
[root@centos5 ~]# more /tmp/diamon.sh
#variables
dir=/tmp
while (true)
do
v_num=`ps -ef | grep load_test | grep -v grep | wc -l`
if [ $v_num -lt 4 ] ; then
sh /tmp/load_test10.sh > /dev/null 2>&1 &
fi
done
[root@centos5 ~]#
至此linux恢復刪除文件成功結束
總結:
A.在文件被刪除時,不要慌,盡可能保存現場
B.對于某些數據庫文件被誤刪除很有效