ESXI自动备份虚拟机快照
这个是我1月初做的一个东西,现在已经稳定地运行,需求就是:保留最近2天快照备份,人为手动备份的快照一直保留。不保留更多的快照是因为这台虚拟机所在宿主机ESXI空间不太足够。。。
先放下效果图(ESXI是6.0版本)
讲下一些注意点,然后直接贴脚本
一、注意问题
1、ESXI 不支持直接cron命令配置计划任务
不支持crontab -e 直接编辑,需要编辑cron文件:vi /var/spool/cron/crontabs/root,添加计划任务,而且该文件默认只读,需要使用 :wq! 强制保存。
参考:
2、ESXI时区问题
默认比我们少8个小时,需要调整,参考:
像我是直接拷贝一台centos7虚拟机的/usr/share/zoneinfo/Asia/Shanghai 文件到ESXI的,放的位置有讲究,而且最后还得放到开机启动文件上。
拷贝也有讲究,我用scp复制不过去,直接通过vSphere client 上传的
【浏览数据存储】 ——》选择上传图标
如果传完,替换完文件还是时间不准,直接粗暴地手动调时间~ 这个代表10点59分40秒
esxcli system time set -H 10 -m 59 -s 40
3、定时任务放到ESXI计划任务后失灵不跑,或错跑
包括两种情况
(1)上一次在cron文件删掉的计划任务,竟然继续跑
解决方法:手动运行 /sbin/tmpwatch.py
粗略看了下脚本内容,感觉是一些清理文件缓存的东西,没深究过,大家有兴趣可以研究下
(2)新添加的计划任务,不跑
解决方法:重启计划任务
/bin/kill $(cat /var/run/crond.pid)
/usr/lib/vmware/busybox/bin/busybox crond 或直接运行 crond
网上查到,说ESXI有个重启还原丢失的问题,计划任务会被丢弃。
所以放完脚本到定时任务后,还需要编辑开机自启脚本( /etc/rc.local.d/local.sh),使其开机自动添加计划任务
二、脚本及部署
1、编辑计划任务文件
vi /var/spool/cron/crontabs/root
由两个脚本组成:删除快照脚本+创建快照脚本
(1)删除快照脚本:delsnap.sh
1 #!/bin/sh
2
3 DAY=1 #保留快照数量
4
5 SNAPSHOT_COUNT=`vim-cmd vmsvc/snapshot.get {备份虚拟机id} | grep "Snapshot Name.*xxx快照自动备份*" | wc -l`
6
7
8 if [ $SNAPSHOT_COUNT -gt $DAY ]; then
9 #需要删除的个数
10 DELETE_COUNT=$(($SNAPSHOT_COUNT-$DAY))
11
12 vim-cmd vmsvc/snapshot.get {备份虚拟机id} > schedule_snap/snap_del.log
13 #找到行
14 vim-cmd vmsvc/snapshot.get {备份虚拟机id} | grep -E -n "Snapshot Name.*xxx快照自动备份*" | head -$DELETE_COUNT | awk -F':' '{print $1}' > schedule_snap/snap_del-2.log
15
16 cat schedule_snap/snap_del-2.log | while read line
17 do
18 OLD_SNAPSHOTNAME_LINE=`echo $line`
19 #找到需要删除快照的ID行
20 OLD_SNAPSHOTNAME_NUM=$(($OLD_SNAPSHOTNAME_LINE+1))
21 #根据行号,找到需要删除快照的ID号
22 OLD_SNAPSHOTNAME_ID=`sed -n "$OLD_SNAPSHOTNAME_NUM"p schedule_snap/snap_del.log |awk -F':' '{print $2}' | sed 's/ //g'`
23
24 vim-cmd vmsvc/snapshot.remove {备份虚拟机id} $OLD_SNAPSHOTNAME_ID > /dev/null
25 sleep 30s
26 done
27 fi
(2)创建快照脚本:delsnap.sh
1 #!/bin/sh
2
3 vname=$(vim-cmd vmsvc/get.summary {备份虚拟机id} | grep name | awk '{ print $3 }' | cut -d \" -f 2)
4
5 vim-cmd vmsvc/snapshot.create {备份虚拟机id} xxx快照自动备份_$(date "+%F_%T")
6 sleep 30s
7
8
9 if [ $? -eq 0 ];then
10 echo "$(date "+%F %T") : $vname 快照创建成功.." >> schedule_snap/snap_bak.log
11
12 else
13 echo "$(date "+%F %T") : $vname 快照创建失败.." >> schedule_snap/snap_bak.log
14
15 fi
脚本参考:
编辑完保存后记得重启crond服务!
这两个脚本结合一起用,无论你手动测试创建了很多个自动快照备份,都只保留最近2个快照。
2、编辑开机自启服务文件
vi /etc/rc.local.d/local.sh
一个是防止时区被清理,一个是防止定时任务因ESXI重启被清理