答案1
答案是“可能是的,但这取决于文件系统类型和时间。”
除非偶然,这三个示例都不会覆盖 old_file 或execution_file 的物理数据块。
mv new_file old_file
。这将取消链接 old_file。如果存在指向 old_file 的其他硬链接,则这些剩余链接中的块将保持不变。否则,这些块通常(取决于文件系统类型)被放置在空闲列表中。然后,如果mv
需要复制(与仅移动目录条目相反),则将分配新块作为mv
写入。这些新分配的块可能与刚刚释放的相同,也可能不同。在像这样的文件系统上超高速文件系统,如果可能的话,从与创建文件的目录相同的柱面组中分配块。因此,从目录中取消链接文件并在同一目录中创建文件将有可能重新使用(并覆盖)一些刚刚释放的相同块。这就是为什么对意外删除文件的人的标准建议是不要将任何新数据写入其目录树中的文件(最好不要写入整个文件系统),直到有人可以尝试文件恢复。
cp new_file old_file
将执行以下操作(您可以使用它strace
来查看系统调用):打开(“旧文件”,O_WRONLY | O_TRUNC)= 4
O_TRUNC 标志将导致所有数据块被释放,就像
mv
上面所做的那样。如上所述,它们通常会被添加到空闲列表中,并且可能会也可能不会被命令完成的后续写入重用cp
。vi existing_file
。如果vi
实际上是vim
,则该:x
命令执行以下操作:unlink("existing_file~") = -1 ENOENT(没有这样的文件或目录)
重命名(“现有文件”,“现有文件〜”)= 0
打开(“现有文件”,O_WRONLY | O_CREAT | O_TRUNC,0664)= 3
所以它甚至不会删除旧数据;数据保存在备份文件中。
在 FreeBSD 上,
vi
是open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
,其语义与上面的 , 相同cp
。
无需特殊程序即可恢复部分或全部数据;您所需要的只是grep
和dd
以及对原始设备的访问。
对于小文本文件grep
,来自@Steven D的回答在您链接的问题中是最简单的方法:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
但对于可能位于多个不连续块中的较大文件,我这样做:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
这将为您提供匹配行的偏移量(以字节为单位)。接下来执行一系列dd
命令,从
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
您还想读取该块之前和之后的一些块。在 UFS 上,文件块通常为 8KB,并且通常分配得相当连续,单个文件的块与其他文件或可用空间中的 8KB 块交替交错。 UFS 上文件的尾部最多有 7 个 1KB 碎片,这些碎片可能是连续的,也可能不是连续的。
当然,在压缩或加密数据的文件系统上,恢复可能不会那么简单。
实际上,Unix 中很少有实用程序会覆盖现有文件的数据块。我想到的是dd conv=notrunc
。另一个是shred
。
答案2
确保 /var/tmp 或较大的地方有足够的磁盘空间。
尝试
grep -i -a -B100 -A100 'a string unique to your file' /dev/sda1 |
strings > /var/tmp/my-recovered-file
其中 /dev/sda1 是系统上的磁盘。
然后在 my-recovered-file 中搜索您的字符串。
它可能大多数都在那里,如果你发现它检查是否缺少行空间,括号,符号等。
使用文件中相当独特的搜索词或字符串来减少文件中的数据量。如果您搜索诸如“echo”之类的单词,您将得到大量字符串,因为系统将有很多包含单词 echo 的文件。
答案3
我要说不(用一个巨大的星号)。
考虑一下数据是如何存储在磁盘上的。您有包含数据并指向下一个块(如果有)的块。
当您覆盖数据时,您正在更改块内容(如果您正在扩展文件,则更改所有结束标记)。所以什么都没有应该能够恢复(见下文)。
如果缩短文件,那么您将丢失旧块,并且它们很快就会被回收。如果您是一名程序员,请考虑一个链接列表,在该链接列表中,您无需执行释放/删除操作就“丢失”了一半的列表。该数据仍然存在,但祝你好运找到它。
考虑一下可能有趣的事情是碎片化。
当磁盘上存在不连续数据的“漏洞”时,就会出现碎片。这可能是由于修改文件而导致的,例如延长或缩短文件,导致它们不再适合磁盘上的原始位置。
如果文件增长超过其原始大小(此时需要移动),根据您的文件系统,您可以将整个文件复制到旧数据仍然存在的新位置(但标记为免费)或者您只是更改旧的结束指针并使其指向新位置(这将导致抖动)。
长话短说,您的数据可能会丢失(无需经过在显微镜下观察的极端取证过程);然而,它有可能仍然存在。
答案4
我发现自己处于同样的情况 - 我做了一个“mv FILE1.c FILE2.c”。
您要求“Linux 计算机上没有安装特殊程序”,如果您在其他计算机上安装这些工具或使用 livedisk,则可以实现这一点。
停止或限制对磁盘的写入
在这种情况下,最好限制手头系统上的任何写入,因为您实际上可能会覆盖想要保留的数据。
因此,首先,我希望您不要从保存数据的计算机上浏览网页!
在某些情况下,文件可能仍在进程中打开。如果您认为是这样,请先不要停止您的机器。您可能希望先使保持文件打开的进程进入睡眠状态,然后再查找数据的句柄。在这种情况下,您不必停止机器。至少还有一个回复指出了该方法。该文件在其所在目录中通常会有一个乱七八糟的名称(使用查看ls -lart
- 最近的文件出现在最后,日期可能会提示您哪个是最好的猜测)。
使用恢复系统
然后,根据您的优先级,执行以下操作之一:
如果您可以将磁盘插入另一台计算机或从另一个分区、USB 闪存盘或 Live CD 启动:
停止机器,如果您(和您的系统)可以接受,只需拔掉电源插头、电池或长时间按下开/关按钮即可将其关闭。
彻底断电会增加覆盖所需文件的风险。
如果您无法启动另一个系统:限制对系统的写入。杀死可能写入磁盘的程序。
“photorec”与“testdisk”一起安装
大多数时候我使用“testdisk”。当我检查是否还有其他我不知道的方法时,我登陆了此页面。
“testdisk”是我经常预先安装的一组工具,我将其安装在我的 Ubuntu 16.04 机器上(“遗留”是有充分理由的)。
您要求“Linux 机器上没有安装特殊程序” - 您可以在另一台机器上安装“testdisk”并从那里读取原始磁盘。您也可以从 USB 磁盘启动。
如果您不能这样做,您可以将其安装在手头的系统上。在这种情况下,我建议删除一些您闲置的旧大文件,例如您不久前下载的大 ZIP 或 iso。我这样做是因为我认为最近的数据往往位于磁盘末尾附近,而不是开头。
然后你可以使用类似的东西安装“testdisk”(以 debian 为例):
apt-get install testdisk
然后启动“photorec”,让它将文件恢复到与数据所在的设备(分区)不同的设备(分区)。在某些情况下,这可能是 USB 驱动器、网络驱动器,甚至是 /tmp 目录(当它映射到 RAM 时)。
photorec /d PATH_TO_OTHER_DEVICE
选择要恢复的设备后,从底部菜单中选择“[文件选项]”。然后取消选择所有选项并仅选择您要查找的文件类型。就我而言,它是一个“C”文件,所以我选择“文本”。 photorec
仍然创建.c
它找到的文件。然后启动[Search]
并仅在Free
空间中查看。
当恢复运行时,我执行了如下命令:
grep minTemp recup*/*.c
在 photorec 创建恢复目录的路径中。我知道我的文件中存在“minTemp”,并且我正在寻找 ac 文件。
我获得了该文件不同版本的 30 个条目,首先检查较大的条目。
photorec
仍在运行,但“minTemp”上现在有新的匹配项,因此我停止了该过程,因为我确信我拥有所需的文件。
对外服务
根据您的专业知识,还可以选择分包工作。有很多专门从事数据恢复的公司 - 他们不会在您的磁盘上安装任何工具。如果分包商可以恢复数据,最低成本约为 500 美元。
准备
为了更好地应对这种情况,请做好准备!:
- 了解如何在数据发生之前恢复数据,尝试在不需要恢复时恢复一些数据。
- 在需要之前在您的系统上安装“testdisk”(安装 testdisk 不会覆盖数据,因为它已经安装);
- 将数据保存在与系统文件不同的分区上 - 有些甚至建议为 /tmp 目录使用单独的分区;
- 使用快照。您可以在“设备”级别(zfs/btrfs)、快照工具(rsnapshot)甚至可能保留一些旧文件版本的私有云上执行此操作。也有集成了此类功能的 NAS 系统(您可以在“.snapshot”目录中找到以前的版本;
- 使用 ShadowProtect、Acronis 等备份工具,让您可以对在线磁盘进行频繁的增量备份。
- 准备一个带有恢复工具和适当的实时操作系统的 USB 驱动器。 [我身上带着一个]。