几年来,我一直使用 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。我按照 操作指南 安装了命令行工具,然后使用了 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 条评论