Data Backup

 26th December 2021 at 10:29am

数据备份

目前我使用了两个网盘做备份:

  1. 重要数据通过 OneDrive 同步
  2. 照片通过 Google Photos 备份

OneDrive

OneDrive 的优势在于 翻墙时上传下载都挺快,不翻墙时稍慢但大部分时间能用,这使得 Enpass 可以免翻墙时就使用,减少一些麻烦。同时搭配 Office 365 家庭版时,OneDrive 的价格 非常便宜,1T 的空间,一年只需要 40 元。

OneDrive 没有官方 Linux 客户端,我用的是社区的 abraunegg/onedrive。通过 AUR 可以安装。用法在 这里,使用 systemd 的 user service:

$ systemctl --user enable onedrive

做一些优化,设置 HTTP_PROXY--min-notify-changes 1000 --monitor-interval 30 来减少通知和提升查询频率。配置的结果已经存在 yadm 维护的 dotfiles 中,不需要再次配置。如果是第一次配置,需要运行 systemctl --user edit onedrive,写入下面的内容,最终生成的文件在 ~/.config/systemd/user/onedrive.service.d/override.conf

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:8001"
Environment="HTTPS_PROXY=http://127.0.0.1:8001"
ExecStart=
ExecStart=/usr/bin/onedrive --monitor --min-notify-changes 1000 --monitor-interval 30 --check-for-nosync

--check-for-nosync 使得你可以在一个文件夹中放入 .nosync 空文件,指导工具不要去同步此文件夹。

这个客户端有若干问题。比如误删文件,日志中显示:

Feb 27 15:50:30 onlyice-pc1 onedrive[922]: Downloading file 应用/Enpass/vault.enpassdbsync ... Retry sync count: 1: SSL connect error on handle 55840D053220
Feb 27 15:56:33 onlyice-pc1 onedrive[922]: Downloading file 应用/Enpass/vault.enpassdbsync ... Retry sync count: 2: Timeout was reached on handle 55840D053220
Feb 27 16:01:38 onlyice-pc1 onedrive[922]: ERROR: OneDrive returned an error with the following message:
Feb 27 16:01:38 onlyice-pc1 onedrive[922]:   Error Message: Timeout was reached on handle 55840D053220
Feb 27 16:01:50 onlyice-pc1 onedrive[922]: Downloading file 应用/Enpass/vault.enpassdbsync ... Giving up on sync after three attempts: SSL connect error on handle 55840D053220
Feb 27 16:01:50 onlyice-pc1 onedrive[922]: Persistent connection errors, reinitializing connection
Feb 27 16:01:50 onlyice-pc1 onedrive[922]: Deleting item from OneDrive: 应用/Enpass/vault.enpassdbsync

在连接失败后它把我的 Enpass 数据库删了,而且发生不止一次。后来我给整个「应用」文件夹配置了 .nosync 来解决。

还有在下载大文件下载一半时,如果机器或者进程重启,会导致它下次不会继续下载,而是 把本地未下载好的文件覆盖到云端。这个问题非常严重。

Google Photos

照片使用了 Google Photos,原因有几点:

  • 只要接受照片被压缩,可以无限量上传图片
  • 压缩对画质的损失很小
  • 搜索功能实在太牛逼了,可以根据物品/场景等搜索照片
  • 自动对同一脸孔做照片聚合

其他方案

Dropbox

2019 年 08 月以前主力用 Dropbox,原因是:

  • 稳定可靠,基本不丢数据
  • 同步数据快,对于 Word 文件等也能做增量同步
  • 我的主力平台上全部支持,Windows / Linux / Android
  • 目前不用太担心产品会死
  • 产品又做得即漂亮又简单易用

但是后来 Dropbox 免费版的政策发生了变化,最多只支持三台设备同步,导致我的新电脑无法使用。同时 付费方案太贵,我不太愿意付费。因此换成了 OneDrive。OneDrive 不需要翻墙(虽然翻墙的同步速度更快),因此 Enpass 数据同步时不需要先设置好翻墙。同时 Office 365 家庭版的费用也非常 affordable。缺点在于没有官方 Linux 客户端,但是有社区的。

