几年来,我一直使用 CrashPlan 来备份我家人的电脑,包括我妻子和兄弟姐妹的机器。CrashPlan 本质上是“始终开启”的,并且在无需考虑的情况下进行频繁备份,这真是太棒了。此外,在几次情况下,按时间点还原功能也派上了用场。因为我通常是家里的 IT 人员,所以我喜欢用户界面非常易于使用,以至于家人无需我的帮助即可恢复他们的数据。
最近,CrashPlan 宣布,它将放弃面向消费者的订阅,专注于其企业客户。我认为这是有道理的,因为它从像我这样的人身上赚不到多少钱,而我们的家庭计划却在其系统上使用了大量存储空间。
我决定,合适的替代方案中我需要的功能包括:
- 对 Linux 和 Mac 的跨平台支持
- 自动化(因此无需记住单击“备份”)
- 按时间点恢复(或类似的功能),这样如果您不小心删除了文件,但稍后才注意到,仍然可以恢复
- 低成本
- 备份集的复制数据存储,因此数据存在于多个位置(即,不仅仅是备份到本地 USB 驱动器)
- 加密,以防备份文件落入坏人之手
我在网上搜索并向我的朋友询问了与 CrashPlan 类似的服务。有人对 Arq 非常满意,但不支持 Linux 意味着它对我来说没用。Carbonite 与 CrashPlan 类似,但会很昂贵,因为我有多个机器需要备份。Backblaze 以优惠的价格(每月 5 美元)提供无限备份,但其备份客户端不支持 Linux。BackupPC 是一个强有力的竞争者,但在我想起它之前,我已经开始测试我的解决方案了。我查看的其他选项都没有满足我所需的一切。这意味着我必须想办法复制 CrashPlan 为我和我的家人提供的功能。
我知道有很多用于备份 Linux 系统上文件的优秀选项。事实上,我至少使用 rdiff-backup 已经 10 年了,通常用于在本地保存远程文件系统的快照。我希望找到一些在重复数据删除方面做得更好的东西,因为我知道有些东西(如音乐库和照片)存储在多台计算机上。
我认为我研究出的方案非常接近我的目标。
我的备份解决方案

