ESXI自动备份虚拟机快照

  这个是我1月初做的一个东西,现在已经稳定地运行,需求就是:保留最近2天快照备份,人为手动备份的快照一直保留。不保留更多的快照是因为这台虚拟机所在宿主机ESXI空间不太足够。。。

  先放下效果图(ESXI是6.0版本)

esxi生成快照 包括虚拟机的内存 esxi 自动快照_重启

   讲下一些注意点,然后直接贴脚本

一、注意问题

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 上传的

【浏览数据存储】 ——》选择上传图标

esxi生成快照 包括虚拟机的内存 esxi 自动快照_esxi生成快照 包括虚拟机的内存_02

 如果传完,替换完文件还是时间不准,直接粗暴地手动调时间~ 这个代表10点59分40秒

esxcli system time set -H 10 -m 59 -s 40

3、定时任务放到ESXI计划任务后失灵不跑,或错跑

包括两种情况

(1)上一次在cron文件删掉的计划任务,竟然继续跑

解决方法:手动运行  /sbin/tmpwatch.py

粗略看了下脚本内容,感觉是一些清理文件缓存的东西,没深究过,大家有兴趣可以研究下

esxi生成快照 包括虚拟机的内存 esxi 自动快照_vim_03

(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

由两个脚本组成:删除快照脚本+创建快照脚本

 

esxi生成快照 包括虚拟机的内存 esxi 自动快照_vim_04

 (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重启被清理

esxi生成快照 包括虚拟机的内存 esxi 自动快照_重启_05