恢复Ext3下被删除的文件

恢复Ext3下被删除的文件

 下面是这个教程将教你如何在Ext3的文件系统中恢复被rm掉的文件。

假设我们有一个文件名叫 ‘test.txt’

 $ls -il test.txt
 15 -rw-rw-r– 2 root root 20 Apr 17 12:08 test.txt
 

注意:: “-il” 选项表示显示文件的i-node号(15),如果你不知道Unix/Linux文件系统的“I结点”的话,你有必要先补充一下相关的知识。简单说来,i结点就是操作管理文件的一个标识号。

我们再看一下其内容:

$ cat test.txt
this is test file

好,现在我们开始删除文件:.

$rm test.txt
rm: remove write-protected regular file `test.txt’? y

 

使用 Journal 和 Inode 号恢复

注意,如果你删除文件后重启了系统,那么,相关的文件 journal 会丢失,我们也就无法恢复文件了。所以,恢复文件的前提是,Journal不能丢失,即,系统不能重启。

因为我们已经知道 test.txt 文件的 inode 号是 15,所以我们可以使用 debugfs 命令来查看:

debugfs: logdump -i <15>
FS block 1006 logged at sequence 404351, journal block 7241
(inode block for inode 15):
Inode: 15 Type: regular Mode: 0664 Flags: 0x0 Generation: 0
User: 0 Group: 0 Size: 20
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x48159f2d — Mon Apr 28 15:25:57 2008
atime: 0x48159f27 — Mon Apr 28 15:25:51 2008
mtime: 0x4806f070 — Thu Apr 17 12:08:40 2008
Blocks: (0+1): 10234
No magic number at block 7247: end of journal.


请注意上面信息中的这一行:

Blocks: (0+1): 10234

这就是inode 15存放文件的地址(数据块)。然后,我们知道了这个地址,我们就可以使用 dd 命令,把这个地址上的数据给取出来。

#dd if=/dev/sda5 of=/tmp/test.txt bs=4096 count=1 skip= 10234
1+0 records in
1+0 records out
  • if 是输入的设备
  • of 是输出的设备.
  • bs 指定一个block的大小
  • count 说明有多少个block需要dump
  • skip 说明从开始的地方跳过 10234 个block,并从取下一个block的数据

下面让我们看一下被恢复的文件:

$cat /tmp/test.txt
this is test file


当然,上面的文件恢复是基于我们知道文件的inode,可在现实中,我们并不知道这个信息,如果我们不知道inode,我们还可能恢复吗?是的,这是可能的,让我们来看一下如何恢复。

使用 Journal 和 文件名恢复

如果我们不知道文件的inode我们可能恢复吗?我可以告诉你,这是不可能的事情。不过我们有办法知道文件的inode号。下面让我们来看看怎么做到:

$rm mytest.txt
rm: remove write-protected regular file `mytest.txt’? y

注意,我们并不知道其inode号,但我们可以使用 debugfs 命令来查看(使用其 ls -d 选项)。

debugfs:  ls -d
 2  (12) .    2  (12) ..    11  (20) lost+found    2347777  (20) oss
<2121567> (20) mytest.txt

你看文件名了吧,它的inode号是 <2121567> ,注意,被删除了的文件的inode都是用尖括号包起来的。

即然知道了inode号,那么我们就很容易恢复了(使用 logdump选项):

debugfs:  logdump -i <2121567>
Inode 2121567 is at group 65, block 2129985, offset 3840
Journal starts at block 1, transaction 405642
  FS block 2129985 logged at sequence 405644, journal block 9
    (inode block for inode 2121567):
    Inode: 2121567   Type: bad type        Mode:  0000   Flags: 0x0   Generation: 0
    User:     0   Group:     0   Size: 0
    File ACL: 0    Directory ACL: 0
    Links: 0   Blockcount: 0
    Fragment:  Address: 0    Number: 0    Size: 0
    ctime: 0x00000000 — Thu Jan  1 05:30:00 1970
    atime: 0x00000000 — Thu Jan  1 05:30:00 1970
    mtime: 0x00000000 — Thu Jan  1 05:30:00 1970
    Blocks:
  FS block 2129985 logged at sequence 405648, journal block 64
    (inode block for inode 2121567):
    Inode: 2121567   Type: regular        Mode:  0664   Flags: 0x0   Generation: 913772093
    User:   100   Group:     0   Size: 31
    File ACL: 2130943    Directory ACL: 0
    Links: 1   Blockcount: 16
    Fragment:  Address: 0    Number: 0    Size: 0
    ctime: 0x4821d5d0 — Wed May  7 21:46:16 2008
    atime: 0x4821d8be — Wed May  7 21:58:46 2008
    mtime: 0x4821d5d0 — Wed May  7 21:46:16 2008
    Blocks:  (0+1): 2142216

