不要等到亡了羊再来补牢。

你会学到什么

  • 数据备份的重要性与其3-2-1模式
  • 小白如何进行数据备份
  • 基于restic与rclone的究极备份方案

我好像不太懂

作为南京大学 IT 侠的组员,笔者近期接触的案例中有数个数据丢失的案例。有将所有照片放在 U 盘被一波带走的,有误删用户根目录而无法找回的(SSD 的 TRIM 机制使得找回误删文件几乎不可能!),有硬盘直接坏掉的,有误操作在格盘前把数据放到内存盘,重启发现全没了的。

这些案例之所以造成了严重后果,都有一个共同的原因:数据备份的缺失。保护数据免受丢失的唯一方案就是备份。对于数据备份,我们应该遵守一些原则性的东西,比如业界较主流的3-2-1备份模式。

3-2-1模式与其实践

3-2-1模式就是指:

  • 3:一堆数据有总共三份,一份在工作目录上,另两份作为备份
  • 2:数据应该至少有两种形式,如硬盘与云存储(上个世纪可能是磁带)
  • 1:三份数据中的一份应该在异地(如在云上,或在家里)

这种模式看上去很高端,不是什么个人用户可以达到的,但事实绝非如此。考虑这样的一种配置:一份存电脑里,一份放移动硬盘,还用OneDrive之类的同步一份到云上。这样就是最基本的一种对3-2-1的实践——可以解决大部分的问题。实际上,若您的数据主要是照片、文档等较“简单”的文件,上面的配置是很合适的。对于南大的同学而言,您可以用学校的OneDrive实现大容量存储。

我还建议您将您的重要数据集中存储 ——不要先急着开喷,这里的集中指的是「在您的电脑上,不要把数据东一个文件夹,西一个文件夹地到处放,而应该集中整理到一些文件夹中,且这样的文件夹不要放杂七杂八的东西」。这样做的好处在于方便进行备份、恢复。在帮数据不集中的同学备份C盘数据时我总是提心吊胆的——我不知道哪里有有用的东西,因为就连对方都不知道。

在做到了集中存储后,我们就可以:首先,买一个移动硬盘;其次,准备好您的云帐号(我用的是Office 365带的5T云盘,但您也可以用天翼云盘、百度云盘等,只要支持同步就OK)。您需要定期将新的数据拷到移动硬盘,而至于云,您可以下载用的云服务的同步客户端,再将客户端的同步目录中加上保存重要数据的目录,设置好开机自启即可。

进阶的备份

然而,如您的数据有点多(或复杂),或您想要增量备份、版本控制,或您是个我这样的nerdy的geek,抑或是您是我样的自动化狂魔,那让我们踏上更高一级的台阶吧。Meet restic and rclone。

restic是一个强大的增量备份工具,可以把本地的文件备份到本地的另一地方,或云端。rclone则是一个云存储的「通用客户端」,可以连上云盘进行同步、上传、下载等操作 。当我们通过自动化访问各种云盘时,用rclone是很方便的。

下文在教程中夹杂了我配这个的历程,大家看个乐就好。同时,这篇不是“手把手”的教程,您应该有一定的计算机基础。

当前情况

我们先看看我的个人数据是怎么放的。我所有的个人重要数据放在了C盘的用户目录下,如学校相关的(作业、文书、课件、表格等)在「文档」中,照片和收集的图在「图片」中,音乐库在「音乐」中,至于我的代码,是全部堆在用户目录的「source」目录中的。但我还有一些杂七杂八的东西,如Conan的本地缓存(这个比较重要,很多本地编译的东西,换个环境不一定能再弄出来)、SSH证书等(很重要!!),好在它们全在用户目录里。

用户目录中不用备份的东西就是QQ的所有文件(聊天记录有别的备份了)、「AppData」里的数据(特别混乱)。电脑中用户目录外的的其他数据多数都是网上能找到的资源(下的软件之类的),考虑的空间因素,不进行备份。

理想愿景

先看看我手头有什么:

  1. 4T的外接硬盘(最快,但大部分时间没接电脑上)
  2. 5T OneDrive个人帐号(已经用了很多了,比较乱)
  3. 5T OneDrive学校帐号(世纪互联,较快)
  4. 5T OneDrive E5 bp得来的帐号(在东京,较慢)
  5. 200G 南大网盘(很大,最快)

考虑过后,我的规划是,用 1. 作本地备份,在周末接上进行备份;用3.和4.作为异地备份,3天运行一次。

rclone 配置

连E5 OneDrive:轻而易举

