jcb*_*lkr 9 linux data-recovery files
我看过几篇关于恢复已删除文件的帖子,但这种情况有所不同。我的妻子有一个名为 Journal.odt 的文件,她在其中保存了许多重要的个人信息,例如关于我们孩子的特殊记忆。前几天,当她试图在 OpenOffice 中打开它时,它抱怨格式。我让她取消并退出。当我cat
文件时,它完全是空的。ls
说文件是 0 字节。
如果她不小心选择了文件中的所有文本,按退格键并保存它,文件中仍然会存在 OpenOffice 元信息。
我立即关闭了她的笔记本电脑以防止对磁盘进行更多更改,直到我想到可以做的事情。
我过去做过一些复杂的事情,例如dd
用于从磁盘恢复原始文本,但我不知道在这里做什么。由于 odt 文件不是纯文本,我不能通过 grep 将整个磁盘通过管道传输。
任何建议将不胜感激。
此外,如果有人对可能出了什么问题有任何见解,我很乐意听到。
谢谢
小智 3
如果您使用 ext3 文件系统,请尝试遵循Carlo Wood 的 HOWTO
简而言之,
ext3grep $IMAGE --ls --inode 2 | grep your_file
查找您要查找的文件($IMAGE
例如,您的分区在
哪里/dev/sda2
;您需要ext3grep
)dd
。cat
文件放在您想要的任何位置从源头看:
》章节手动恢复示例
在下面的示例中,我们将手动恢复一个小文件。为了节省空间并使示例更具可读性,仅给出部分输出。
使用 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 星期四 2 月 7 日 03:41:44 2008 drwxr-xr-x bin
$ ext3grep $IMAGE --ls --inode 309540 | grep start_azureus 9 10 r 309631 D 1202351093 2008 年 2 月 7 日星期四 03:24:53 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 个间接块)。
索引节点时间:访问:1202350961 = Thu Feb 7 03:22:41 2008 文件修改:1202351093 = Thu Feb 7 03:24:53 2008 Inode 修改:1202351093 = Thu Feb 7 03:24:53 2008 删除时间:120235109 3 = 周四2008 年 2 月 7 日 03:24:53
直接块:
因此,我们将尝试在期刊中寻找其较旧的副本。首先,我们找到包含该索引节点的文件系统块:
$ ext3grep $IMAGE --inode 到块 309631 | grep 驻留在 Inode 309631 驻留在块 622598 的偏移量 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 4382098 6073 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 | $ ext3grep $IMAGE --print --block 8931 | $ ext3grep $IMAGE --print --block 8931 grep -A15 'Inode 309631' --------------Inode 309631------------------------ 生成 ID:2771183319 uid / gid: 1000 / 1000 模式: rrwxr-xr-x 大小: 0 链接数: 0 扇区: 0 (--> 0 间接块)。
索引节点时间:访问:1202350961 = Thu Feb 7 03:22:41 2008 文件修改:1202351093 = Thu Feb 7 03:24:53 2008 Inode 修改:1202351093 = Thu Feb 7 03:24:53 2008 删除时间:120235109 3 = 周四2008 年 2 月 7 日 03:24:53
直接块:
这确实与我们在区块 622598 中看到的相同。接下来我们查看较小的序列号,直到找到删除时间为 0 的序列号。我们找到的第一个(自下而上)是区块 6073:
$ ext3grep $IMAGE --print --block 6073 | $ ext3grep $IMAGE --print --block 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 间接块)。
索引节点时间:访问:1202350961 = 2008 年 2 月 7 日星期四 03:22:41 文件修改:1189688692 = 2007 年 9 月 13 日星期四 15:04:52 2007 索引节点修改:1189688692 = 2007 年 9 月 13 日星期四 15:04:52 删除时间:0
直接块:645627
以上是自动化的,可以使用命令行选项 --show-journal-inodes 更快地完成。此选项将查找 inode 所属的块,然后在日志中查找该块的所有副本,然后仅打印每个块中请求的 inode(如您所知,每个块包含 32 个 inode),从而消除重复项:
$ 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 个间接块)。
索引节点时间:访问:1202350961 = Thu Feb 7 03:22:41 2008 文件修改:1202351093 = Thu Feb 7 03:24:53 2008 Inode 修改:1202351093 = Thu Feb 7 03:24:53 2008 删除时间:120235109 3 = 周四2008 年 2 月 7 日 03:24:53
直接块:
--------------Inode 309631------------------------ 生成 ID: 2771183319 uid / gid: 1000 / 1000模式:rrwxr-xr-x 大小:40 链接数量:1 扇区:8(--> 0 个间接块)。
索引节点时间:访问:1202350961 = 2008 年 2 月 7 日星期四 03:22:41 文件修改:1189688692 = 2007 年 9 月 13 日星期四 15:04:52 2007 索引节点修改:1189688692 = 2007 年 9 月 13 日星期四 15:04:52 删除时间: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 &
康复了!”