如何使用 BorgBackup、Rclone 和 Wasabi 云存储构建自己的备份解决方案

使用基于开源软件和廉价云存储构建的自动化备份解决方案来保护您的数据。
492 位读者喜欢这篇文章。
Construction worker building a cinderblock wall

Opensource.com

几年来,我一直使用 CrashPlan 来备份我家人的电脑,包括我妻子和兄弟姐妹的机器。 CrashPlan 基本上是“始终开启”的,并且在无需考虑的情况下进行频繁备份,这一点非常棒。 此外,在几次情况下,进行时间点还原的能力派上了用场。 因为我通常是家里的 IT 人员,所以我喜欢用户界面非常易于使用,家人可以在没有我的帮助下恢复他们的数据。

最近,CrashPlan 宣布 它将放弃其消费者订阅,专注于其企业客户。 我想这是有道理的,因为它并没有从像我这样的人身上赚到很多钱,而且我们的家庭计划在其系统上使用了大量的存储空间。

我决定一个合适的替代方案需要的功能包括

  • 对 Linux 和 Mac 的跨平台支持
  • 自动化(因此无需记住点击“备份”)
  • 时间点恢复(或类似的东西),这样如果您不小心删除了一个文件,但直到以后才注意到,它仍然可以恢复
  • 低成本
  • 备份集的复制数据存储,因此数据存在于多个位置(即,不仅仅是备份到本地 USB 驱动器)
  • 加密,以防备份文件落入坏人之手

我四处搜索,并向我的朋友询问了与 CrashPlan 类似的服务。 其中一位对 Arq 非常满意,但是没有 Linux 支持意味着它对我没有用处。 Carbonite 类似于 CrashPlan,但会很昂贵,因为我有多个机器需要备份。 Backblaze 以优惠的价格(每月 5 美元)提供无限备份,但其备份客户端不支持 Linux。 BackupPC 是一个强有力的竞争者,但在我想起它之前,我已经开始测试我的解决方案了。 我看到的其他选项都无法满足我所寻找的一切。 这意味着我必须想办法复制 CrashPlan 为我和我的家人提供的功能。

我知道有很多不错的选项可以在 Linux 系统上备份文件。 事实上,我至少已经使用了 rdiff-backup 10 年了,通常用于在本地保存远程文件系统的快照。 我希望找到一些可以更好地对备份数据进行重复数据删除的东西,因为我知道有些东西(如音乐库和照片)存储在多台计算机上。

我认为我所做的工作非常接近我的目标。

我的备份解决方案

backup solution diagram

opensource.com

最终,我选择了 BorgBackupRcloneWasabi 云存储 的组合,我对我的决定感到非常满意。 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 上,并经许可重新发布。

Picture of Christopher Aedo
Christopher Aedo 自大学时代以来一直在使用开源软件并为其做出贡献。 最近,他在 Teradata 担任开源总监,专注于帮助该组织通过内部使用和外部贡献来拥抱开源软件。

28 条评论

嗨 Christopher,谢谢你的精彩文章。 只有一个疑问:你说的 "works great on PC, Mac, and Linux" 是什么意思? 你指的是 "Windows PC, Mac, and Linux" 吗? 我的家人有一些 Windows PC,所以我想知道是否可以将您的解决方案扩展到支持它们。

谢谢,
Flavio

Flavio,是的,我应该说 Windows PC。 Borg Backup 将在 Windows 10 Linux 子系统下运行,尽管他们的网站说它目前被认为是实验性的。 据推测,rclone 也可以在 linux 子系统下运行,所以应该可以在 Windows 10 上运行所有这些。

回复 作者 Fly66 (未验证)

哇! 我不知道 Wasabi。 我最终用 CloudBerry 和 BackBlaze B2 的组合替换了我的家庭服务器上的 CrashPlan。 对于我的数据量来说,它非常便宜。 有一个 GUI 供喜欢它的人使用,但有一个 CLI 供管理员使用,并且一次性支付 30 美元,很难被击败。

