如何使用 BorgBackup、Rclone 和 Wasabi 雲端儲存推出自己的家庭備份解決方案

Christopher Aedo發表於2017-11-25

使用基於開源軟體和廉價雲端儲存的自動備份解決方案來保護你的資料。

如何使用 BorgBackup、Rclone 和 Wasabi 雲端儲存推出自己的家庭備份解決方案

幾年來,我用 CrashPlan 來備份我家的電腦,包括屬於我妻子和兄弟姐妹的電腦。CrashPlan 本質上是“永遠線上”,不需要為它操心就可以做的規律性的備份,這真是太棒了。此外,能使用時間點恢復的能力多次派上用場。因為我通常是家庭的 IT 人員,所以我對其使用者介面非常容易使用感到高興,家人可以在沒有我幫助的情況下恢復他們的資料。

最近 CrashPlan 宣佈,它正在放棄其消費者訂閱,專注於其企業客戶。我想,這是有道理的,因為它不能從像我這樣的人賺到很多錢,而我們的家庭計劃在其系統上使用了大量的儲存空間。

我決定,我需要一個合適的替代功能,包括:

  • 跨平臺支援 Linux 和 Mac
  • 自動化(所以沒有必要記得點選“備份”)
  • 時間點恢復(可以關閉),所以如果你不小心刪除了一個檔案,但直到後來才注意到,它仍然可以恢復
  • 低成本
  • 備份有多份儲存,這樣資料存在於多個地方(即,不僅僅是備份到本地 USB 驅動器上)
  • 加密以防備份檔案落入壞人手中

我四處搜尋,問我的朋友有關類似於 CrashPlan 的服務。我對其中一個 Arq 非常滿意,但沒有 Linux 支援意味著對我沒用。Carbonite 與 CrashPlan 類似,但會很昂貴,因為我有多臺機器需要備份。Backblaze 以優惠的價格(每月 5 美金)提供無限備份,但其備份客戶端不支援 Linux。BackupPC 是一個強有力的競爭者,但在我想起它之前,我已經開始測試我的解決方案了。我看到的其它選項都不符合我要的一切。這意味著我必須找出一種方法來複制 CrashPlan 為我和我的家人提供的服務。

我知道在 Linux 系統上備份檔案有很多好的選擇。事實上,我一直在使用 rdiff-backup 至少 10 年了,通常用於本地儲存遠端檔案系統的快照。我希望能夠找到可以去除備份資料中重複部分的工具,因為我知道有些(如音樂庫和照片)會儲存在多臺計算機上。

我認為我所做的工作非常接近實現我的目標。

我的備份解決方案

backup solution diagram

最終,我的目標落在 BorgBackupRcloneWasabi 雲端儲存的組合上,我的決定讓我感到無比快樂。Borg 符合我所有的標準,並有一個非常健康的使用者和貢獻者社群。它提供重複資料刪除和壓縮功能,並且在 PC、Mac 和 Linux 上執行良好。我使用 Rclone 將來自 Borg 主機的備份倉庫同步到 Wasabi 上的 S3 相容儲存。任何與 S3 相容的儲存都可以工作,但是我選擇了 Wasabi,因為它的價格好,而且它的效能超過了亞馬遜的 S3。使用此設定,我可以從本地 Borg 主機或從 Wasabi 恢復檔案。

在我的機器上安裝 Borg 只要 sudo apt install borgbackup。我的備份主機是一臺連線有 1.5TB USB 驅動器的 Linux 機器。如果你沒有可用的機器,那麼備份主機可以像 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,並被許可轉載。


作者簡介:

Christopher Aedo - Christopher Aedo 自從大學時開始就一直在用開源軟體工作併為之作出貢獻。最近他在領導一支非常棒的 IBM 上游開發團隊,他們也是開發支持者。當他不在工作或在會議上發言時,他可能在俄勒岡州波特蘭市使用 RaspberryPi 釀造和發酵美味的自制啤酒。


via: https://opensource.com/article/17/10/backing-your-machines-borg

作者:Christopher Aedo 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章