几年来,我一直使用 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
使用 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 条评论