摘要: 本文介紹如何利用 proxmox-vzbackup-rclone 腳本,將 Proxmox VE (PVE) 的虛擬機 (VM/CT) 備份檔,同步上傳至 Google Drive 雲端硬碟。文章詳述了 Rclone OAuth 客戶端 ID 的建立流程、PVE 上的 Rclone 設定,以及實際備份的效能測試結果。

Proxmox VE (以下簡稱 **PVE**) 是一套功能強大的開源虛擬機作業系統,可以做到許多連 VMware 都做不到的功能。目前已知 PVE 可以做到本地與網路備份,但官方尚未正式支援可以備份至雲端硬碟的功能,因此必須搭配別的工具,才能做到雲端備份!

如果您的 PVE 伺服器想要做到多儲存媒介備份的目標,或是剩餘的硬碟空間比較吃緊但又想保留所有的 VM/CT 備份檔,那麼,將備份檔存放到雲端硬碟,就是一種絕佳的選項。

本文就是使用富源兄(FuYuan’s Space)撰寫的proxmox-vzbackup-rclone 腳本,來將 PVE 的虛擬機備份檔同步上傳/備份至 **Google Drive** 的目的。本文的實測為參考自「在 Proxmox VE 中直接備份至 Google Drive (vzdump + rclone)」一文,測試結果已與原作者取得同意並刊登! 在閱讀本文前,建議先移駕到上面的連結來參考原作的 **Rclone 前置設定作業**,再來參考本文內的測試結果。

PVE VM檔和LXC檔案成功備份至Google Drive

▲ Proxmox VE 的 QEMU VM 檔和 Container LXC 檔案,都成功備份至 Google Drive

PVE Local備份區

▲ 原先 Proxmox VE 的 Local 備份區,也有存放一份相同的備份!


先說結論與實測概覽

結論

  • 此 Script 確實可順利運作! 適用於 **PVE 7** 和 **PVE 6** (需根據不同版本來修改 Script 裡面一個變數)。
  • **PVE 備份過程是:** 備份時程觸發備份工作 → Local 端正常備份。
  • **VZDump + Rclone 備份過程是:** 備份工作觸發 Rclone script 檔 → Local 端正常備份 → **上傳至 Google Drive**。

效能與限制

  • 效能方面: 實測上傳至 Google Drive 的時間還可以 (**15~30MB/sec**,視您的網路頻寬而定),但若一次上傳太多虛擬機備份檔,**有可能造成頻寬過載**,使得總體備份時間也跟著拉長 (要是 Google Drive 整個卡住的話,有可能導致整個備份作業停滯,因此正式導入前,請先測試評估後再導入)。
  • 備份還原: 下拉回自己的備份檔時,會**一次全部下載回來**,原網站建議還是自己從雲端下載比較快,別用 script。
  • 功能限制: 此法目前僅限 **Full Backup (全備份)**,不支援 Proxmox Backup Server (PBS) 的 **Incremental backup (增量備份)** 功能。

Rclone 設定 Google Drive API 與 OAuth Client-ID

透過程式去存取 Google Drive (或是其他服務),必須經過 **OAuth 認證**,才能以 API 來存取。Rclone 也是要設定 OAuth 來進行認證。

雖說使用者其實可以略過此部份,直接用 Rclone 開發者的 Google Drive OAuth Client-ID 去存取你的 Google Drive 空間,但考量「**效能**」和「**安全性**」的因素,建議還是用自己的 **OAuth Client-ID** 會比較好。

  • 效能考量: 使用 Rclone 自家的 API,因為有太多人用了,所以上傳速度會很慢。
  • 安全性考量: 用你的雲端空間來綁定 Rclone 的 OAuth Client-ID,是有隱私問題。