上面有很多信息,让我们仔细地查看,你可以看到下面一行信息:

 FS block 2129985 logged at sequence 405644, journal block 9

并且,其类型是:

 Type: bad type

再仔细看一下文件的时间戳下面的Blocks: 什么也没有。那么,让我们看一下下一个block:

FS block 2129985 logged at sequence 405648, journal block 64
    (inode block for inode 2121567):

这一条Journal就有block信息了:

Blocks:  (0+1): 2142216

这就是被删除文件的地址,让我们再次运行恢复命令:

$sudo dd if=/dev/sda5 of=/home/hchen/mytest_recovered.txt bs=4096 skip=2142216 count=1

再让我们来检查一下文件内容:

$ cat mytest_recovered.txt
this is my test file 

小结

好了,下面是我们的一些总结:
1)使用 debugfs: ls -d 找到被删除文件的inode号。
2)使用 debugfs:logdump找到文件的数据块地址。
3)使用dd 命令把数据取出来存成文件。

网上有很其它不同的方法来恢复文件,基本上也是使用debugfs这个命令,有的还使用到了lsdel,其实大同小异,这个教程是我在网上看到的,虽然他说只是针对Ext3文件系统的,但我总感觉应该可以用于Ext2文件系统,不过我没有试过。也许Ext2和Ext3被debugfs输出的信息不一样吧。大家可以去试试。

(全文完)


关注CoolShell微信公众账号和微信小程序

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

——=== 访问 酷壳404页面 寻找遗失儿童。 ===——
好烂啊有点差凑合看看还不错很精彩 (4 人打了分,平均分: 4.50 )
Loading...

恢复Ext3下被删除的文件》的相关评论

  1. 我的输出信息是这样的, 怎么办呢?

    debugfs: logdump -i
    Inode 29622277 is at group 904, block 29622274, offset 512
    Journal starts at block 1334, transaction 1137796
    FS block 29622274 logged at sequence 1137948, journal block 6119
    (inode block for inode 29622277):
    Inode: 29622277 Type: regular Mode: 0664 Flags: 0x0 Generation: 307260863
    User: 500 Group: 500 Size: 56514
    File ACL: 0 Directory ACL: 0
    Links: 1 Blockcount: 120
    Fragment: Address: 0 Number: 0 Size: 0
    ctime: 0x50e8e78b — Sun Jan 6 10:55:07 2013
    atime: 0x50f7f556 — Thu Jan 17 20:57:58 2013
    mtime: 0x50e8e78a — Sun Jan 6 10:55:06 2013
    Blocks: (0+8): 29652747 (8+4): 29652775 (IND): 29652779
    FS block 29622274 logged at sequence 1137949, journal block 6122
    (inode block for inode 29622277):
    Inode: 29622277 Type: regular Mode: 0664 Flags: 0x0 Generation: 307260863
    User: 500 Group: 500 Size: 56514
    File ACL: 0 Directory ACL: 0
    Links: 1 Blockcount: 120
    Fragment: Address: 0 Number: 0 Size: 0
    ctime: 0x50e8e78b — Sun Jan 6 10:55:07 2013
    atime: 0x50f7f556 — Thu Jan 17 20:57:58 2013
    mtime: 0x50e8e78a — Sun Jan 6 10:55:06 2013
    Blocks: (0+8): 29652747 (8+4): 29652775 (IND): 29652779
    FS block 29622274 logged at sequence 1137950, journal block 6126
    (inode block for inode 29622277):
    Inode: 29622277 Type: regular Mode: 0664 Flags: 0x0 Generation: 307260863
    User: 500 Group: 500 Size: 0
    File ACL: 0 Directory ACL: 0
    Links: 0 Blockcount: 0
    Fragment: Address: 0 Number: 0 Size: 0
    ctime: 0x51075fee — Tue Jan 29 13:36:46 2013
    atime: 0x50f7f556 — Thu Jan 17 20:57:58 2013
    mtime: 0x51075fee — Tue Jan 29 13:36:46 2013
    dtime: 0x51075fee — Tue Jan 29 13:36:46 2013
    Blocks:
    No magic number at block 6139: end of journal.

发表评论

电子邮件地址不会被公开。 必填项已用*标注