在CentOS上用KVM跑虚拟机,快照备份和还原是最基础也最关键的运维操作。简单说,快照就是给虚拟机拍一张"照片",记录某一时刻的磁盘状态和内存状态,出了问题可以一键回滚。KVM自带的virsh命令和qemu-img工具就能搞定,不需要额外装什么商业软件。下面我把整个流程、命令、注意事项全部讲透,从创建快照到还原到删除,一步不落。
一、KVM快照到底是什么,和普通备份有啥区别
很多人把快照和备份混为一谈,其实不一样。快照是基于虚拟机当前磁盘镜像的一个增量记录点,它不是完整复制一份数据,而是记录"从这个点之后改了什么"。好处是创建快、占空间小;坏处是如果原始镜像文件损坏了,快照也跟着完蛋。所以真正的生产环境,快照要配合完整的镜像备份一起用。
KVM的快照分两种:内部快照和外部快照。内部快照是用virsh snapshot-create命令创建的,元数据存在虚拟机的磁盘镜像里;外部快照是用qemu-img命令在镜像文件外部创建的,独立性更强,推荐生产环境优先使用外部快照。
二、动手之前的准备工作
先确认你的CentOS系统已经装好了KVM和相关工具包。检查命令如下:
yum install -y qemu-kvm libvirt virt-manager virt-install systemctl start libvirtd systemctl enable libvirtd
确认libvirt服务正常运行:
systemctl status libvirtd
查看当前有哪些虚拟机在跑:
virsh list --all
假设你的虚拟机名字叫"centos7-vm",下面所有操作都以这个名字为例。在做快照之前,强烈建议先把虚拟机里的数据刷盘同步一下,避免快照记录到不一致的数据。在虚拟机内部执行:
sync
三、用virsh创建内部快照(最常用的方式)
内部快照创建非常简单,一条命令搞定:
virsh snapshot-create-as --domain centos7-vm --name "snap-20240101" --description "系统升级前备份"
这条命令会给centos7-vm创建一个名叫"snap-20240101"的快照,并附带描述信息。创建完之后查看快照列表:
virsh snapshot-list --domain centos7-vm
输出大概是这样的:
Name Creation Time State ------------------------------------------------------------ snap-20240101 2024-01-01 10:00:00 running
State显示running说明虚拟机还在运行状态下拍的快照,这是正常的。KVM支持在线快照,不需要关机。
四、用qemu-img创建外部快照(生产环境推荐)
外部快照的好处是快照文件独立存放,不依赖虚拟机配置,还原和管理更灵活。先找到虚拟机的磁盘镜像文件路径:
virsh domblklist centos7-vm
假设输出显示磁盘文件在/var/lib/libvirt/images/centos7-vm.qcow2,那就用qemu-img创建外部快照:
qemu-img snapshot -c "snap-20240101-ext" /var/lib/libvirt/images/centos7-vm.qcow2
查看外部快照列表:
qemu-img snapshot -l /var/lib/libvirt/images/centos7-vm.qcow2
输出示例:
Snapshot list: ID TAG VM SIZE DATE VM CLOCK 1 snap-20240101-ext 0 2024-01-01 10:00:00.000
五、快照还原操作详解
还原分两种情况:还原到快照状态,或者删除快照之后磁盘自动合并回去。先说还原。
内部快照还原:
virsh snapshot-revert --domain centos7-vm --snapshotname "snap-20240101"
注意,这条命令会让虚拟机重启,因为磁盘状态要回退到快照那一刻。如果虚拟机正在跑业务,建议先迁移或者在维护窗口操作。
外部快照还原:
qemu-img snapshot -a "snap-20240101-ext" /var/lib/libvirt/images/centos7-vm.qcow2
这条命令会把磁盘回滚到外部快照的状态。还原之后需要重启虚拟机才能生效:
virsh reboot centos7-vm
六、快照删除和磁盘合并
快照用完了要删,不然会越积越多占用空间。内部快照删除:
virsh snapshot-delete --domain centos7-vm --snapshotname "snap-20240101"
删除内部快照之后,增量数据会自动合并回原始镜像,不需要额外操作。但如果是外部快照,删除方式不一样:
qemu-img snapshot -d "snap-20240101-ext" /var/lib/libvirt/images/centos7-vm.qcow2
外部快照删除后,增量数据同样会合并。如果你想手动合并而不是删除快照,可以用:
qemu-img commit /var/lib/libvirt/images/centos7-vm.qcow2
这条命令会把当前所有快照的增量数据写入基础镜像,然后快照自动消失。
七、完整的镜像备份方案(快照+全量备份结合)
前面说了,快照不能替代完整备份。生产环境建议定期做全量镜像备份,快照只是短期保险。完整备份命令:
cp /var/lib/libvirt/images/centos7-vm.qcow2 /backup/centos7-vm-full-$(date +%Y%m%d).qcow2
或者用qemu-img转换格式做备份,这样还能压缩:
qemu-img convert -c -f qcow2 -O qcow2 /var/lib/libvirt/images/centos7-vm.qcow2 /backup/centos7-vm-backup.qcow2
其中-c参数表示压缩,-O指定输出格式。这样备份出来的文件比原文件小不少,节省存储空间。
八、自动化脚本:定时快照+备份
手动操作容易忘,写个脚本放crontab里定时跑最靠谱。创建脚本文件:
vim /opt/kvm-snapshot.sh
脚本内容:
#!/bin/bash
VM_NAME="centos7-vm"
IMG_PATH="/var/lib/libvirt/images/${VM_NAME}.qcow2"
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M)
# 创建外部快照
qemu-img snapshot -c "auto-${DATE}" ${IMG_PATH}
# 全量备份
cp ${IMG_PATH} ${BACKUP_DIR}/${VM_NAME}-${DATE}.qcow2
# 删除超过7天的快照
qemu-img snapshot -l ${IMG_PATH} | grep "auto-" | awk '{print $1}' | while read id; do
SNAP_DATE=$(qemu-img snapshot -l ${IMG_PATH} | grep $id | awk '{print $2}')
if [ ! -z "$SNAP_DATE" ]; then
SNAP_DAYS=$(echo $SNAP_DATE | sed 's/auto-//' | cut -d_ -f1)
CURRENT=$(date +%Y%m%d)
DIFF=$(( (CURRENT - SNAP_DAYS) ))
if [ $DIFF -gt 7 ]; then
qemu-img snapshot -d $id ${IMG_PATH}
fi
fi
done
# 删除超过30天的备份文件
find ${BACKUP_DIR} -name "${VM_NAME}-*.qcow2" -mtime +30 -exec rm -f {} \;
echo "Snapshot and backup completed: ${DATE}" >> /var/log/kvm-snapshot.log给脚本执行权限并加入定时任务:
chmod +x /opt/kvm-snapshot.sh crontab -e
添加一行,每天凌晨2点执行:
0 2 * * * /opt/kvm-snapshot.sh
九、常见坑和注意事项
第一,快照文件会持续增长。每次虚拟机写入数据,快照里的增量就变大。长期不清理,快照文件可能比原始镜像还大,甚至把磁盘撑满。所以一定要设清理策略。
第二,不要在快照状态下做虚拟机迁移。virsh migrate对有快照的虚拟机支持有限,建议先还原或者删除快照再迁移。
第三,qcow2格式才支持快照,raw格式不行。如果你的虚拟机用的是raw镜像,需要先转换:
qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/centos7-vm.raw /var/lib/libvirt/images/centos7-vm.qcow2
第四,快照还原后IP地址、主机名这些不会变,但如果你是因为系统崩溃还原的,记得检查网络配置和服务状态是否正常。
第五,生产环境强烈建议快照和异地备份结合。本地快照防误操作,异地备份防硬件故障。可以用rsync把备份文件同步到另一台服务器:
rsync -avz /backup/ root@backup-server:/remote-backup/
十、总结一下核心操作命令速查
创建内部快照:virsh snapshot-create-as --domain 虚拟机名 --name 快照名
查看快照:virsh snapshot-list --domain 虚拟机名
还原快照:virsh snapshot-revert --domain 虚拟机名 --snapshotname 快照名
删除快照:virsh snapshot-delete --domain 虚拟机名 --snapshotname 快照名
创建外部快照:qemu-img snapshot -c 快照名 镜像路径
查看外部快照:qemu-img snapshot -l 镜像路径
还原外部快照:qemu-img snapshot -a 快照名 镜像路径
删除外部快照:qemu-img snapshot -d 快照名 镜像路径
合并快照:qemu-img commit 镜像路径
完整备份:qemu-img convert -c -f qcow2 -O qcow2 源镜像 备份路径
把这些命令记熟,CentOS上KVM虚拟机的快照备份还原就完全拿捏了。日常运维中养成定期快照的习惯,出了问题几分钟就能回滚,比重装系统快太多。
