• slider image 168
:::
條列式新聞
新聞載入中,請稍後...

9-3-4-2 script snapshot 不同期間快照保存份數主程式

使用或呼叫本程式的用法

/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

 


:::
展開 | 闔起

文章類別

書籍目錄

展開 | 闔起

線上使用者

10人線上 (8人在瀏覽線上書籍)

會員: 0

訪客: 10

更多…