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-id | VM/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 不會詢問確認,適合寫成腳本,但也因此更要小心,清單沒檢查過就直接跑,刪錯了是救不回來的。
刪完記得跑一次垃圾回收,空間才會真正釋放。
參考資料
- Proxmox Backup Server:Backup Client Usage
https://pbs.proxmox.com/docs/backup-client.html - Proxmox Backup Server:Command Syntax
https://pbs.proxmox.com/docs/command-syntax.html - Proxmox Backup Server:API Viewer(/admin/datastore/{store}/groups)
https://pbs.proxmox.com/docs/api-viewer/index.html#/admin/datastore/{store}/groups - Proxmox 論壇:Anybody with a delete backup group script?
https://forum.proxmox.com/threads/anybody-with-a-delete-backup-group-script.103889/ - Proxmox VE & BS 備份與備援策略設計
https://blog.jason.tools/2020/12/proxmox-ve-bs.html



