如果您正在使用ext3文件系统,请尝试遵循Carlo Wood的HOWTO
简而言之,
- 使用ext3grep $ IMAGE --ls --inode 2 | grep your_file查找您要查找的文件(其中$ IMAGE是您的分区,例如/ dev / sda2)
- 查找包含未分配空间日志的文件系统块。
- 查找先前找到的所有引用块的日志描述符。
- 用dd复制块。
- 编辑文件以删除尾随零。
- 随心所欲地整理文件
从来源:
“本章手动恢复示例
在下面的示例中,我们将手动恢复一个小文件。仅给出部分输出以节省空间并使示例更易读。
使用ext3grep $ IMAGE --ls --inode我们找到要恢复的文件的名称:
$ ext3grep $ IMAGE --ls --inode 2 | grep carlo 3 end d 195457 D 1202352103 Thu Feb 7 03:41:43 2008 drwxr-xr-x carlo
$ ext3grep $ IMAGE --ls --inode 195457 | grep'bin $'| 头-n 1 34 35 d 309540 D 1202352104 Thu Feb 7 03:41:44 2008 drwxr-xr-x bin
$ ext3grep $ IMAGE --ls --inode 309540 | grep start_azureus 9 10 r 309631 D 1202351093 Thu Feb 7 03:24:53 2008 rrwxr-xr-x start_azureus
显然,inode 309631已删除,并且我们没有此文件的块号:
$ ext3grep $ IMAGE --print --inode 309631 [...]未分配Inode组:19代ID:2771183319 uid / gid:1000/1000模式:rrwxr-xr-x大小:0链接数:0扇区: 0(-> 0个间接块)。
Inode时间:已访问:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1202351093 = Thu Feb 7 03:24:53 2008 Inode Modified:1202351093 = Thu Feb 7 03:24:53 2008 Deleting time:1202351093 = Thu 2008年2月7日03:24:53
直接块:
因此,我们将尝试在日志中查找它的较旧版本。首先,我们找到包含该索引节点的文件系统块:
$ ext3grep $ IMAGE --inode-to-block 309631 | grep驻留在块622598中,inode 309631驻留在偏移量0xf00处。
然后,我们找到所有引用块622598的日志描述符:
$ ext3grep $ IMAGE --journal --block 622598 [...]引用块622598的日记语描述符:4381294 26582 4381311 28693 4381313 28809 4381314 28814 4381321 29308 4381348 30676 4381349 30986 4381350 31299 4381374 32718 4381707 1465 4381709 2132 4381755 2945 4381961 4606 4382137 6672 4382138 7536 4382139 7984 4382140 8931
这意味着序列号为4381294的事务在块26582中具有块622598的副本,依此类推。在底部,最大的序列号应该是写入磁盘的最后一个数据,因此,块8931应该与当前块622598相同。为了找到最后一个未删除的副本,应该从底部开始并开始工作向上。
如果尝试打印这样的块,则ext3grep会识别出它是inode表中的一个块,并将在其中打印所有32个inode的内容。但是,我们只希望看到inode 309631;因此,我们使用了一个智能grep:
$ ext3grep $ IMAGE --print --block 8931 | grep -A15'Inode 309631'-------------- Inode 309631 -----------------------生成ID:2771183319 uid / gid:1000/1000模式:rrwxr-xr-x大小:0链接数:0扇区:0(-> 0个间接块)。
Inode时间:已访问:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1202351093 = Thu Feb 7 03:24:53 2008 Inode Modified:1202351093 = Thu Feb 7 03:24:53 2008 Deleting time:1202351093 = Thu 2008年2月7日03:24:53
直接块:
这确实与我们在方框622598中看到的相同。接下来,我们看一下较小的序列号,直到找到一个删除时间为0的序列号。我们找到的第一个(自下而上)是块6073:
$ ext3grep $ IMAGE --print --block 6073 | grep -A15'Inode 309631'-------------- Inode 309631 -----------------------生成ID:2771183319 uid / gid:1000/1000模式:rrwxr-xr-x大小:40个链接:1个扇区:8个(-> 0个间接块)。
Inode时间:已访问:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1189688692 = Thu Sep 13 15:04:52 2007 Inode Modified:1189688692 = Thu Sep 13 15:04:52 2007 Deleting time:0
直接块:645627
上面的代码是自动化的,可以通过命令行选项--show-journal-inodes更快地完成。此选项将找到该索引节点所属的块,然后在日志中查找该索引块的所有副本,然后仅从每个这些块中打印所请求的索引节点(如您所知,每个包含32个索引节点),从而消除重复项:
$ ext3grep $ IMAGE --show-journal-inodes 309631组数:75最小/最大日志块:1115/35026正在加载日志描述符...完成日志事务4381435绕回,此事务可能丢失了一些数据块。期刊中的描述符数量:30258;最小/最大序列号:4379495/4382264在日志中找到的inode 309631的副本:
-------------- Inode 309631 -----------------------生成ID:2771183319 uid / gid:1000/1000模式:rrwxr-xr-x大小:0链接数:0扇区:0(-> 0个间接块)。
Inode时间:已访问:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1202351093 = Thu Feb 7 03:24:53 2008 Inode Modified:1202351093 = Thu Feb 7 03:24:53 2008 Deleting time:1202351093 = Thu 2008年2月7日03:24:53
直接块:
-------------- Inode 309631 -----------------------生成ID:2771183319 uid / gid:1000/1000模式:rrwxr-xr-x大小:40个链接:1个扇区:8(-> 0个间接块)。
Inode时间:已访问:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1189688692 = Thu Sep 13 15:04:52 2007 Inode Modified:1189688692 = Thu Sep 13 15:04:52 2007 Deleting time:0
直接块:645627
该文件确实很小:只有一个块。如前所示,我们使用dd复制此块:
$ dd if = $ IMAGE bs = 4096 count = 1 skip = 645627 of = block.645627 1 + 0条记录在1 + 0条记录中复制出4096个字节(4.1 kB),0.0166104秒,247 kB / s
然后编辑文件以删除尾随零,或复制前40个字节(文件的给定大小):
$ dd if = block.645627 bs = 1 count = 40 of = start_azureus 40 + 0条记录在40 + 0条记录中复制出40个字节(40 B),0.000105397秒,380 kB / s
$ cat start_azureus cd / usr / src / azureus / azureus ./azureus&
已恢复!”