我们的第一件事是让我们可以连上3.和4.两个云盘。两者都是OneDrive for Business协议的,而rclone包含其支持,用就完了。下载最新的rclone并放到可以被PATH找到的位置,再参照 https://rclone.org/onedrive/ 中的指示,我们先需要在E5的Azure AD域中建一个应用程序并分配正确的权限与密钥(如果看不懂官方教程,可以参考另一篇教程。需要的设置基本和该教程中的一样,区别是我们不会仅仅用 restic authorize "onedrive" 登录而不创建Remote,而是会完整地创建一个Remote)。然后在 restic config 命令中可以轻松建一个Remote,连上 E5 OneDrive。

注意,建议把Remote的名字取成一个“ID”应有的样子,如只用大小写字母、数字和下划线,不要写中文或空格。在这个过程中rclone会打开一个浏览器窗口,让您登录 E5 帐号。登录后就会自动找到您的OneDrive中的「Drive」(一般形如「https://组织名-my.sharepoint.com/personal/邮箱/Documents」 ),保存配置即可。

然而,在添加南大365的OneDrive时,我发现我的Office 365并没有创建应用程序的权限——这很正常,学校的AAD域怎么可能让用户随意建应用?

连南大OneDrive:困难重重

注:如果您没有在学校365上搭rclone的需求,也无兴趣看我的碎碎念,那可以跳过该段。

WebDAV:并不成功

rclone的官方教程和GitHub上的讨论中都谈了在权限严格的AAD域如何配置rclone,其中一个方法就是用SharePoint自带的WebDAV连接。把SharePoint的“经典OneDrive”界面的URL截掉最后的“Forms/All.aspx”就可以得到形如 https://组织名-my.sharepoint.com/personal/邮箱/Documents 的URL。参照 https://rclone.org/webdav/ 中的指示(注意对于SharePoint的WebDAV的特别配置)添加一个WebDAV格式的Remote,用自己的365邮箱和密码登录即可。

然而,南大的AAD的登录使用了第三方登录(南大的统一身份认证),这导致根本没有365密码这种东西。我试图参照其它的处理MFA多因素验证的方法,创建一个「应用密码」作为登录WebDAV的凭据。但我也没有在南大365上对应的位置找到设置应用密码的链接(Office Portal)。貌似南大的365也没有允许用户创建应用密码。

在不知道什么位置,我看到了有人说:SharePoint WebDAV可以用Cookies作验证,而IE登录后的Cookies和Windows的WebDAV客户端是互通的。于是我尝试了:

  • 用Chrome或IE登录SharePoint,提取对应的Cookie,填入rclone的WebDAV源——无法连接
  • 用IE登录SharePoint,用Windows的WebDAV客户端映射WebDAV服务器到一个盘符,用rclone的local存进去——慢、不稳定,完全无法使用

两种方法都以失败告终。我也没有找到好的支持自定义Cookies的WebDAV客户端。

与学校部门交涉:意外惊喜

同时,考虑到SharePoint的WebDAV实现有些缺陷(参考rclone WebDAV文档),我们最好还是用原生的rclone OneDrive协议进行连接。此时我不得不与南大的ITSC部门(不抱希望地)发E-Mail,希望可以允许我在南大Azure AD域上新建应用。对方在数个小时后回复了我——回复效率远远超出预料。但其称后台仅有全局开关,没法按应用配置。

我在自己的E5 AAD域上进行了一些测试,发现可以给用户一个“Application Developer”管理员角色,特定用户就可以创建应用。于是我,帮我新建并配置一个Azure AD应用,或给我Application Developer管理员权限。第二天ITSC的老师通过找M$的工程师,给我开了一个配置了rclone权限的应用,并给了我Client Secret——Client ID没给!!!!但好在虽然在网页上管理应用的权限被禁止了,我还是可以用Azure AD PowerShell列出AAD域上的所有应用程序,在其中找到rclone的Client ID。

然而,在连接的时候,报了这样的错误:

显然权限配置有问题。我又在自己的AAD域上进行一通测试,发现了:

  • rclone在请求文档中提到的权限外,还申请了 Sites.Read.All 权限。如果是管理员用户或有权限的用户登录,这个权限会被自动加入应用的权限列表,但南大的权限配得很严,行不通(我认为这是rclone的一个bug,后面会讲);
  • 在设置了“禁止用户代表组织同意应用权限”的域上,如果应用权限配置没有进行“授予管理员同意”(同意后状态栏会长下面那样)操作,是没法用的;