文件神秘地空了。恢复选项?

文件神秘地空了。恢复选项?

我看过几篇关于恢复已删除文件的帖子,但这次情况有所不同。我妻子有一个名为 Journal.odt 的文件,其中保存了许多重要的个人信息,例如有关我们孩子的特殊记忆。有一天,当她尝试在 OpenOffice 中打开它时,它抱怨格式问题。我让她取消点击并退出。当我的cat文件是完全空的。ls说文件是0字节。

如果她不小心选择了文件中的所有文本,按退格键并保存,文件中仍然会包含 OpenOffice 元信息。

我立即关闭了她的笔记本电脑,以防止对磁盘进行任何更多更改,直到我能想到要做的事情。

我过去做过一些复杂的事情,例如使用dd从磁盘恢复原始文本,但我不知道在这里做什么。由于 odt 文件不是平面文本,我不能只通过 grep 管道传输整个磁盘。

任何建议将不胜感激。

另外,如果有人对可能出了什么问题有任何见解,我很想听听。

谢谢

答案1

如果您使用的是 ext3 文件系统,请尝试以下操作卡洛·伍德的 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 = 2008 年 2 月 7 日星期四 03:22:41 文件修改:1202351093 = 2008 年 2 月 7 日星期四 03:24:53 索引节点修改:1202351093 = 2008 年 2 月 7 日星期四 03:24:53 删除时间:12023510 93 = 星期四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 3067 6 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 = 2008 年 2 月 7 日星期四 03:22:41 文件修改:1202351093 = 2008 年 2 月 7 日星期四 03:24:53 索引节点修改:1202351093 = 2008 年 2 月 7 日星期四 03:24:53 删除时间:12023510 93 = 星期四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 = 2008 年 2 月 7 日星期四 03:22:41 文件修改:1202351093 = 2008 年 2 月 7 日星期四 03:24:53 索引节点修改:1202351093 = 2008 年 2 月 7 日星期四 03:24:53 删除时间:12023510 93 = 星期四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 &

康复了!”

答案2

尝试测试盘和 photorec,但我理解你的写作的方式可能是了解定期备份的价值的艰难方法。此外,您可能希望从 CD 启动以防止硬盘被进一步更改。我个人喜欢系统救援盘为此,但它主要是基于命令行的。

答案3

使用 Caine 一个用于数字取证的特殊 Linux 发行版。它有很多用于文件和硬盘恢复的工具。

相关内容