首页 / 资讯动态 / centos运维之KVM虚拟机快照备份与还原

centos运维之KVM虚拟机快照备份与还原

在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虚拟机的快照备份还原就完全拿捏了。日常运维中养成定期快照的习惯,出了问题几分钟就能回滚,比重装系统快太多。