天天看點

ZT:使用lsof恢複誤删除的檔案

先介紹一些檔案的基本概念, 檔案實際上是一個指向inode的連結, inode連結包含了檔案的所有屬性, 比如權限和所有者, 資料塊位址(檔案存儲在磁盤的這些資料塊中). 當你删除(rm)一個檔案, 實際删除了指向inode的連結, 并沒有删除inode的内容. 程序可能還在使用. 隻有當inode的所有連結完全移去, 然後這些資料塊将可以寫入新的資料.

proc檔案系統可以協助我們恢複資料. 每一個系統上的程序在/proc都有一個目錄和自己的名字: 裡面包含了一個fd(檔案描述符)子目錄(程序需要打開檔案的所有連結). 如果從檔案系統中删除一個檔案, 此處還有一個inode的引用:

/proc/程序号/fd/檔案描述符

接下來, 你需要知道打開檔案的程序号(pid)和檔案描述符(fd). 這些都可以通過lsof工具友善獲得, lsof的意思是”list open files, 列出(程序)打開的檔案”. 然後你将可以從/proc拷貝出需要恢複的資料.

下面介紹在Fedora Core 5系統上使用lsof恢複誤删的檔案:

環境

主機: 使用微睦獨立主機, 一台基于vmware的虛拟獨立主機.

系統: Fedora Core 5

核心: 2.6.16-1.2122_FC5

lsof版本:

[zhaoke@fedora5 ~]$ /usr/sbin/lsof -v

lsof version information:

revision: 4.77

預備工作:

如果你的系統沒有安裝lsof, 可以從作者網站或pbone獲得.

恢複過程:

首先, 我們需要建立一個文本檔案, 删除然後恢複:

[zhaoke@fedora5 ~]$ man lsof | col -b > myfile

然後看一下檔案内容:

[zhaoke@fedora5 ~]$ less myfile

你可以看到lsof所有的文本幫助資訊.

現在按Ctrl-Z退出less指令, 然後在shell提示符下檢視檔案屬性資訊:

[zhaoke@fedora5 ~]$ stat myfile

File: `myfile’

Size: 116549 Blocks: 240 IO Block: 4096 regular file

Device: fd00h/64768d Inode: 492686 Links: 1

Access: (0664/-rw-rw-r–) Uid: ( 505/ zhaoke) Gid: ( 505/ zhaoke)

Access: 2006-11-20 12:59:38.000000000 +0800

Modify: 2006-11-20 12:59:34.000000000 +0800

Change: 2006-11-20 12:59:34.000000000 +0800

沒問題, 繼續下面工作:

[zhaoke@fedora5 ~]$ rm myfile

[zhaoke@fedora5 ~]$ ls -l myfile

ls: myfile: No such file or directory

stat: cannot stat `myfile’: No such file or directory

myfile檔案删除了.

這時候, 你不要終止仍在使用檔案的程序. 因為一旦終止, 檔案将很難恢複.

現在我們開始找回資料, 首先用lsof檢視一下:

[zhaoke@fedora5 ~]$ lsof | grep myfile

less 9104 zhaoke 4r REG 253,0 116549 492686 /home/zhaoke/myfile (deleted)

第一個縱行是程序的名稱(指令名), 第二縱行是程序号(PID), 第四縱行是檔案描述符(r意思是普通檔案), 現在你知道9104程序仍有打開檔案, 檔案描述符是4. 那我們開始從/proc裡面拷貝出資料. 你可能會考慮使用cp -a, 但實際上沒有作用, 你将拷貝的是一個指向被删除檔案的符号連結:

[zhaoke@fedora5 ~]$ ls -l /proc/9104/fd/4

lr-x—— 1 zhaoke zhaoke 64 Nov 20 13:00 /proc/9104/fd/4 -> /home/zhaoke/myfile (deleted)

[zhaoke@fedora5 ~]$ cp -a /proc/9104/fd/4 myfile.wrong

[zhaoke@fedora5 ~]$ ls -l myfile.wrong

lrwxrwxrwx 1 zhaoke zhaoke 29 Nov 20 13:02 myfile.wrong -> /home/zhaoke/myfile (deleted)

[zhaoke@fedora5 ~]$ file myfile.wrong

myfile.wrong: broken symbolic link to `/home/zhaoke/myfile (deleted)’

[zhaoke@fedora5 ~]$ file /proc/9104/fd/4

/proc/9104/fd/4: broken symbolic link to `/home/zhaoke/myfile (deleted)’

然後, 使用cp拷貝出資料:

[zhaoke@fedora5 ~]$ cp /proc/9104/fd/4 myfile.saved

最後, 确認一下檔案:

[zhaoke@fedora5 ~]$ ls -l myfile.saved

-rw-rw-r– 1 zhaoke zhaoke 116549 Nov 20 13:03 myfile.saved

[zhaoke@fedora5 ~]$ man lsof | col -b > myfile.new

[zhaoke@fedora5 ~]$ cmp myfile.saved myfile.new