我知道完整备份、增量备份和减量备份。但是,我很奇怪为什么没有人(Windows Backup、TrueImage、Paragon)实现以下备份算法。
它需要支持链接的备份介质,例如 NTFS。理想情况下,备份介质具有相同的格式,以支持所有功能,例如备用数据流 (ADS)。
- 第一次备份是完整备份。这会将所有文件复制到备份介质上的 \ 子文件夹中。我们称此文件夹为大号(表示“最后”)。没有特殊的文件格式,只需复制文件即可。
- 下次备份时,将创建一个新的 \ 子文件夹,我们称之为C(表示“当前”)。与完整备份相比有所更改的文件将再次从源磁盘复制。未发生更改的文件将从大号到C并创建一个硬链接来指向大号到C。
- 重复备份时,将应用相同的程序C和另一个新文件夹。
我是否遗漏了该算法中哪些部分导致其无法工作?
虽然我确实注意到了一些问题,但我可以看到以下优点:
- 最后一次备份(C) 始终是完整备份。要恢复备份,您只需要此一个备份。用户可以删除任何旧备份,而不会破坏恢复的可能性(完整、增量和递减备份并非如此)。
- 由于链接的存在,旧备份将起到与完整备份一样的作用,但占用的磁盘空间要少得多。
- 如果用户未删除文件,则文件更改的完整历史记录将会保留。但与 SVN 不同的是,可以删除旧版本。
- 移动文件和创建链接是非常快的操作。创建备份也应该具有相应的性能。
- 可以选择性地删除旧备份中更改的文件(例如,仅删除大文件),而不删除完整的备份
答案1
rsync
您所描述的内容已通过数十个包装程序使用--link-dest=
,例如迪尔维什等等。
答案2
HardLinkShell 扩展其“Delorean 复刻版”(见其他答案) 并不是唯一的“即用型”解决方案。还有其他选择:
- 控制台工具执行程序来自同一个程序员,功能相同。作者提供了预先编写的带时间戳的 DeLorean 的批处理文件副本也是如此。
- GUI 备份解决方案硬链接备份它几乎完全满足您的要求。
- 使用
ln.exe
1. 将旧备份的硬链接副本复制到新备份文件夹中,然后使用xcopy
或robocopy
仅复制新文件并删除旧文件(我认为这是--mirror
用于 robocopy)。测试它以确保更改的文件被删除然后复制而不仅仅是修改(后者也会因为硬链接而更改旧备份中的文件)。 - 使用
xcopy
或robocopy
进行正常备份,然后运行dfhl.exe /l /r /w /s /h "X:\Backups-parent-folder\."
对所有相同的文件进行硬链接。 - 与 3 相同,但
finddupe -hardlink X:\Backups-parent-folder\**
而不是 dfhl。
免责声明:我使用过上述所有程序(除了 finddupe),但使用方式不一定相同。我与任何程序都没有任何金钱或投资关系或任何其他关系。
答案3
看起来是个可行的计划。它可以减少查看和使用备份所需的时间。如果备份使用频繁,并且需要查看完整的快照,这将非常方便。
我会将措辞“从 L 移动到 C”改为简单地说“从 L 硬链接到 C”。
一个注意事项 - 删除包含大量链接的文件(参考您最后提到的要点)意味着找到所有这些链接并删除它们。因此,以这种方式有选择地恢复空间会更具挑战性,但使用 find 命令很容易做到。
答案4
您所描述的本质上是一种增量备份方案。
作为Dan D. 指出,它实际上被各种工具使用,特别是在类 Unix 平台上,其中许多关心的程序本身都会处理硬链接。
然而,许多 Windows 程序不能很好地处理硬链接。在 FAT 时代,硬链接实际上被认为是错误因为文件系统中不允许两个名称指向相同的数据块。
您描述的是增量备份方案,因为任何一个备份都建立在所有先前的备份之上。唯一真正的区别在于这些先前备份的引用方式,以及删除先前备份更容易的事实,因为只有在相关文件的引用计数达到零时才会真正删除数据,而这将发生在不再被任何备份引用时。当然,这样做的缺点是很难准确预测删除给定的先前备份将释放多少空间;在极端情况下,除了文件系统元数据使用和回收的空间外,它实际上可能为零。(该备份和相邻备份之间没有变化。)
对于“正常”增量备份,您必须手动进行恢复。就您所描述的情况而言,引用是隐式的。但是,如果您删除了最近备份期间未实际复制的所有内容(引用计数恰好为 1),则备份仍然不完整,就像您进行了多次增量备份然后尝试仅恢复最近的一次备份一样。