KVM虚拟机快照定时自动备份脚本

KVM 虚拟机快照定时自动备份脚本的核心思路很简单:用 virsh snapshot-create-as 创建磁盘快照,再用 cron 定时执行,配合保留策略自动删除旧快照。
适合单机 KVM 或小规模虚拟化环境,零基础也能按下面步骤落地,最终得到一套无人值守、可验证的备份机制。

先确认环境和依赖

在宿主机上操作,登录后检查 KVM 工具是否齐全:

virsh list --all
qemu-img --version

能列出虚拟机且版本正常,说明 libvirt 和 qemu-img 已就绪。
如果提示找不到命令,按系统类型安装:

# Debian/Ubuntu
apt install libvirt-clients qemu-utils -y
# CentOS/RHEL
 yum install libvirt-client qemu-img -y

接着确认虚拟机磁盘格式。
快照对 qcow2 支持最好,raw 格式无法直接创建内部快照:

virsh domblklist 你的虚拟机名
qemu-img info /var/lib/libvirt/images/你的磁盘.qcow2

如果输出 file format: raw,需要先转换或改用外部快照方案,否则脚本会报错。

编写快照备份脚本

创建脚本目录并写入内容:

mkdir -p /opt/kvm-backup
vim /opt/kvm-backup/snapshot.sh

脚本内容如下,按需修改虚拟机名和保留数量:

#!/bin/bash
VM_NAME="web01"
SNAP_PREFIX="auto"
KEEP=7
DATE=$(date +%Y%m%d-%H%M%S)
SNAP_NAME="${SNAP_PREFIX}-${DATE}"
LOG="/var/log/kvm-snapshot.log"

echo "[$(date '+%F %T')] 开始为 ${VM_NAME} 创建快照 ${SNAP_NAME}" >> $LOG

virsh snapshot-create-as $VM_NAME $SNAP_NAME \
  --description "auto backup ${DATE}" >> $LOG 2>&1

if [ $? -ne 0 ]; then
  echo "[$(date '+%F %T')] 快照创建失败" >> $LOG
  exit 1
fi

echo "[$(date '+%F %T')] 快照创建成功,开始清理旧快照" >> $LOG

# 获取该虚拟机所有 auto 开头的快照名
SNAPS=$(virsh snapshot-list $VM_NAME --name | grep "^${SNAP_PREFIX}-" | sort)
COUNT=$(echo "$SNAPS" | grep -c .)

if [ "$COUNT" -gt "$KEEP" ]; then
  DEL_COUNT=$((COUNT - KEEP))
  echo "$SNAPS" | head -n $DEL_COUNT | while read s; do
    virsh snapshot-delete $VM_NAME $s >> $LOG 2>&1
    echo "[$(date '+%F %T')] 已删除旧快照 $s" >> $LOG
  done
fi

echo "[$(date '+%F %T')] 任务结束" >> $LOG

赋权并手动跑一次验证:

chmod +x /opt/kvm-backup/snapshot.sh
/opt/kvm-backup/snapshot.sh
virsh snapshot-list web01

列表里出现 auto- 开头的快照,说明脚本可正常执行。

配置 cron 定时执行

用 root 身份编辑计划任务:

crontab -e

加入一行,表示每天凌晨 2 点执行:

0 2 * * * /opt/kvm-backup/snapshot.sh >/dev/null 2>&1

保存后确认任务已写入:

crontab -l

到这里,KVM 虚拟机快照定时自动备份脚本已经具备无人值守能力。
建议至少观察两天,通过日志确认执行时间和结果。

避坑与常见报错

磁盘格式不支持:raw 格式创建内部快照会失败,需转为 qcow2 或使用外部快照。

快照链过长:内部快照叠加过多会拖慢磁盘性能,保留数量不宜过大,KEEP=7 是较稳妥的起点。

虚拟机运行中创建失败:部分旧版本 libvirt 对运行中虚机快照支持有限,可先检查 virsh version 并参考官方文档。

cron 不执行:确认脚本使用绝对路径,且 crontab 由 root 编辑;
查看 /var/log/kvm-snapshot.log 是否有新记录。

验证备份是否真正生效

不要只看脚本没报错,要实际核对:

virsh snapshot-list web01 --tree
virsh snapshot-info web01 auto-20250101-020000
ls -lh /var/lib/libvirt/images/

snapshot-list 能看到快照、snapshot-info 能显示状态为 running 或 shutoff,才算创建成功。
再结合日志中每次的起止时间,确认 cron 按预期触发。

需要恢复时,用 virsh snapshot-revert web01 快照名 即可回滚到指定时间点。
恢复前建议先关闭或暂停虚拟机,避免数据不一致。

几个常见疑问

快照能替代完整备份吗? 不能。
快照依赖原磁盘文件,磁盘损坏时快照也可能丢失,重要数据仍需异地或独立存储备份。

KEEP 设置多少合适? 根据磁盘空间和恢复窗口决定,通常 3 到 7 个足够覆盖近期误操作,数量越多占用越大。

能否对多台虚拟机批量执行? 可以把 VM_NAME 改成数组循环,或写多个 crontab 条目调用同一脚本并传入参数。

整体来看,这套 KVM 虚拟机快照定时自动备份脚本的价值在于流程固定、结果可查:脚本负责创建和清理,cron 负责触发,日志和 virsh 命令负责验证。
先在小规模环境跑通,再逐步扩展到更多虚拟机。

分享到:
上一篇
Docker网络模式详解,bridge host
下一篇
Zabbix邮件告警配置,服务器故障推送通知
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意