使用或呼叫本程式的用法
/path/pooldestroy-LXC 201 2017-02-02 [delete]
表示會將虛擬機代號 201 在 2017-02-02 當日的快照保留1份快照。
(後面如果加上 delete 參數則當日的快照全數刪除)
#!/bin/bash
# -------------------------------------------------------------------------------------------------------------------------------------------------
# $1 虛擬機 id ---> 201
# $2 要刪除快照的目期 ---> 2017-02-28
# $3 指定 delete ,表示該日期的快照全部刪除 ---> delete 或 無
# -------------------------------------------------------------------------------------------------------------------------------------------------
# --------------------------------------------------------------------------------------------------------------- 虛擬機 儲存 volume 名稱 ---------
mountpoint="VM2/vz/subvol-$1-disk-1" # 虛擬機zfs掛載點 ---> 唯一修改處
# -------------------------------------------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------------------------------------------
tmpfile1=/tmp/$1.destroysnapshot.source.`od -vAn -N8 -tu8 /dev/urandom |sed -e 's/ *//'` # 產生暫存檔1的名稱
tmpfile2=/tmp/$1.destroysnapshot.line.`od -vAn -N8 -tu8 /dev/urandom |sed -e 's/ *//'` # 產生暫存檔2的名稱
echo
echo
echo
# 檢查是否代入參數
if [ "" == "$1" ] || [ "" == "$2" ]; then # 缺少前面兩個參數
echo "-----------------------------" # 其實只要檢查第2個參數是否有提供即可
echo "沒有參數"
echo " 參數格式:$0 虛擬機代號 日 期 刪 除"
echo " 參數格式:$0 [201-204|216] 2016-09-13 [|delete]"
echo "-----------------------------"
exit
fi
echo "預設 : 刪除 $2 多餘快照,保留 $2 第1筆及最後1筆快照"
echo "參數:delete: 該日期的快照全部刪除"
echo
sleep 2
# -------------------------------------------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------------------------------------------
echo "虛擬機 LXC $1 掛載點:${mountpoint}"
echo
destroydatetime=$2 # 要刪除快照的時間
deleteyn=$3 # 是否當日全部的快照全部刪除
sleep 1
echo "開始取得 snapshot 列表..." ;echo
/sbin/zfs list -t snapshot |grep ${mountpoint}|grep ${destroydatetime} > ${tmpfile1} # 匯出虛擬機快照列表
LXCsnapshotstringlength=`cat ${tmpfile1} | head -n 1 | awk 'BEGIN {FS=" "} {print $1}' | wc -c` # 方法1 取得快照全名長度
#read tttt < ${tmpfile1} # 方法2 讀取虛擬機 volume 的第1行
#LXCsnapshotstringlength=`echo $tttt |awk 'BEGIN {FS=" "} {print $1}' | wc -c` # 取得快照全名的長度
if [ "${vzdisk[0]}" -eq "0" ] ; then # 檢核虛擬機所儲存位置的 volume 是否存在
echo "錯誤訊息:" # 如果沒有,表示虛擬機的代號($1) 錯誤
echo " 虛擬機儲存的 volume 無法找到"
echo " 虛擬機代號錯誤"
exit
fi
cat ${tmpfile1} | colrm ${LXCsnapshotstringlength} > ${tmpfile2} # 擷取快照名稱
vzdisk[0]=`cat ${tmpfile2} | wc -l` # 計算當日快照數量
i=1 # 編號由1開始
# --------------------------------------------------------------------------------------------------------------------------
while read line; do
poolname=$line # 讀取第1筆快照名稱
echo "i="$i
echo "第$i筆資料="$line
# 如果是 第1筆 或是 最後一筆
if [ "$i" == "1" ] || [ "$i" == "${vzdisk[0]}" ] ; then
if [ "${deleteyn}" == "delete" ]; then # 如果指定全部刪除
{ # 那就刪除吧
echo "刪除快照:${poolname}"
echo "開始刪除指令: /sbin/zfs destroy " $poolname
/sbin/zfs destroy $poolname
}
else # 如果沒有指定全部刪除
echo "快照 ${poolname} 保留" # 那麼 就保留不刪除
fi
fi
#if [ "$i" -gt "0" ] && [ "$i" -lt "${vzdisk[0]}" ] ; then
# 如果編號大於1 而且 小於 最大編號 ---> 扣除第1和最後一筆之間的所有快照
if [ "$i" -gt "1" ] && [ "$i" -lt "${vzdisk[0]}" ] ; then
echo "開始處理第$i筆資料:"$line # 全數刪除
echo "開始刪除指令: /sbin/zfs destroy " $poolname
/sbin/zfs destroy $poolname # 刪除該筆快照
fi
echo "--------------------------"
# http://mirror.sars.tw/Bash_Shell_by_ols3/c860.html
let i=i+1 # 編號 +1
done < ${tmpfile2}
echo --------------------------------------------------------------------------------------------------------------------------
echo 刪除完畢,保留當日快照備份如下:
/sbin/zfs list -t snapshot|grep ${mountpoint}| grep ${destroydatetime} # 列出當日快照
echo ----------------------------------------
# 程式結束
rm ${tmpfile1} # 刪除暫存檔1
rm ${tmpfile2} # 刪除暫存檔2
exit 0
# ---------------------------------------- 程式結束 -----------------------------------------------
# ---------------------------------------- 程式結束 -----------------------------------------------
# ---------------------------------------- 程式結束 -----------------------------------------------
# ---------------------------------------- 程式結束 -----------------------------------------------
# ---------------------------------------- 程式結束 -----------------------------------------------
# ---------------------------------------- 程式結束 -----------------------------------------------
# ---------------------------------------- 程式結束 -----------------------------------------------
# ---------------------------------------- 程式結束 -----------------------------------------------