Proxmox VE 4.x 中文初階學習手冊
使用或呼叫本程式的用法
/path/check-delete-snapshot-LXC 201 [01|02|03|all]
參數:
01 將前第8天至前第28天之間的快照每天只保留1份快照
02 將前第29天至前第89天之間的快照每週只保留星期一的1份快照
03 將前第90天至前第365天之間的快照每月只保留第1個星期一的1份快照
all 包前上列 01 02 03 等3項動作
本 script 會使用到 下一節的 /path/pooldestroy-LXC script ,
所以在本 script 裡有3處引用 pooldestroy-LXC script 的路徑必須修改符合您放置的路徑
再自行配合 crontab -e 的使用就能每日定時做不同時期快照份數保留的設定
#!/bin/bash
clear
# http://jashliao.pixnet.net/blog/post/164758629
LXCID="$1" # LXC 虛擬機代號 100 - 999
snapshot_delete=$2 # 快照刪除保留動作方式 01 02 03 all
# --------------------------------- 開始修改變數 ----------------------------------------
# 虛擬機在 zfs 裡的 zpool名稱/目錄名稱 zfs volume
# 例
# /sbin/zfs list |grep 201
# LXCvolume LXCvolume2
# VM2/vz/subvol-201-disk-1 10.4G 2.85G 3.15G /VM2/vz/subvol-201-disk-1
LXCvolume=VM2/vz/subvol-${LXCID}-disk
# --------------------------------- 完成修改變數 ----------------------------------------
# 暫存檔設定
tmpfile=/tmp/LXC${LXCID}.tmp.`od -vAn -N8 -tu8 /dev/urandom |sed -e 's/ *//'`
# -------------------------------------------------------------------------
snapshot_all=7 # 7天內快照保存-全部不刪除 7表示1-7不刪除
snapshot_day=28 # 4週內每天一個快照保存 8天前到31天前只留當天的一次快照
snapshot_week=90 # 1個月到3個月之間,每週保留1個快照
snapshot_month=365 # 半年內每月一個快照保存超過一個月以上,每個月保留一次快照(保留當月的第1筆快照)
# ---------------------------------------------------------- 函數開始 -------------------------
function echousage(){
# 顯示參數正確用法
echo ""
echo ""
echo ""
echo ""
echo "--------------------------------------------------------------------"
echo "參數錯誤"
echo "指令:"
echo " $0 [LXC id] [01|02|03|all]"
echo ""
echo "01 將前8-14天之間的快照每天保留前後各1份快表照"
echo "02 將前29-35天之間的快照每週保留前後各1份快表照(只保留星期一的快照)"
echo "03 將前90-365天之間的快照每月保留每月第1個星期一的快照"
echo "all 包含01 02 03"
echo "--------------------------------------------------------------------"
echo ""
exit 1
}
function destroy_day(){
echo 開始將前8-14天之間的快照每天保留前後各1份快表照
#for (( i=${snapshot_all}+1; i<=${snapshot_day}; i=i+1 )) # 每一天都檢查刪除
for (( i=${snapshot_all}+1; i<=${snapshot_all}+7; i=i+1 )) # 只處理7天的快照
do
# s=$((${s}+${i}))
#echo /bin/date -d '-$[i] days' +%Y-%m-%d
#echo "/bin/date -d '-"$[i]"days' +%Y-%m-%d"
echo --------------------
destroydate=`/bin/date -d -$[i]days +%Y-%m-%d` # 取得日期
echo --------------------
echo "刪除多餘快照指令:(保留當日一份)"
echo "/crond/snapshot/PVE/pooldestroy-LXC ${LXCID} ${destroydate}"
/crond/snapshot/PVE/pooldestroy-LXC ${LXCID} ${destroydate} # 呼叫外部程式刪除快照
done
}
function destroy_week(){
echo "開始將前29-90天之間的快照每週保留前後各1份快表照(只保留星期一的快照)"
#for (( i=${snapshot_day}+1; i<=${snapshot_week}; i=i+1 )) # 每一天都檢查刪除
for (( i=${snapshot_day}+1; i<=${snapshot_day}+7; i=i+1 )) # 只處理7天的快照
do
echo --------------------
destroydate=`/bin/date -d -$[i]days +%Y-%m-%d` # 取得日期
echo "日期:${destroydate}"
weekcount=`/bin/date -d -$[i]days +%w` # 取得星期幾
echo "星期:`/bin/date -d -$[i]days +%A`"
if [ "$weekcount" = "1" ] ; then # 如果是星期一
{
echo "快照狀態:快照保留。" # 就保留快照
}
else
{
echo "快照狀態:當日快照全部刪除。"
echo "/crond/snapshot/PVE/pooldestroy-LXC ${LXCID} ${destroydate} delete"
/crond/snapshot/PVE/pooldestroy-LXC ${LXCID} ${destroydate} delete # 否則將該日快照全部刪除
}
fi
sleep 1
done
}
function destroy_month(){
echo "開始將前90-365天之間的快照每月保留每月第1個星期一的快照"
#for (( i=${snapshot_week}+1; i<=${snapshot_month}; i=i+1 )) # 每一天都檢查刪除
for (( i=${snapshot_week}+1; i<=${snapshot_week}+14; i=i+1 )) # 只處理7天的快照
do
echo --------------------
destroydate=`/bin/date -d -$[i]days +%Y-%m-%d` # 取得日期
echo "日期:${destroydate}"
weekcount=`/bin/date -d -$[i]days +%w` # 取得星期幾
daycount=`/bin/date -d -$[i]days +%d` # 取得當月的日數 (將該月的第1個星期1的快照保留)
echo "日數:\$daycount=${daycount}"
echo "星期:`/bin/date -d -$[i]days +%A`"
# 星期=1,1<=日數<=7 快照 保留(其餘刪除)
if [ "$weekcount" = "1" ] ; then # 該日數如果是星期一
{
if [ "${daycount}" -le 7 ] ; then # 如果日數是在當月的1-7日之間
{
echo "快照狀態:快照保留。" # 快照保留
}
else
{
echo "快照狀態:當日快照全部刪除。" # 如果不是星期1, 就將當日快照全部刪除
echo "/crond/snapshot/PVE/pooldestroy-LXC ${LXCID} ${destroydate} delete"
/crond/snapshot/PVE/pooldestroy-LXC ${LXCID} ${destroydate} delete
}
fi
}
fi
sleep 1
done
}
function destroy_snapshot(){ # 本程式的主執行程序
# 以參數 ${snapshot_delete} 來執行不同的快照刪除
case ${snapshot_delete} in
01)
destroy_day # 呼叫 function destroy_day()
;; # 將前8-14天之間的快照每天保留前後各1份快表照
02)
destroy_week # 呼叫 function destroy_week()
;; # 將前29-35天之間的快照每週保留前後各1份快表照(只保留星期一的快照)
03)
destroy_month # 呼叫 function destroy_month()
;; # 將前90-103 天之間的快照每月保留每月第1個星期一的快照
all)
destroy_day # 包含function destroy_day() destroy_week() destroy_month()
destroy_week
destroy_month
;;
*)
echousage # 參數錯誤時 顯示參數用法
exit 1 # 中斷執行
;;
esac
}
# ---------------------------------------------------------- 函數結束 -------------------------
# ----------------------------------------------------------------------------------------------
# 檢查虛擬機代號的 /sbin/zfs list 是否存在
/sbin/zfs list |grep ${LXCvolume} > ${tmpfile} # 將 zfs volume 輸出結果到 暫存檔
vzdisk[0]=`cat ${tmpfile} | wc -l` # 計算LXC id 的 zfs volume 是否存在
# 虛擬機的zfs volume 存在 虛擬機的id 大於100 虛擬機的id 小於1000
if [ "${vzdisk[0]}" -gt "0" ] && [ "${LXCID}" -gt "100" ] && [ "${LXCID}" -lt "1000" ] ; then
{
echo "虛擬機 ${LXCID} 找到"
echo "呼叫內部 function destroy_snapshot() 刪除快照動作 "
echo ""
echo ""
destroy_snapshot # 呼叫內部 function destroy_snapshot() 刪除快照動作
# 參數由變數 ${LXCID} ${snapshot_delete} 提供
}
else
{
echo "" # 顯示參數錯誤訊息
echo "本程序指令:"
echo "$0 ${LXCID} ${snapshot_delete}"
echo "虛擬機代號的參數為 ${LXCID}"
echo ""
echo ""
# if [ "${LXCID}" -gt "999" ] || [ ! "${LXCID}" -lt "100" ] ; then # 如果虛擬機代號不在 100-999 範圍之間
if ! [ "${LXCID}" -gt "100" ] || [ ! "${LXCID}" -lt "999" ] ; then
echo "錯誤訊息:虛擬機代號${LXCID}必須介於100-999之間" # 顯示錯誤訊息
echo ""
exit 1
fi
if ! [ "${vzdisk[0]}" -gt "0" ] ; then # 虛擬機代號儲存位置的 zfs volume 找不到
echo "錯誤訊息:虛擬機的zfs volume 不存在,虛擬機的代號${LXCID}可能錯誤" # 顯示錯誤訊息
echo ""
exit 1
fi
echo " 1.虛擬機不存在。"
echo " 2.虛擬機代號不正確"
echo " 代號必須是數字"
echo " 代號介於100-999之間"
echo ""
# 程序中斷
exit 8
}
fi