数据备份
目前我使用了两个网盘做备份:
- 重要数据通过 OneDrive 同步
- 照片通过 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 将 Dropbox 的数据定时同步到 Google Drive。
rclone 应该是目前最好的网盘同步工具了。它的原理是使用各家存储服务提供的 API,遍历文件目录并获取文件 Hash 以判断文件是否相同。它有一个 sync
命令可以将一个存储服务中的文件单向同步到另外一个服务。
安装
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 登录过程不会被攻破,那么这个文件应该是基本安全的。