ESXi 定时快照与自动清理:脚本化运维实战

张开发
2026/4/17 13:25:17 15 分钟阅读

分享文章

ESXi 定时快照与自动清理:脚本化运维实战
1. 为什么需要自动化快照管理在虚拟化环境中快照就像给虚拟机拍了一张照片能够完整记录某个时间点的系统状态。想象一下当你在测试新软件或者进行系统升级时突然发现出了问题这时候如果能一键恢复到之前的稳定状态是不是特别方便这就是快照的核心价值。但现实情况往往更复杂。我遇到过不少企业他们虽然知道快照的重要性但管理方式却很原始要么是运维人员手动创建快照经常忘记执行要么是快照数量失控占用大量存储空间。最糟糕的情况是当真正需要恢复时发现最近的快照已经是两周前的了。自动化快照管理能解决这些问题定时执行不用再担心忘记创建快照智能清理自动删除老旧快照避免存储空间被占满统一标准所有虚拟机采用相同的快照策略减少人为错误避免手动操作可能带来的失误2. 环境准备与脚本部署2.1 选择合适的存储位置ESXi有个特点你可能不知道重启后会自动清理/vmfs/volumes以外的目录。这意味着如果你把脚本放在错误的位置重启后就找不到了。我吃过这个亏所以特别提醒你所有脚本必须放在数据存储目录下。具体操作步骤cd /vmfs/volumes/datastore1 mkdir crontabs cd crontabs这里有个小技巧使用datastore1是最常见的但你的环境可能不同。如果不确定可以用ls /vmfs/volumes/命令查看可用的数据存储。2.2 创建快照脚本新建snapshot_creat.sh文件内容如下#!/bin/sh #auto create ESXi snapshots for i in vim-cmd vmsvc/getallvms | grep -v nosnap | awk {print $1} | grep -e [0-9] do vname$(vim-cmd vmsvc/get.summary $i | grep name | awk { print $3 } | cut -d \ -f 2) vim-cmd vmsvc/snapshot.create $i $(date %F) sleep 30s if [ $? -eq 0 ];then echo $(date %F %T) : $vname snapshot create success.. ./schedule_snap.log else echo $(date %F %T) : $vname snapshot create FAILED.. ./schedule_snap.log fi done这个脚本有几个关键点使用grep -v nosnap过滤掉备注中包含nosnap的虚拟机快照名称使用当前日期date %F每次操作后等待30秒避免对系统造成太大压力记录详细日志方便排查问题3. 智能清理老旧快照3.1 删除快照脚本创建snapshot_del.sh文件#!/bin/sh DAY3 #保留快照的数量 for i in vim-cmd vmsvc/getallvms | awk {print $1} | grep -e [0-9] do SNAPSHOT_COUNTvim-cmd vmsvc/snapshot.get $i | egrep -- --\|-CHILD|^\|-ROOT | wc -l if [ $SNAPSHOT_COUNT -gt $DAY ]; then DELETE_COUNT$(($SNAPSHOT_COUNT-$DAY)) OLD_SNAPSHOT_IDvim-cmd vmsvc/snapshot.get $i | grep Id | head -$DELETE_COUNT | awk -F: {print $2} for n in $OLD_SNAPSHOT_ID do vim-cmd vmsvc/snapshot.remove $i $n /dev/null sleep 30s done fi done这个脚本的逻辑很巧妙设置DAY3表示保留最近3个快照先统计每个虚拟机的快照总数如果超过保留数量计算需要删除的数量按创建时间从早到晚删除多余的快照3.2 设置文件权限别忘了给脚本执行权限chmod -R 755 crontabs我曾经遇到过脚本无法执行的问题排查了半天才发现是权限设置不对。所以这一步虽然简单但非常重要。4. 配置定时任务4.1 修改rc.local文件ESXi的定时任务配置有点特殊需要通过rc.local来设置vi /etc/rc.local.d/local.sh在文件末尾添加以下内容注意替换路径kill $(cat /var/run/crond.pid) /bin/echo 0 1 * * 2,4 sh /vmfs/volumes/datastore1/crontabs/snapshot_creat.sh /var/spool/cron/crontabs/root /bin/echo 30 2 * * 2,4 sh /vmfs/volumes/datastore1/crontabs/snapshot_del.sh /var/spool/cron/crontabs/root crond这里有几个关键点需要注意每周二、周四凌晨1点创建快照每周二、周四凌晨2:30清理老旧快照路径必须使用绝对路径4.2 定时任务语法说明很多人对cron表达式不太理解这里详细解释下0 1 * * 2,4每周二和周四的1:00 AM30 2 * * 2,4每周二和周四的2:30 AM五个星号分别代表分钟 小时 日 月 星期如果你想改成每天执行可以改成0 1 * * *每天1:00 AM。5. 常见问题排查5.1 脚本不执行怎么办如果发现脚本没有按预期执行可以按以下步骤排查检查脚本权限ls -l /vmfs/volumes/datastore1/crontabs/查看cron日志cat /var/log/cron手动执行脚本测试sh /vmfs/volumes/datastore1/crontabs/snapshot_creat.sh检查路径是否正确ESXi重启后路径可能会变5.2 快照创建失败的可能原因根据我的经验快照创建失败通常有这些原因虚拟机正在备份或迁移存储空间不足虚拟机处于特殊状态如挂起快照数量已达到上限通常每个虚拟机最多32个5.3 如何临时禁用自动快照有时候你可能需要临时禁用自动快照有两种方法在虚拟机备注中添加nosnap注释掉cron任务行在行首加#6. 进阶优化建议6.1 按虚拟机类型设置不同策略生产环境和测试环境的虚拟机可能需要不同的快照策略。你可以修改脚本实现生产环境每天快照保留7天测试环境每周快照保留2个实现方法是给虚拟机添加不同的备注标签然后在脚本中根据标签应用不同的策略。6.2 添加邮件通知功能如果你想及时知道快照任务执行情况可以添加邮件通知# 在脚本成功/失败部分添加 echo 快照任务完成 | mail -s ESXi快照报告 adminexample.com当然这需要先配置好ESXi的邮件发送功能。6.3 监控快照存储空间快照会占用大量存储空间建议定期检查df -h vim-cmd vmsvc/getallvms | awk {print $1} | xargs -I {} vim-cmd vmsvc/snapshot.get {} | grep File Size可以设置一个定期任务当存储空间低于某个阈值时自动清理更多老旧快照。

更多文章