计算机文件备份基础(附 python 增量备份脚本)

                     

贡献者: addis

预备知识 计算机文件简介

1. 最原始的多版本备份方法

   为了防止文件被误删、误改、硬盘损坏等带来的文件丢失,最普通原始的多版本方法大概要数复制粘贴了。假设你笔记本上所有重要的文件都在一个文件夹 我的文件夹 中。为了安全起见你买了一个甚至多个移动硬盘,每隔一段时间把它复制到硬盘中的 我的文件夹-备份 中,用不同的版本号(例如日期)命名为:我的文件夹v20230101我的文件夹v20230108 等等。但这样做的缺点是大量重复的文件会浪费移动硬盘空间,写入这些文件也同样会浪费许多时间。这时你很可能会发现一些支持多版本增量备份的备份软件。本文介绍一些备份的基本常识,以及提供一些简单免费但非常可靠的备份方案。本文对文件备份的主要目标是备份方案能够验证每个文件和备份文件中每比特的数据都是完好无损的,以及每个文件的所有不同版本都需要保留(包括删除的文件)。

   在进一步讲解各种不同的增量备份方法之前,我们需要简单了解计算机文件的构成,常用增量备份软件的原理,以及如何检查其内容的完整性的一些方法。本文假设我们只需要备份文件名(含路径)和文件内容(含文件大小)。

2. 增量备份

   常用的备份软件在进行增量备份时通常通过文件大小修改时间(元数据)的变化来判断文件是否发生变化,从而在每次增量备份时只备份它认为发生改变的文件。但我们已经看到,依赖这两个信息判断文件内容是否改变并不绝对可靠,软件或硬件错误都可能在不改变二者的情况下改变甚至破坏文件内容。而一旦这些错误发生,通常的增量备份软件并不能检测到。更糟糕的是,备份硬盘本身也可能随着其老化和磨损出现坏点,而常用的备份软件一般不具有检查备份数据完整性的功能。即使使用不同硬盘进行多重备份,也无法定期检验哪个备份是完好的。

3. 文件指纹:哈希值

   检查文件内容完整性的最佳办法要数哈希(hash)了。一个文件的哈希值是根据其文件内容(注意不包括文件名)生成的一串固定长度的字符(通常为几十个 16 进制字符),常见的哈希算法有 SHA1SHA256MD5 等。哈希值虽然不能还原出文件本身,但它的计算却依赖于文件内容的每一个字节或者说每一个比特。绝大多数情况下,我们可以认为哈希值改变当且仅当文件内容改变,但一个重要的例外是对一些不太安全的哈希算法,有可能使文件被黑客恶意篡改而保持其哈希值不变。在一些较为严肃的文件下载网页中,通常会提供下载文件的哈希值,用户下载完成后可以用这些哈希值来验证文件的完整性。

   著名的源码版本管理软件 Git(被用于管理 Linux 内核源码)就是使用文件的 SHA1 哈希值来判断文件夹中哪些文件发生了改变,以及检查文件历史备份的数据完整性。事实上,Git 也可以用于对任何类型的文件进行增量备份,但这对普通用户来说可能具有较高的学习门槛。另外,Git 在处理大文件时速度较慢(笔者的测试中写入速度只有 15-40 MB/s),这主要时因为 Git 需要对文件进行压缩,内容查重等一系列操作。单纯计算文件的哈希值速度则会快得多,几乎只受限于硬盘读取文件的速度。

4. 用网盘增量备份

   这是笔者给大部分读者推荐的备份方法。现在大部分网盘都支持所谓的 “秒传” 功能,其原理就是网盘客户端在任何用户上传每个文件前都计算其哈希值,如果任何其他用户已经上传过具有相同哈希值的文件(当然也会参考文件大小等),那么客户端就会取消上传,而在用户的网盘中添加服务器上指纹相同的文件的一个 “快捷方式”。这也是为什么一些网盘可以用极低费用提供巨大储存空间。

   另外,规模较大的网盘服务商基本都有规范的服务器管理和多重备份方案,所以只要网盘不下架,数据安全性往往比个人的储存方式要高得多。

   还是假设你所有文件都在文件夹 我的文件 中要用网盘进行增量备份,只需要定期上传该文件夹,然后用不同的版本号重命名即可。即使你的文件在第一次备份时无法秒传,但在之后的备份中都将大部分可以秒传(除了新增的和修改的)。支持秒传的网盘往往也会具有文件查重功能,可以快速根据哈希值扫描出你网盘中出现的重复文件,并 “删除” 日期较老的文件。这么做以后,在网盘中只有最新版本的 我的文件20XXXX 中有所有文件,而更老版本的 我的文件20XXXX 文件夹中所有重复的文件都将被删掉,但这并没有太大影响,反而有助于判断不同版本间哪些文件发生了改变,每个文件的所有历史版本都依然会保留。

文件加密

   当然,支持秒传的网盘也有一些弊端。例如网盘提供商可以 “根据相关法规” 迅速找到并批量删除所有用户网盘中具有某些哈希值的文件。这对于有数据洁癖或强迫症的用户来说是无法忍受的。为了保护隐私及数据安全性,我们可以选择先把文件批量加密(或加密压缩)到移动硬盘(顺便作为本地备份),再上传到网盘。但需要注意的是,通常的加密算法会通过随机数进行 “加盐” 处理,所以同一个文件即使用相同的密码加密两次得到的两个加密文件指纹也不一样。这就会使网盘的秒传以及文件查重功能失效。解决这个问题的具体办法见 “用网盘增量备份文件”。1

5. 用硬盘进行简单的多版本增量备份

   这里提供一个 python 备份脚本 pbu.py(python backupper 的缩写,最新源码见 GitHub,也可以在 wuli.wiki 主页下载附件),功能上基本等同于上一子节 “用网盘增量备份” 的本地版,主要功能如下:

6. 一些其他开源备份软件


1. ^ 另外,一些网盘甚至还会禁止用户上传加密的 zip 等格式的文件。事实上只要改一下后缀名就可绕过,例如把 文件.zip 改成 文件.zip.蠢

                     

© 小时科技 保留一切权利