无需复制即可从影子副本恢复大文件

无需复制即可从影子副本恢复大文件

我有一个带有影子副本的卷。影子副本包含一个非常大的文件(假设为 100 GB)。影子副本与其所影子的卷位于同一磁盘上。“原始”文件已被删除。我想从影子副本中恢复它。我可以使用以下命令安装影子副本

mklink /d __Shadow \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69\ 

然后只需从卷影副本中复制文件,但速度会很慢,并且会使使用的空间加倍(会有两个单独的文件副本)。

我尝试使用mklink /H创建该文件的硬链接,但它不起作用(它检查该文件是否在同一个“卷”中。我有意大利版的 Windows。翻译成英文时,错误是系统无法将文件移动到其他磁盘驱动器)。还有其他工具可以做到这一点吗?

我正在运行 Windows 11 Pro。

附录:刚刚尝试使用 PowerShell 7.4.1 和例如。同样的结果,同样的错误。这可能是在操作系统级别进行的(错误)检查。

答案1

这可能是在操作系统级别进行的(错误)检查。

检查没有错。卷影复制在文件系统下的块级别工作;它仅使用文件系统来存储差异,但它们都是“更改的块 XY”而不是“更改的文件”。实际上,当您安装 VSC 快照时,您有两个独立的 NTFS 实例它们可以看到底层磁盘的不同视图,其中相同的扇区/簇号可能包含不同的数据,并且它们的行为就像访问两个不相关的磁盘一样。

因此,如果文件已被删除,那么就不再像提取“快照”文件引用的区段列表(簇号)并创建一个引用“实时”卷上相同区段的新文件那么简单,因为这些簇不再保证包含原始数据。在卷的“实时”视图中,其中一些簇可能已被覆盖和/或分配给另一个文件 - 如果您有 100 GB 的簇,则发生这种情况的可能性相当高。

VSC 保存旧数据的方式是将其复制到“差异区域”,该区域在活动卷上由“系统卷信息”下的文件表示。属于全部文件在被覆盖之前会被收集到相同的“差异区域”,这意味着例如快照的群集 #1234 实际上保存在活动卷的群集 #56789 中。只有 VSC 知道差异区域的内部结构 - NTFS 本身并不知道;它只是将其视为其他驱动程序正在使用的一堆大文件。

因此,这会产生一些问题:首先,由于 NTFS 不与 VSC 交互,因此它无法创建跨卷链接,因为它不知道“快照”中看到的文件的群集布局如何转换为要在“实时”卷上创建的链接的群集布局。其次,如果您做过说服 NTFS 制作一个引用 VSC 快照区域内的群集的文件,您将有两个引用相同群集的文件。ReFS 可以处理这种情况;NTFS 不能。

第三,这样的文件必须永远是只读的,因为对 VSC 差异区域中集群的任何更改都会导致更改应该是只读的 VSC 快照。 (VSC 的集群复制不适用于已经与 VSC 存储相对应的集群!)反之亦然,删除 VSC 快照可能会导致损坏“实时”文件。

因此,NTFS 通常拒绝跨卷链接,而 VSC 快照则不例外,这是正确的。

可以如果 NTFS 检查 VSC 中哪些扇区还没有被覆盖,那么它肯定可以正常工作,并且复制覆盖的扇区从 VSC 的存储中返回到常规位置,但这是远的除了绕过检查之外,还需要更多的代码,而且我认为这是不可能的,第三方应用程序无法做到这一点——这需要直接在 NTFS 中实现。


(这与 Btrfs 快照非常不同,Btrfs 快照都共享底层存储的单一视图,而从快照中复制文件仅仅引用属于另一个文件的相同扇区。)

答案2

恢复文件(而不是复制)的通常建议是这样的:

  1. 右键单击要还原的文件,或如果该文件已被删除,则右键单击其所在的文件夹,然后单击Properties
  2. 点击Previous Versions选项卡
  3. 选择包含文件的还原点
  4. 点击Restore
  5. 单击Yes以查看警告消息(请绝对确保此位置中没有其他文件将被此过程覆盖,如果有,则移动他们在别处
  6. 该文件现在将恢复到其先前所在的文件夹。

参考 :恢复丢失或删除的文件

相关内容