Mega

Mega 提供了免费的 50G 存储。也有全平台客户端(包含非常好的 Linux 支持)。但是天下没有免费的午餐,虽然 Mega 宣称不会对上传下载做限速,但是 实测上传速度很慢,比如过程中可能以接近 1 MB/s 的速度传了 20M,然后上传就停了下来;网上也有人提到 下载也会有限速

Mega 的 付费方案也太贵,500G 空间一年要 50 欧元,折合人民币五六百。

使用 rclone 自动同步 Dropbox 到 Google Drive

由于不想维护,这一块目前已经停止运行了。rclone 的新版本也可能有功能变化,下面内容仅供参考。

为了避免鸡蛋全部放在一个篮子里,我使用了 rclone 将 Dropbox 的数据定时同步到 Google Drive。

rclone 应该是目前最好的网盘同步工具了。它的原理是使用各家存储服务提供的 API,遍历文件目录并获取文件 Hash 以判断文件是否相同。它有一个 sync 命令可以将一个存储服务中的文件单向同步到另外一个服务。

GitHub | 官网

安装

Arch Linux 上已经有现在的 rclone 包。直接 pacman 安装即可。

$ sudo pacman -S rclone

用法

rclone 官网的文档写得很详细,用法可以直接参照它的文档。

首先运行 rclone config 配置 Dropbox 与 Google Drive。最终生成一个名为 "Dropbox" 和一个名为 "Google Drive" 的两个 remote 配置。

配置默认放在了个人 home 目录下(/home/onlyice/.rclone.conf)。

最终运行这条命令,可以把 Dropbox 内容同步到 Google Drive。

$ rclone sync Dropbox:/ "Google Drive":"/Dropbox Backup"

定时同步

这里使用 systemd 的 Timer 能力来做定时同步。

新建 /usr/lib/systemd/system/backup-dropbox.service

[Unit]
Description=Backup Dropbox to Google Drive

[Service]
Type=oneshot
ExecStart=/usr/bin/rclone sync Dropbox:/ "Google Drive":"/Dropbox Backup"
User=onlyice
KillMode=process

[Install]
WantedBy=default.target

Type=oneshot 是值得关注的点。对于不是 oneshot 类型的服务,Systemd 要求服务启动后需要 signal start-up completion(不知道通过什么方式),告知 Systemd 启动完成。如果没有在 DefaultTimeoutStartSec (90s) 内告知,则会被当作启动失败进行重试。Type=oneshot 告诉 Systemd 这不是个服务,只是个一次性任务,所以很多跟服务相关的逻辑不会被启用。

再新建 /usr/lib/systemd/system/backup-dropbox.timer

[Unit]
Description=Daily backup Dropbox to Google Drive

[Timer]
OnBootSec=5min
OnUnitActiveSec=1d

[Install]
WantedBy=timers.target

参数:

  • OnBootSec 表示启动后 5 分钟开始执行
  • OnUnitActiveSec 表示上次执行 1 天后再执行

之后再使用 systemctl 启用这个定时任务:

$ sudo systemctl enable backup-dropbox.timer
$ sudo systemctl start backup-dropbox.timer

这样就可以每天定时同步文件了。

加密

因为 rclone 申请的网盘权限比较多,相关的 API 参数放在 .rclone.conf 中,如果没有加密可能被坏人盗走,坏人就可以读取你全部的文件内容。

rclone 提供了一种设置密码的手段,会把 .rclone.conf 整个文件加密。但是代价是每次运行 rclone 命令行时都需要输入密码。因为我需要脚本每天同步 Dropbox 内容到 Google Drive,所以这里暂时没有加密上。

.rclone.conf 默认是 0600 权限的,即是只有你或者 root 用户可以查看它的内容。如果你的 SSH 登录过程不会被攻破,那么这个文件应该是基本安全的。