是的,根据其网站,Borg 可以进行加密。 所以备份也可以被加密。 这样就不能很容易地直接从 Wasabi 恢复,而需要先更换 Borg 服务器,然后将 Borg 服务器与来自 Wasabi 的加密数据重新同步。

你说“没那么容易”,但看起来已经足够容易了。从文章来看,可以使用 rclone 将远程 Wasabit Borg 仓库挂载为本地目录,因此不必为了恢复一些文件而必须同步整个 Borg 仓库。虽然对于大型 Borg 仓库来说,恢复可能会相当缓慢。 我建议定期将本地 Borg 仓库的副本备份到可移动硬盘,以便在发生灾难时更快地访问。 事实上,如果你使用外部 USB 驱动器,无论如何都应该轮流将其中几个保存在异地。

回复 作者 Lars Schotte (未验证)

感谢 Christopher 提供的我之前不知道的资源。

实际上,您可以使用“borg mount”轻松恢复单个文件,它会将备份挂载为 FUSE 文件系统。
您也不需要在脚本中检查 borg 是否正在运行; 诸如 create 之类的操作将锁定仓库,任何后续操作都将失败。

嗨,Christopher,
如果您将几乎相似的目录备份到同一个仓库会发生什么?(例如,Box A 备份,然后 Box B 备份,但它缺少 Box A 中的一些文件。如果您从仓库恢复 A,这些文件是否会在 A 上消失?)
您如何组织这个?

假设您将 box A 备份到名为 boxA- 的存档中,并将 box A 备份到名为 boxB- 的存档中,所有这些都在同一个 borg 仓库中,以最大限度地提高重复数据删除的效率。

要恢复 boxA,您将使用名为 boxA- 的存档。boxB 也是如此。

回复 作者 jeff jurugu (未验证)

当然,我会说

假设您将 box A 备份到名为 boxA- 的存档中,并将 box B 备份到名为 boxB 的存档中
^^

对不起。

回复 作者 mahikeulbody (未验证)

如果您 rclone 一个损坏的 borg 仓库,您会得到一个损坏的 wasabi 存档...

是的,这确实是一个问题! 在上传之前需要进行一致性检查!

首先:当您在使用 Rclone 时,您的计算机正在进行提交/备份时,会发生严重的损坏。 您说笔记本电脑的备份不规律,而且似乎没有对此进行检查。
因此,您至少需要将 backup.sh 中的 `pidof -x borg` 检查添加到您的 Rclone 脚本中。

其次:当备份过程在某个时刻中断时,会发生轻微的损坏。 例如,笔记本电脑关闭/断电、WiFi 中断... 您说您希望事情在后台不引人注意地工作。 这使得发生这种情况的可能性很大。 通过最终用户的意识来分散风险。 :-)
通常,borg 能够修复这些情况。 但是 i) 您必须注意到并手动执行此操作 ii) 我不知道这是否总是有效/这是否万无一失 iii) 在帖子中描述的当前设置中,没有检查备份是否成功。 在后台使用 CRON,您的备份可能会失败一次,并且所有后续备份都会在不知不觉中失败。

第三:还有无数其他潜在的向量(例如,数据退化 [1]、硬件故障 [2]、...)。 您也可以在 Rclone 之前添加一个 `borg check` 以及对两个存档的单独校验和比较。

无论如何,感谢您的精彩文章! :-)

[1] https://en.wikipedia.org/wiki/Data_degradation
[2] https://github.com/borgbackup/borg/issues/3602

回复 作者 mahikeulbody (未验证)

你好 Christopher,

在问我的问题(可能很愚蠢)之前,我解释一下我的测试用例

我在 macOS High Sierra 上使用 HubiC / test-borg 作为 HubiC 同步文件夹测试了 BorgBackup

