恢复被覆盖的文件

恢复被覆盖的文件

我不小心误用了该cp命令并覆盖了 ext4 文件系统上的一个文件的内容。无论如何,我可以恢复这个旧文件的内容以及可能的元数据(即上次写入时间等)吗?

我知道这mv可以释放移动块,但这同样适用于批量复制操作吗?

答案1

ext4 文件系统中的会话示例:

创建两个具有指定大小的文件 a、b:

# dd if=/dev/urandom of=a bs=1282 count=1
1+0 records in
1+0 records out
1282 bytes (1.3 kB) copied, 0.000647314 s, 2.0 MB/s
# dd if=/dev/urandom of=b bs=3247 count=1
1+0 records in
1+0 records out
3247 bytes (3.2 kB) copied, 0.00106112 s, 3.1 MB/s

检查 a 的物理分配位置:

# filefrag -sve a
Filesystem type is: ef53
File size of a is 1282 (1 block of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..       0:      32833..     32833:      1:             last,eof
a: 1 extent found

将b复制到a,从而“覆盖”a。 (输出缩短。)

# strace cp b a
open("a", O_WRONLY|O_TRUNC)             = 4
write(4, "CX\256\330x01pP\326\0101~,\252\"\311\202\21\260\21y\377_S\254\2\352\262\v\3\t"..., 3247) = 3247

检查 a 在 cp 之后的物理位置:

# filefrag -sve a
Filesystem type is: ef53
File size of a is 3247 (1 block of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..       0:      33280..     33280:      1:             last,eof
a: 1 extent found

请注意位置从 更改3283333280。这意味着32833在本例中,原始数据可能仍可在 - 处找到。

发生的事情是cp截断输出文件,因此暂时它是一个 0 字节文件。这与删除它几乎相同,只是它重新使用了索引节点。写入该文件会从可用空间中的任何位置进行分配,该空间可能位于旧文件曾经所在的其他位置。

因此,如果您知道文件内容的某些部分,以便可以在原始数据中找到它,则可能有恢复的机会。这是这样photorec做的,但仅适用于具有不同标头的已知文件类型。extundelete可能不会有帮助,因为文件的索引节点并未真正删除,而只是重新用于新文件。

答案2

取决于数据的价值,因为这并不容易。现在请停止使用硬盘,对磁盘的每一次操作都会减少您恢复的机会。为了将来,学习和使用版本控制系统,并将存储库备份到远程位置。

如果文件被删除,但仍然被某个进程打开,那么它不会被删除。仍然可以通过在 中查找对它的引用/proc并将其复制到新位置来恢复它。

答案3

https://github.com/PabloLec/RecoverPy 该工具解决了我不小心将文件保存为空的问题...当我重新打开文件时,它是空的。

该工具可以使用关键字扫描驱动器中的块。该工具专门用于恢复被覆盖的文件内容,而不是典型的已删除文件。但内容仍保存在驱动器中的块上。

如何使用:

  1. 选择您计划执行搜索所需的驱动器,移动箭头键,然后单击 Enter 选择驱动器
  2. 搜索您确定文件包含的关键字
  3. 它会带来搜索结果,点击包含您要查找的关键字的结果
  4. 然后您可以导航到附近的块并选择它们以添加到文件中
  5. 一旦您拥有计划添加到文件中的所有块,请单击“保存文件”,它将在您的 tmp 文件夹中保存一个文件。

这个工具太棒了,因为我设法恢复了一个近 4000 行的文件......这是我一直在做的一些研究的笔记。 (是的,我应该进行备份),我吸取了教训,现在该文件在线。

相关内容