VMware虚拟化 - 建设篇
第四章 使用vim-cmd工具给ESXi虚机定期打快照
系列文章回顾
第一章 部署vCenter6.7和vSphere群集功能
第二章 vCenter6.7的管理网络使用vDS+LACP
第三章 vCenter6.7挂载Windows Server2016 NFS41存储
使用vim-cmd工具给ESXi虚机定期打快照
前言
由于整合了几台ESXi
主机,使用了vCenter
虚拟化平台,为确保虚拟机业务持续稳定地运行,需定期给虚拟机打快照备份和磁盘备份(使用Windows Server Backup
做磁盘备份),即使用ESXi
自带的vim-cmd
工具集进行虚机快照备份。
- 虚拟化平台:
VMware VSCA 6.7
- ESXi底层:
VMware VMvisor 6.7
前提条件
- 使用vim-cmd工具给ESXi虚拟机打快照的前提是 虚拟机所在的数据存储
datastore
必须有闲置容量,因为打快照的原理是锁定当前虚机的所有存储容量,当产生新的数据时就开始占用datastore
的闲置容量了。 - 根据虚机的实际使用量来计算,至少冗余
10%
以上的datasotre
闲置容量,保证datastore
存储有可用容量。
ESXi新增执行快照备份的sh脚本
sh脚本存放在datastore
数据存储内,即/vmfs/volumes/datastore
目录,sh脚本引用目录时使用UUID
真实链接
如下案例将<datastore1-UUID>
替换成datastore
的UUID
真实链接
### cd /vmfs/volumes/datastore1
[root@VM01:/vmfs/volumes/<datastore1-UUID>] mkdir crontabs; cd crontabs
# 创建快照的sh脚本 | 给sh脚本添加执行权限
[root@VM01:/vmfs/volumes/<datastore1-UUID>/crontabs] touch snapshot_create.sh; chmod +x snapshot_create.sh
# 删除快照的sh脚本 | 给sh脚本添加执行权限
[root@VM01:/vmfs/volumes/<datastore1-UUID>/crontabs] touch snapshot_delete.sh; chmod +x snapshot_delete.sh
# 记录创建快照的log日志
[root@VM01:/vmfs/volumes/<datastore1-UUID>/crontabs] touch schedule_create_snap.log
# 记录创建删除的log日志 | 全量log日志
[root@VM01:/vmfs/volumes/<datastore1-UUID>/crontabs] touch schedule_delete_snap.log; touch schedule_delete_snap_All.log
snapshot_create.sh
#!/bin/sh
_SNAPLEN=2 # 为防止 snapshot_delete.sh 执行失败的情况出现,创建快照期间也要限制快照的数量不超过 _SNAPLEN。这个值跟snapshot_delete.sh的 _SNAPLEN 保持一致
_Count=`vim-cmd vmsvc/getallvms | egrep vmx | wc -l` # 统计虚机总数
echo $(date +"%F %T") Start create task. Need backup snapshot VM count: $_Count >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_create_snap.log
for id in `vim-cmd vmsvc/getallvms | egrep vmx | awk '{print $1}'`
do
if [ $(vim-cmd vmsvc/snapshot.get $id | egrep Id | wc -l) -gt $_SNAPLEN ];then # -gt大于
_Count=$(expr $_Count - 1)
continue # 当前遍历虚机的快照总数大于 _SNAPLEN 则跳过此虚机
fi
# 必选:带有NoAutoExecSnapshot属性的虚机不打快照
if [ "$(vim-cmd vmsvc/get.config $id | egrep NoAutoExecSnapshot)" != "" ];then
continue
fi
# 可选:已关闭电源的虚机不打快照.
power=`vim-cmd vmsvc/get.summary $id | egrep power | awk -F '"' '{print $2}'` # 虚机电源状态
if [ "${power}" = "poweredOff" ];then
continue
fi
vname=`vim-cmd vmsvc/get.summary $id | egrep name | awk -F '"' '{print $2}'` # 虚机名称
vim-cmd vmsvc/snapshot.create $id "AutoSnap - $(date +'%F %T')" 2>&1 > /dev/null
sleep 30s
if [ $? -eq 0 ];then
printf 'Count:%-8sDate:%-13sVMID:%-5svname: %-42sAutoSnapTime:%-15s %0s\n' ${_Count} $(date +"%F") $id "$vname" $(date +"%F")\ $(date +"%T") '[Success]' >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_create_snap.log
_Count=$(expr $_Count - 1)
else
printf 'Count:%-8sDate:%-13sVMID:%-5svname: %-42sAutoSnapTime:%-15s %0s\n' ${_Count} $(date +"%F") $id "$vname" $(date +"%F")\ $(date +"%T") '[Failed]' >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_create_snap.log
fi
done
if [ $_Count -eq 0 ];then
echo End create task, $(date +"%F %T"). VM backup snapshot Complete. >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_create_snap.log
else
echo End create task, $(date +"%F %T"). Did not backup snapshot VM\'s count: $_Count >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_create_snap.log
fi
echo >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_create_snap.log
snapshot_delete.sh
#!/bin/sh
_SNAPLEN=2 # 使虚机的快照总数不超过 _SNAPLEN
echo $(date +"%F %T") Start delete task. Number of days to retain snapshots: ${_SNAPLEN} >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_delete_snap.log
for id in `vim-cmd vmsvc/getallvms | egrep vmx | awk '{print $1}'`
do
# 必选:带有NoAutoExecSnapshot属性的虚机不删除快照
if [ "$(vim-cmd vmsvc/get.config $id | egrep NoAutoExecSnapshot)" != "" ];then
continue
fi
vname=`vim-cmd vmsvc/get.summary $id | egrep name | awk -F '"' '{print $2}'` # 虚机名称
snapshot_count=`vim-cmd vmsvc/snapshot.get $id | egrep Id | wc -l` # 虚机快照总数
if [ $snapshot_count -gt $_SNAPLEN ];then
delete_count=$(($snapshot_count-$_SNAPLEN))
old_snapshot_id=`vim-cmd vmsvc/snapshot.get $id | egrep Id | head -$delete_count | awk -F: '{print $2}'`
for n in $old_snapshot_id
do
vim-cmd vmsvc/snapshot.remove $id $n 2>&1 >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_delete_snap_All.log
sleep 30s
printf 'Date:%-18sVMID:%-5svname: %-42sAutoRemoveTime:%-15s %0s\n' $(date +"%F") $id "$vname" $(date +"%F")\ $(date +"%T") '[Success]' >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_delete_snap.log
done
fi
done
echo End delete task, $(date +"%F %T"). Complete remove snapshot ALL VM but retain ${_SNAPLEN} days snapshots. >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_delete_snap.log
echo >> /vmfs/volumes/<datastore1-UUID>/crontabs/schedule_delete_snap.log
ESXi添加crond任务并使其生效
/etc/rc.local.d/local.sh
在末尾的exit 0
之前添加如下行
kill $(cat /var/run/crond.pid)
# 每2天的23点30分执行一次创建快照任务
/bin/echo "30 23 */2 * * /bin/sh /vmfs/volumes/<datastore1-UUID>/crontabs/snapshot_create.sh" >> /var/spool/cron/crontabs/root
# 每天的4点执行一次删除快照任务
/bin/echo "0 4 * * * /bin/sh /vmfs/volumes/<datastore1-UUID>/crontabs/snapshot_delete.sh" >> /var/spool/cron/crontabs/root
crond
执行如下命令刷新ESXi
服务器的状态,重启后生效。
注:每当/etc/rc.locald./local.sh
脚本有变更时都要执行如下命令使其生效
/sbin/auto-backup.sh
ESXi指定部分虚拟机不执行定期快照
snapshot_create.sh
脚本设置了查找虚机的NoAutoExecSnapshot
属性,存在此属性的虚机不执行定期创建快照也不执行删除快照。ESXi
后台管理给虚机添加自定义属性方法如下。
(附加)虚拟机自定义属性结合sh脚本实现自定义操作
ESXi
的虚机可以设置键值对形式的自定义属性,可以新增特定属性再结合sh脚本实现自定义操作,举例如下:
- 全局默认所有虚机的快照总数是
n
,可设置部分虚机的快照总数是m (m<n)
,如一些业务读写较大的虚机的快照总数不宜过多。该虚机添加CustomAuto.SnapLen
键,值设置m
,sh脚本添加条件判断,实现部分虚机仅保留m
份快照。
验证定期创建快照和删除快照
创建快照的日志
### cd /vmfs/volumes/datastore1/crontabs
[root@VM01:/vmfs/volumes/<datastore1-UUID>/crontabs] tail schedule_create_snap.log
2023-0X-XX 23:30:00 Start create task. Need backup snapshot VM count: 2
Count:1 Date:2023-0X-XX VMID:10 vname: VM-01 AutoSnapTime:2023-0X-XX 23:30:30 [Success]
End create task, 2023-0X-XX 23:30:31. Did not backup snapshot VM's count: 1
删除快照的日志
### cd /vmfs/volumes/datastore1/crontabs
[root@VM01:/vmfs/volumes/<datastore1-UUID>/crontabs] tail schedule_delete_snap.log
2023-0X-XX 04:00:00 Start delete task. Number of days to retain snapshots: 2
Date:2023-0X-XX VMID:10 vname: VM-01 AutoRemoveTime:2023-0X-XX 04:10:00 [Success]
End delete task, 2023-0X-XX 04:10:00. Complete remove snapshot ALL VM but retain 2 days snapshots.