1 - borg init --encryption=repokey /test-borg

2 - borg create /test-borg::friday /test

然后文件/文件夹在 /test-borg 中创建

test-borg/
├── data/
│ ├── 0/
│ ├── 1
│ ├── 3
│ ├── 4 (大小为 5MB)
│ ├── 5

文件“4”实际上是加密存档,它收集了 /test 文件夹中包含的 2 个 pdf 文件以进行备份(test1.pdf 和 test2.pdf)。

3 - 然后将文件 4 发送到 HubiC。

我在不更改 /test 文件夹内容的情况下进行另一个备份

4 - borg create /test-borg::saturday /test

test-borg/
├── data/
│ ├── 0/
│ ├── 1
│ ├── 3
│ ├── 5
│ ├── 7
│ ├── 8 (大小为 5MB)
│ ├── 9

观察:文件“4”重命名为“8”。 文件“4”从 HubiC 中删除,文件“8”上传。

注意:在 HubiC 的正常使用中,创建没有修改的备份仍然涉及数据的重新上传(由于重命名),而要备份的文件夹中的任何内容都没有更改。

使用像 Wasabi 这样的云存储是否有不同的机制?
(直接在 Wasabi 上重命名文件,因此不会重新上传数据)

我的上传速度不高(300 MB 需要 40 分钟),所以如果所有文件都被重命名,那就好像我们每次都重新上传所有内容。

谢谢你的文章。

我回复我自己
上面描述的情况仅适用于较小的总文件大小。
我继续使用更多数据(2 GB)进行测试,只有新添加的文件才上传到 HubiC。
总结::最适合我需求的最佳备份解决方案(加密和压缩)。

感谢这篇文章,它帮助我找到了一个备份解决方案。

回复 作者 Loop (未验证)

我观察到了同样的事情,即使它在某个时刻开始重复使用文件,但每天都必须上传所有数据仍然让我很烦恼。 因此我将寻找另一个备份程序。 Duplicati 很有前途,但它已经处于 alpha 版本很长时间了,现在才进入 beta 版本。

回复 作者 Loop (未验证)

一篇很棒的文章,其中包含有趣的备份解决方案!

也许您还应该提及备份解决方案的隐私点。 所有家庭图片都发送到外部服务器云。 我不想把所有关于孩子和父母的私人图片/文档都交给别人,只是为了节省一些钱或获得舒适感。

今天,在家里做一个备份系统非常容易。 如果您使用 MacOs 家庭版 - 它包含自动备份到多个外部硬盘驱动器,并且它是加密的,最好的是它可以完成所有这些操作而无需按下任何按钮。 如果您还需要 Linux,我认为带有外部备份磁盘的树莓派解决方案是一项不错的投资。
_
顺便说一句,如果您启用了隐私模式,则评论验证码不起作用。 不得不关闭保存站点才能发表此评论。 将所有评论用户的验证码数据提供给像 G 这样收集和使用数据的外部商业公司也不是一件好事。

borg 和 rclone 都有在将数据发送到远程存储之前对其进行加密的选项,因此云服务器无法在没有密钥的情况下读取它。 当然,这意味着您需要将密钥保存在单独的安全位置。

拥有异地备份非常重要,以防万一你的房子被烧毁了。

回复 作者 John Snow (未验证)

borg 要求您在创建仓库时选择一种加密模式。 因此,您真的需要希望您的文件以未加密的形式保存在某个地方才能这样做。 否则,BLAKE2b 和 SHA-256 非常可靠,可以认为对于上传到某个地方是安全的。 如果您真的非常偏执或渴望,您可以相应地设置您的 ssh 加密,以免在上传时使用较弱的加密。

回复 作者 John Snow (未验证)