設定方式,可以參考 Rclone 官網的說明 (https://rclone.org/drive/#making-your-own-client-id),來建立自己的 Google Drive OAuth Client-ID,這個步驟比較複雜,首次設定會比較多步驟,但只要設定好一次就可以一勞永逸了!

此時您需要先登入您容量夠大的 Google Drive 帳號,然後登入 **Google API Console** (https://console.developers.google.com/),去建立自己 rclone 專用的 OAuth 2.0 API。

首次設定 Rclone 專用 Google Drive OAuth Client-ID 的過程:

01. 登入 Google API Console 建立專案
▲ 01. 登入 Google Drive 帳號後,先去 Google API Console (https://console.developers.google.com/),點 **建立專案**

02. 新增 rclone 專案名稱
▲ 02. 新增一個 rclone 的專案名稱,然後選自己的機構和位置

03. 啟用 API 和服務
▲ 03. 點選 **啟用 API 和服務**

04. 搜尋 Drive API
▲ 04. API 程式庫裡面,搜尋一下 **Drive**

05. 選擇 Google Drive API
▲ 05. 此時出現 **Google Drive API**,就點選它

06. 啟用 Google Drive API
▲ 06. 確定是 Google Drive API 的話,點選 **啟用**

07. 設定同意畫面
▲ 07. 接下來設定 API 相容認證,首次要設定 OAuth 的同意畫面,這時請點選 **設定同意畫面**

08. 選擇外部使用者類型
▲ 08. 這裡選擇**外部** (若您是 G Suite 用戶,Rclone 官方是說可以選內部看看,但還沒測試過 XD)

09. 輸入應用程式名稱
▲ 09. 接下來輸入應用程式名稱 (rclone)、您的電子郵件…

10. 輸入開發者電子郵件
▲ 10. 畫面往下拉,輸入開發者電子郵件,然後 **儲存並繼續**

11. 檢查畫面後儲存並繼續
▲ 11. 這個畫面看看就好,按 **儲存並繼續**

12. 返回資訊主頁
▲ 12. 最後檢視沒問題的話,就 **返回資訊主頁**

13. 建立憑證
▲ 13. 這時候,才點選上方的 **建立憑證**

14. 選擇 OAuth 用戶端 ID
▲ 14. 憑證類別,選 **OAuth 用戶端 ID**

15. 選擇電腦版應用程式
▲ 15. 應用程式類型選 **電腦版應用程式**,名稱沒差,然後建立

16. 複製用戶端 ID 和密碼
▲ 16. 終於建立好了,此時請將您的**用戶端 ID** 和**用戶端密碼**都複製並存好,待會 Rclone 設定要用到

17. 發布應用程式
▲ 17. 最後記得回 OAuth 同意畫面,將這個 rclone **發布應用程式** 一下,以便正式啟用


Rclone for PVE 設定與安裝

上面經過那麼多道步驟取得 OAuth 的資訊之後,接下來就可以開始設定 Rclone for PVE 了。設定步驟可以參考原作者的「在 Proxmox VE 中直接備份至 Google Drive (vzdump + rclone)」文章。以下就簡單介紹說明安裝步驟。

1. 進入 PVE 的 Terminal 畫面

2. 安裝 Rclone

直接用 apt 指令來安裝 Rclone:

apt update
apt install rclone -y

3. 設定 Rclone config 檔

rclone config

4. 設定 Rclone config 連結至 Google Drive

  • 按 **n** 選 new remote
  • 在 name 輸入 **gd-backup\_crypt** (這是 script 裡面的固定名字,請照實輸入)

  • 此時會列出您要用哪個雲端硬碟,以畫面來說是 **13**
  • 在 Storage> 提示符號輸入 **13**

接下來就是輸入上面的 **OAuth Client-ID** 和密碼了…

  • client-ID 那欄貼上 OAuth Client-ID: 7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com
  • client-secret 貼上密碼: GOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX3
  • 接著選擇 rclone 的權限,為 Full Access,請輸入 **1**

接著是輸入 Google Drive 的根目錄 ID,此時可以先去您 Google Drive (https://drive.google.com)…

在根目錄下,建立一個 **Rclone** 的子目錄 (您也可以自己取其他名字)

然後切到該目錄之後,上面的 URL 網址列,就會出現類似以下的網址列:

https://drive.google.com/drive/u/2/folders/1zXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXU

這個 URL 中 folders/ 後面那個 1zXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXU 就是 **root\_folder\_id** 了。

  • 在 root\_folder\_id> 那欄輸入 1zXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXU
  • 然後 service\_account\_file 那欄不理它,直接按 **<Enter>** 略過
  • 接著問 Edit advanced config? (y/n) 請選 **n**
  • 再來是 Use auto config? 一般都是遠端控制 PVE,因此選擇 **n**

接著螢幕出現一個很長串的網址,也就是要取得 rclone 的驗證碼,請將該網址複製下來,並打開剛剛的瀏覽器,將網址輸入進去。

https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&state=bXXXXXXXXXXXXXXXXXXXXQ

選擇好您剛剛在 OAuth 畫面所輸入的開發者 Google 帳號,然後就會出現 rclone 要存取你 Google 帳戶的訊息。

此時請按 **<允許>** 就可以取得 Rclone 的 Google Drive API 授權碼了。

出現此授權碼之後,請記得將該授權碼複製下來。

  • 在 Enter Verification code> 貼上上述的授權碼: 4/1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXLY
  • 然後問是否設置成 Team Drive,輸入 **n**
  • 接著會顯示 rclone.conf 檔案的內容,問你這樣是否 ok,若沒問題就輸入 **y**
  • 最後會列出當前 rclone 的 remote 設置,名字是 **gd-backup\_crypt**,種類是 **drive (Google Drive)**。好了話,就按 **q** 離開。

安裝 proxmox-vzbackup-rclone 與修改對應的 PVE 版本

上面最複雜的設定部份搞定之後,接下來就可以參考原文章[安裝 proxmox-vzbackup-rclone]之後的安裝說明。這裡簡單說明一下安裝步驟 (以 root 身份來安裝)。

cd /root
apt install git
git clone https://github.com/fuyuanli/proxmox-vzbackup-rclone.git
cd proxmox-vzbackup-rclone
git checkout pve7
chmod +x vzbackup-rclone.sh

修改 vzbackup-rclone.sh 內容

再來檢視/修改一下 **vzbackup-rclone.sh** 的內容

nano vzbackup-rclone.sh

  • 先看第 5 行的 **dumpdir** 是否正確,一般 PVE 都是將備份檔案存放到 **/var/lib/vz/dump** 的,若沒改過的話,只要維持 `dumpdir=”/var/lib/vz/dump”` 的設定即可。
  • 接著再看您的 PVE 版本是 **6.x** 還是 **7.x**。若是 6.x 的話,在第 18 行的 **tarfile** 變數要改對才行:
PVE 7.x → tarfile=${TARGET}
PVE 6.x → tarfile=${TARFILE}

修改上面檔案之後,記得存檔。

修改 vzdump.conf 檔案

最後,再改一個檔案 **`/etc/vzdump.conf`**,讓它去觸發新的 script 檔即可:

nano /etc/vzdump.conf

在 `/etc/vzdump.conf` 裡面加入以下這一行:

script:/root/proxmox-vzbackup-rclone/vzbackup-rclone.sh

存檔後,以上的所有設定大功告成。


效能簡測與 Log 比較

上述繁複的設定搞好之後,您的 PVE 伺服器就會在進行正常的備份作業之後,觸發 **vzbackup-rclone.sh** 去將您的備份資料上傳到 Google Drive。PVE 備份設定就不多介紹了,以下僅以實際備份測試,並列出 Log 檔來做比較。

1. 原先 VM 備份的 log (尚未設定 vzbackup-rclone 前):

INFO: starting new backup job: vzdump 101 --mode snapshot --remove 0 --compress zstd --storage local --node pve-vm
INFO: Starting Backup of VM 101 (lxc)
INFO: Backup started at 2021-10-12 12:19:36
INFO: status = stopped
INFO: backup mode: stop
INFO: ionice priority: 7
INFO: CT Name: rockylinux
INFO: including mount point rootfs ('/') in backup
INFO: creating vzdump archive '/var/lib/vz/dump/vzdump-lxc-101-2021_10_12-12_19_36.tar.zst'
INFO: Total bytes written: 724377600 (691MiB, 33MiB/s)
INFO: archive file size: 226MB
INFO: Finished Backup of VM 101 (00:00:22)
INFO: Backup finished at 2021-10-12 12:19:58
INFO: Backup job finished successfully
TASK OK

2. 搭配 vzbackup-rclone 的 VM 備份 log (226MB 的資料花約 15 秒上傳, 平均 15MB/sec):

INFO: starting new backup job: vzdump 101 --mode snapshot --remove 0 --compress zstd --storage local --node pve-vm
INFO: Backup VM/LXC with Rclone
INFO: Starting Backup of VM 101 (lxc)
INFO: Backup started at 2021-10-12 12:35:31
INFO: status = stopped
INFO: backup mode: stop
INFO: ionice priority: 7
INFO: CT Name: rockylinux
INFO: including mount point rootfs ('/') in backup
INFO: creating vzdump archive '/var/lib/vz/dump/vzdump-lxc-101-2021_10_12-12_35_31.tar.zst'
INFO: Total bytes written: 724377600 (691MiB, 36MiB/s)
INFO: archive file size: 226MB
INFO: Backing up /var/lib/vz/dump/vzdump-lxc-101-2021_10_12-12_35_31.tar.zst to remote storage
INFO: rcloning /var/lib/vz/dump/rclone/2021/10
INFO: 2021/10/12 12:36:06 INFO : vzdump-lxc-101-2021_10_12-12_35_31.tar.zst: Copied (new)
INFO: 2021/10/12 12:36:06 INFO :
INFO: Transferred: 226.268M / 226.268 MBytes, 100%, 16.218 MBytes/s, ETA 0s
INFO: Transferred: 1 / 1, 100%
INFO: Elapsed time: 14.9s
INFO: Finished Backup of VM 101 (00:00:35)
INFO: Backup finished at 2021-10-12 12:36:06
INFO: Backing up main PVE configs
INFO: Tar files
INFO: rcloning /var/tmp/proxmox-ZayJHniQ/pveConfig.2021-10-12.12.36.06.tgz
INFO: 2021/10/12 12:36:11 INFO : pveConfig.2021-10-12.12.36.06.tgz: Copied (new)
INFO: 2021/10/12 12:36:11 INFO : pveConfig.2021-10-12.12.36.06.tgz: Deleted
INFO: 2021/10/12 12:36:11 INFO :
INFO: Transferred: 13.104k / 13.104 kBytes, 100%, 4.602 kBytes/s, ETA 0s
INFO: Checks: 2 / 2, 100%
INFO: Deleted: 1
INFO: Renamed: 1
INFO: Transferred: 1 / 1, 100%
INFO: Elapsed time: 5.3s
INFO: Cleaning up
INFO: Backup job finished successfully
TASK OK

3. vzbackup-rclone 的 VM 備份 log: (備份大的 VM, 8.326GB, 4分40秒, 平均 29.7MB/s):

INFO: starting new backup job: vzdump 100 --node pve-vm --storage local --compress zstd --remove 0 --mode snapshot
INFO: Backup VM/LXC with Rclone
INFO: Starting Backup of VM 100 (qemu)
INFO: Backup started at 2021-10-12 12:56:27
... (省略大量磁碟讀取 log)
INFO: archive file size: 8.33GB
INFO: Backing up /var/lib/vz/dump/vzdump-qemu-100-2021_10_12-12_56_27.vma.zst to remote storage
INFO: rcloning /var/lib/vz/dump/rclone/2021/10
INFO: 2021/10/12 13:00:42 INFO :
INFO: Transferred: 1.784G / 8.326 GBytes, 21%, 30.613 MBytes/s, ETA 3m38s
... (省略大量傳輸進度 log)
INFO: Transferred: 8.326G / 8.326 GBytes, 100%, 30.724 MBytes/s, ETA 0s
INFO: Transferred: 1 / 1, 100%
INFO: Elapsed time: 4m39.3s
INFO: Finished Backup of VM 100 (00:07:53)
INFO: Backup finished at 2021-10-12 13:04:20
INFO: Backing up main PVE configs
INFO: Tar files
... (省略 PVE config 備份 log)
INFO: Backup job finished successfully
TASK OK

以上就是 PVE 透過 **vzdump + Rclone** 的方式同步備份至 Google Drive 的簡單測試結果。至於結論… 在文章一開始就先說明囉!

Leave a Reply