我看过几篇关于恢复已删除文件的帖子,但这次情况有所不同。我妻子有一个名为 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 发行版。它有很多用于文件和硬盘恢复的工具。