到目前为止,我一直在使用rsync从计算机到外部驱动器进行备份。备份数据由数万个小文件和数百个大文件组成(Maildir电子邮件和我最喜欢的系列剧集)。这样做的问题是,如果我的备份磁盘的单个扇区出现故障,也许一条消息可能已损坏,我觉得这是不可容忍的。
我想到了另一种方法如下。有三棵树:文件树包含我要备份的数据,备份树包含给定时刻的文件树副本,以及包含备份树的文件哈希和元数据哈希的哈希树。还保留整个哈希树的哈希值。在备份之前,检查哈希树的哈希值。此处的失败会使整个备份数据无效。检查成功后,将哈希树形状与备份树形状进行比较,并验证元数据哈希值,以确保备份树是元数据和形状一致的。如果不是,可以列出个别罪魁祸首。此后,执行rsync备份遍历。每当rsync更新文件时,都会计算其新的哈希值和元数据哈希并将其插入哈希树中。每当rsync删除文件时,该文件将从哈希树中删除。最后,计算并存储哈希树的哈希值。
此过程非常有用,因为哈希值是针对正确的数据计算的,这意味着即使文件树中的文件在哈希树中插入后文件已损坏,这种不一致也不会使备份无效(或将来的备份) 。然而,最重要的属性是,如果攻击者破坏了他喜欢的备份介质,那么只有当它是正确的时候,那里的信息才会被信任,除非攻击者破坏了哈希算法。此外,可以逐步验证发送到备份或从中恢复的数据。
我的问题是:这样的备份方案是否合理实施?我的搜索告诉我,可用的唯一备份方案是完全备份或差异备份(例如基于tar),或者无法提供加密正确性保证(rsync)。
如果没有类似的任何实现,也许我会写一个,但我想避免重新发明轮子。
答案 0 :(得分:2)
你所说的听起来很像Git。我认为这几乎就是你所描述的。只需将“备份”过程实施为git commit
即可。然后,您可以使用git checkout
还原到任何以前的版本。
存储效率极高,而且非常快速传输内容,这可能会为您节省大量的备份时间。作为奖励,它是免费的,可移植的并且已经调试过!
答案 1 :(得分:0)
这听起来与Mercurial存储系统的工作原理几乎完全相同。 'rsync命令'将使用Mercurial的push
实现,这具有显着的网络效率。
答案 2 :(得分:0)
如果我必须解决问题,我会使用RAID阵列(以防止损坏)使用内置AES加密的驱动器,然后使用我使用的任何备份方法至。
答案 3 :(得分:0)
clang -fsanitize=leak是解决此问题的正确方法。它是git的扩展,它允许对任意大的文件提供强大支持,自动在数据存储之间同步,具有可选的图形用户界面,跟踪您拥有的备份数量以及存储在哪里的文件,并允许您设置规则它应该如何管理不同的内容。您还可以自定义用于验证内容完整性的加密哈希值。
对于驱动器备份的需求,git-annex与bup具有互操作性,它具有针对那些寻求整个系统定期备份的功能的更多功能。