多年来,我一直使用 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 是因为它的价格无与伦比,并且性能优于 Amazon 的 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。我按照 how-to 安装了命令行工具,然后使用了 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
使用 Rclone 将备份集首次同步到 Wasabi 花费了几天时间,但这大约是 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 条评论