如何使用 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](/data/attachment/album/201711/25/082609zei0r1v29vchbb07.png "backup solution diagram")
最終,我的目標落在 BorgBackup、Rclone 和 Wasabi 雲存儲的組合上,我的決定讓我感到無比快樂。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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive