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 命令负责验证。
先在小规模环境跑通,再逐步扩展到更多虚拟机。