使用vim-cmd工具给ESXi虚机定期打快照

VMware虚拟化 - 建设篇


系列文章回顾

第一章 部署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

前提条件

  1. 使用vim-cmd工具给ESXi虚拟机打快照的前提是 虚拟机所在的数据存储datastore必须有闲置容量,因为打快照的原理是锁定当前虚机的所有存储容量,当产生新的数据时就开始占用datastore的闲置容量了。
  2. 根据虚机的实际使用量来计算,至少冗余10%以上的datasotre闲置容量,保证datastore存储有可用容量。


ESXi新增执行快照备份的sh脚本

sh脚本存放在datastore数据存储内,即/vmfs/volumes/datastore目录,sh脚本引用目录时使用UUID真实链接
如下案例将<datastore1-UUID>替换成datastoreUUID真实链接

1

### 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后台管理给虚机添加自定义属性方法如下。
2
3
4



(附加)虚拟机自定义属性结合sh脚本实现自定义操作

ESXi的虚机可以设置键值对形式的自定义属性,可以新增特定属性再结合sh脚本实现自定义操作,举例如下:

  1. 全局默认所有虚机的快照总数是n,可设置部分虚机的快照总数是m (m<n),如一些业务读写较大的虚机的快照总数不宜过多。该虚机添加CustomAuto.SnapLen键,值设置m,sh脚本添加条件判断,实现部分虚机仅保留m份快照。


验证定期创建快照和删除快照

1
创建快照的日志

### 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.


参考链接

  1. esxi 自动给虚拟机打快照(定时快照任务)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

歪果仨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值