opensource.com
最终,我选择了 BorgBackup、Rclone 和 Wasabi 云存储 的组合,我对我的决定感到非常满意。Borg 符合我的所有标准,并且拥有非常健康的 用户和贡献者社区。它提供重复数据删除和压缩,并且在 PC、Mac 和 Linux 上都能很好地工作。我使用 Rclone 将备份存储库从 Borg 主机同步到 Wasabi 上的 S3 兼容存储。任何 S3 兼容存储都可以工作,但我选择 Wasabi 是因为它价格无与伦比,并且性能优于亚马逊的 S3。通过这种设置,我可以从本地 Borg 主机或 Wasabi 恢复文件。
在我的机器上安装 Borg 非常简单,只需 sudo apt install borgbackup 即可。我的备份主机是一台始终开启的 Linux 机器,并连接了一个 1.5TB 的 USB 驱动器。如果您没有可用的机器,此备份主机可以像 Raspberry Pi 一样轻量级。只需确保所有客户端机器都可以通过 SSH 连接到此服务器,您就可以开始了。
在备份主机上,使用以下命令初始化一个新的备份存储库:
$ borg init /mnt/backup/repo1
根据您要备份的内容,您可以选择为每台机器创建多个存储库,或者可能为一个大的存储库用于所有机器。由于 Borg 具有重复数据删除功能,如果您在多台计算机上拥有相同的数据,则将所有这些机器的备份发送到同一存储库可能是有意义的。
在 Linux 客户端机器上安装 Borg 非常简单。在 Mac OS X 上,我需要先安装 XCode 和 Homebrew。我按照 操作指南 安装了命令行工具,然后使用了 pip3 install borgbackup。
备份
每台机器都有一个 backup.sh 脚本(见下文),该脚本由 cron 定期启动;它每天只创建一个备份集,但在同一天尝试几次也无妨。笔记本电脑设置为每两小时尝试一次,因为不能保证它们会在某个特定时间开机,但它们很可能在其中一个时间段内开机。可以通过编写一个始终运行的守护程序来改进这一点,该守护程序在笔记本电脑每次唤醒时触发备份尝试。目前,我对目前的工作方式感到满意。
我可以跳过 cron 作业,并提供一个相对简单的方法让每个用户使用 BorgWeb 触发备份,但我真的不希望任何人必须记住备份。我倾向于忘记单击备份按钮,直到我急需恢复时(到那时就太晚了!)。
我使用的备份脚本来自 Borg 快速入门 文档,另外我在顶部添加了一个小检查,以查看 Borg 是否已经在运行,如果之前的备份运行仍在进行中,则会退出脚本。此脚本创建一个新的备份集,并使用主机名和当前日期标记它。然后,它使用简单的保留计划来修剪旧的备份集。
这是我的 backup.sh 脚本
#!/bin/sh
REPOSITORY=borg@borgserver:/mnt/backup/repo1
#Bail if borg is already running, maybe previous run didn't finish
if pidof -x borg >/dev/null; then
echo "Backup already running"
exit
fi
# Setting this, so you won't be asked for your repository passphrase:
export BORG_PASSPHRASE='thisisnotreallymypassphrase'
# or this to ask an external program to supply the passphrase:
export BORG_PASSCOMMAND='pass show backup'
# Backup all of /home and /var/www except a few
# excluded directories
borg create -v --stats \
$REPOSITORY::'{hostname}-{now:%Y-%m-%d}' \
/home/doc \
--exclude '/home/doc/.cache' \
--exclude '/home/doc/.minikube' \
--exclude '/home/doc/Downloads' \
--exclude '/home/doc/Videos' \
--exclude '/home/doc/Music' \
# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
# archives of THIS machine. The '{hostname}-' prefix is very important to
# limit prune's operation to this machine's archives and not apply to
# other machine's archives also.
borg prune -v --list $REPOSITORY --prefix '{hostname}-' \
--keep-daily=7 --keep-weekly=4 --keep-monthly=6
备份运行的输出如下所示:
------------------------------------------------------------------------------
Archive name: x250-2017-10-05
Archive fingerprint: xxxxxxxxxxxxxxxxxxx
Time (start): Thu, 2017-10-05 03:09:03
Time (end): Thu, 2017-10-05 03:12:11
Duration: 3 minutes 8.12 seconds
Number of files: 171150
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
This archive: 27.75 GB 27.76 GB 323.76 MB
All archives: 3.08 TB 3.08 TB 262.76 GB
Unique chunks Total chunks
Chunk index: 1682989 24007828
------------------------------------------------------------------------------
[...]
Keeping archive: x250-2017-09-17 Sun, 2017-09-17 03:09:02
Pruning archive: x250-2017-09-28 Thu, 2017-09-28 03:09:02
在所有机器都备份到主机后,我按照 安装预编译 Rclone 二进制文件的说明 进行操作,并将其设置为访问我的 Wasabi 帐户。
此脚本每晚运行以同步对备份集的任何更改:
#!/bin/bash
set -e
repos=( repo1 repo2 repo3 )
#Bail if rclone is already running, maybe previous run didn't finish
if pidof -x rclone >/dev/null; then
echo "Process already running"
exit
fi
for i in "${repos[@]}"
do
#Lets see how much space is used by directory to back up
#if directory is gone, or has gotten small, we will exit
space=`du -s /mnt/backup/$i|awk '{print $1}'`
if (( $space < 34500000 )); then
echo "EXITING - not enough space used in $i"
exit
fi
/usr/bin/rclone -v sync /mnt/backup/$i wasabi:$i >> /home/borg/wasabi-sync.log 2>&1
done
首次将备份集同步到 Wasabi 的 Rclone 花费了几天时间,但这大约是 400GB 的新数据,而且我的出站连接速度不是很快。但是每日增量非常小,只需几分钟即可完成。
恢复文件
恢复文件不如 CrashPlan 那么容易,但相对来说也很简单。最快的方法是从存储在 Borg 备份服务器上的备份中恢复。以下是一些用于恢复的示例命令:
#List which backup sets are in the repo
$ borg list borg@borgserver:/mnt/backup/repo1
Remote: Authenticated with partial success.
Enter passphrase for key ssh://borg@borgserver/mnt/backup/repo1:
x250-2017-09-17 Sun, 2017-09-17 03:09:02
#List contents of a backup set
$ borg list borg@borgserver:/mnt/backup/repo1::x250-2017-09-17 | less
#Restore one file from the repo
$ borg extract borg@borgserver:/mnt/backup/repo1::x250-2017-09-17 home/doc/somefile.jpg
#Restore a whole directory
$ borg extract borg@borgserver:/mnt/backup/repo1::x250-2017-09-17 home/doc
如果本地 Borg 服务器或保存所有备份存储库的 USB 驱动器出现问题,我也可以轻松地直接从 Wasabi 恢复。如果机器安装了 Rclone,使用 rclone mount 我可以将远程存储桶挂载为本地文件系统:
#Mount the S3 store and run in the background
$ rclone mount wasabi:repo1 /mnt/repo1 &
#List archive contents
$ borg list /mnt/repo1
#Extract a file
$ borg extract /mnt/repo1::x250-2017-09-17 home/doc/somefile.jpg
它的工作方式
现在我已经使用这种备份方法几周了,我可以肯定地说我对它非常满意。当然,设置一切并使其运行比仅仅安装 CrashPlan 要复杂得多,但这就是构建自己的解决方案和使用服务之间的区别。我将密切关注以确保备份继续运行,并且数据已正确同步到 Wasabi。
但是,总的来说,用提供相当备份覆盖范围且价格非常合理的解决方案替换 CrashPlan 比我预期的要容易一些。如果您看到任何改进空间,请告诉我。
本文最初发布在 Local Conspiracy 上,并经许可转载。
28 条评论