跳到主要內容
節省工具箱Jason Tools
經驗分享

PBS 批次刪除多個備份群組

Jason Cheng 發布 瀏覽 1 次
PBS 批次刪除多個備份群組
本文目錄
  1. 備份群組的結構
  2. 列出所有備份群組
  3. 刪除單一備份群組
  4. 一次刪除多個備份群組
  5. 釋放磁碟空間
  6. 權限
  7. 結論
  8. 參考資料

PBS(Proxmox Backup Server)用久了,資料存放區裡總會累積一些已經不需要的備份:VM 早就刪掉了、客戶的測試機搬走了、某個叢集整個退役了,備份卻還留在 PBS 上佔空間。

在 PBS 裡,一台 VM 或 CT 的所有備份就是一個「備份群組」(Backup Group)。網頁介面可以刪除整個群組,但一次只能刪一個,要清掉幾十台 VM 的備份,一個一個按很花時間。這篇整理用指令一次刪除多個備份群組的做法。

備份群組的結構

PBS 的資料存放區(Datastore)裡,備份分成三層:

  • 命名空間(Namespace):選用,可以把不同叢集、不同客戶的備份分開放,沒設定時就是根命名空間
  • 備份群組(Backup Group):以 類型/ID 表示,例如 vm/103、ct/201、host/fileserver
  • 快照(Snapshot):群組底下每一次的備份,以 類型/ID/時間 表示,例如 vm/103/2025-03-01T02:00:00Z

刪除群組,就是把這個群組底下的快照全部刪掉,再移除群組本身。

注意:受保護(Protected)的快照不會被刪除。群組裡有受保護的快照時,只會刪掉其他未受保護的快照、群組保留下來,指令會回報 group only partially deleted due to protected snapshots 錯誤。

列出所有備份群組

在 PBS 主機上以 root 執行,可以用 proxmox-backup-debug api,它的用法類似 PVE 的 pvesh,可以直接呼叫 PBS 的 API:

# 列出資料存放區 store1 下所有備份群組
proxmox-backup-debug api get /admin/datastore/store1/groups

# 指定命名空間
proxmox-backup-debug api get /admin/datastore/store1/groups --ns cluster1

輸出是一張表格,欄位包含:

欄位說明
backup-type類型:vm、ct、host
backup-idVM/CT 的 ID,或主機名稱
backup-count快照數量
last-backup最後一次備份時間
owner群組擁有者
files最後一次備份包含的檔案
comment備註

要交給腳本處理時,加上 --output-format json 改成 JSON 輸出。

也可以使用 proxmox-backup-client list,差別是它要指定儲存庫(Repository)並完成認證,可以從 PVE 節點或其他機器遠端執行:

proxmox-backup-client list --repository root@pam@pbs.example.com:store1

刪除單一備份群組

方法一:proxmox-backup-client group forget

PBS 3.2.7 起,proxmox-backup-client 加入了 group forget 指令,可以刪除整個群組:

proxmox-backup-client group forget vm/103 --repository root@pam@pbs.example.com:store1

# 指定命名空間
proxmox-backup-client group forget vm/103 --ns cluster1 --repository root@pam@pbs.example.com:store1

執行時會先列出群組裡有幾個快照,並詢問是否確定刪除,預設答案是「否」,要輸入 y 才會執行。

方法二:直接呼叫 API

刪除群組的 API 是 DELETE /admin/datastore/{store}/groups,參數為 backup-type、backup-id,以及選用的 ns。用 proxmox-backup-debug 呼叫:

proxmox-backup-debug api delete /admin/datastore/store1/groups --backup-type vm --backup-id 103

# 指定命名空間
proxmox-backup-debug api delete /admin/datastore/store1/groups --backup-type vm --backup-id 103 --ns cluster1

這個方式不會詢問確認,按下 Enter 就直接刪除,執行前務必再確認一次類型與 ID。

只刪除單一快照

如果只是要刪掉群組裡的某一次備份,用 snapshot forget,參數要寫到時間:

proxmox-backup-client snapshot forget vm/103/2025-03-01T02:00:00Z --repository root@pam@pbs.example.com:store1

注意:snapshot forget 的參數必須是完整的快照路徑,只寫 vm/103 會無法解析而報錯,要刪除整個群組請用前面的 group forget。

一次刪除多個備份群組

批次刪除的做法是:先把要刪的群組整理成清單,確認無誤後,再用迴圈逐一刪除。

步驟一:產生清單

可以手動列出,也可以從群組清單篩選。例如篩選出最後一次備份超過 90 天的群組(多半是已經不存在的 VM):

apt install jq

proxmox-backup-debug api get /admin/datastore/store1/groups --output-format json \
  | jq -r --argjson t "$(date -d '90 days ago' +%s)" \
    '.[] | select(."last-backup" < $t) | "\(."backup-type")/\(."backup-id")"' \
  > /root/groups-to-delete.txt

cat /root/groups-to-delete.txt

產生的清單每行一個群組:

vm/103
vm/104
ct/201

請務必逐行檢查這份清單,把還要保留的群組刪掉。長時間沒有新備份不一定代表可以刪,例如關機封存的 VM、刻意保留的舊版本。

步驟二:批次刪除

STORE=store1

while read -r g; do
  [ -z "$g" ] && continue
  type=${g%%/*}
  id=${g#*/}
  echo "刪除 $type/$id"
  proxmox-backup-debug api delete /admin/datastore/$STORE/groups \
    --backup-type "$type" --backup-id "$id"
done < /root/groups-to-delete.txt

有使用命名空間的話,在 api delete 那一行加上 --ns cluster1。

想先演練一次,可以把 proxmox-backup-debug api delete 那行前面加上 echo,只印出要執行的指令,確認無誤再拿掉。

釋放磁碟空間

刪除群組之後,資料存放區的使用量不會馬上下降。PBS 的備份資料是以 chunk 去重儲存的,forget 只刪除索引,chunk 要等垃圾回收(Garbage Collection)才會真正清掉:

proxmox-backup-manager garbage-collection start store1

# 查看進度與結果
proxmox-backup-manager garbage-collection status store1

垃圾回收只會刪除超過約 24 小時 5 分鐘沒有被存取的 chunk,所以剛刪完馬上跑,空間可能不會全部釋放,隔天的排程跑過之後才會看到明顯變化。資料存放區很大時垃圾回收要跑很久,建議排在離峰時段。

權限

刪除群組需要下列其中一種權限:

  • 在資料存放區(或該命名空間)上有 Datastore.Modify
  • 有 Datastore.Prune,而且是該群組的擁有者

以 root 在 PBS 主機上執行 proxmox-backup-debug 時沒有權限問題;用其他帳號或 API Token 執行 proxmox-backup-client 時,要先確認權限足夠。

結論

要一次清掉很多 VM/CT 的備份,重點是「先產生清單、檢查過,再批次刪除」。proxmox-backup-debug api 不會詢問確認,適合寫成腳本,但也因此更要小心,清單沒檢查過就直接跑,刪錯了是救不回來的。

刪完記得跑一次垃圾回收,空間才會真正釋放。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