感谢 Christopher 的这篇文章! 我也面临着同样的问题,并且几周前决定实施这两个备份。
但是,我不知道 Wasabi 云存储。 您建议挂载 Wasabi 存储以在需要时恢复特定文件(通过 Borg mount)。 从 Wasabi 的角度来看,这是如何看待的? 它不被认为是完整下载存档吗? 如果是这样,我认为该解决方案的成本效益较低,因为 Wasabi 将对完整恢复收取费用。

我将以“我可能是错的!”开始这个回复 (如果我错了,我不想承担有人因此受到巨额转账账单的责任...)

也就是说 - 我理解的是,当您将 s3 bucket 挂载为文件系统时,您可以随机访问块。 因此,您不需要流式传输整个备份,只需要获取其中的一小部分。 在我自己的测试中,我绝对能够提取一个文件而没有(据我所知)流式传输整个备份。 不过,我建议做一个快速测试来验证,因为我很确定您可以进行部分恢复而无需流式传输整个备份存档。

回复 作者 Jeremy Fritzen

顺便说一下,您能否向我们提供有关账单政策的反馈?

我阅读了与账单政策相关的整个部分。 它非常清楚,但我想在发送我的数据之前确保账单的正确性。

---我的用例---
我计划每天将我的本地数据备份存档发送到 Wasabi 云存储。 备份存档将始终具有相同的名称,因此 Wasabi 上的存档每天都会被覆盖。

假设我的存档是 1 TB,那么 1 个月的账单应该是 3.99 美元。
如果我理解正确,即使我在第二天覆盖它,我也会为该存档的 90 天存储付费,对吗?

然后,我理解 1 个存档文件将花费我 3.99 美元 / 30 * 90 = 11.97 美元。
因为我每天都会用一个新的每日存档覆盖此存档,所以认为我一年会被收费

11,97$ * 365 = 4379,05$ ?

非常感谢您的帮助

再见!

Jeremy

回复 作者 docaedo

只是一个小提示:如果您将密码短语保存在纯文本中,请确保考虑对该文件的访问。 例如,通过将文件权限设置为 700。在大型多用户网络中,经常发生主文件夹是可读取的情况。

嘿,克里斯托弗... 谢谢你花时间写这篇好文章!我最大的问题是为 Windows 机器提供一个稳定的备份解决方案。对于我所有的 Ubuntu 机器,borg 是一个很棒的选择……我一直在绞尽脑汁地想让 Windows 端口的 borg 正常工作,但没有成功。我有一个 Ubuntu 文件服务器(目前已经安装了 borg),它是一个由 ceph 集群支持的虚拟机。针对我的用例,你有什么想法?将 Windows 文件传输到 borg 服务器的有效方法是什么? 我几乎想在 Ubuntu 上设置一个临时的中间服务器,该服务器将接收来自 Windows 客户端的原始数据,然后使用 borg 将其传输到主存储库……但感觉不太干净!

目前,我的备份解决方案是两个 BTRFS 硬盘,使用定期轮换的快照:每天,当一个新的快照被创建并复制到另一个磁盘时,最旧的快照会被删除。示例

第1天备份

A, B, C, D

第2天备份

B, C, D, E

我正在考虑放弃第二个 brtfs 快照备份,并将其转换为 borg 存储库,但是我不确定是否可以删除较旧的 borg 备份并保留我的数据,就像我使用 BTRFS 一样。

因为我担心,比如说,两年后,如果因为陨石击中我的房子而不得不恢复所有文件,我必须拥有超过 720 个文件(每天一个,持续 2 年)才能获取所有数据。是否可以持续删除最旧的 borg 备份并保留所有文件?

你正在寻找的功能叫做 pruning(修剪) - 是的,borg 通过以下命令支持此功能:

borg prune

https://borgbackup.readthedocs.io/en/stable/usage/prune.html

例如:borg prune --keep-daily=7 --keep-weekly=4

唯一的区别是它更加精细,而不是直接删除整个目录。

回复 (当前的备份解决方案) 作者 Claudio Forain (未验证)

© . All rights reserved.