KVM虚拟机备份的核心操作就两条:一是用virsh命令导出配置,二是直接拷贝镜像文件或拍快照,对新手来说最稳妥的方案是离线冷备加定期快照。
很多刚接触Linux虚拟化的朋友,一听到备份就头大,担心命令行复杂,怕把数据搞坏,其实KVM的备份逻辑比你想的简单得多,它不像VMware那样有全家桶式的管理套件,但开源的好处就是灵活,方法得当,可靠性完全不输商业方案。
kvm虚拟机备份命令怎么用
备份KVM虚拟机,本质上就是管好两样东西:虚拟机的配置描述文件和虚拟磁盘镜像文件,前者告诉宿主机这台虚拟机长什么样,后者装着你的系统和所有数据,两者缺一不可。
第一步:了解你手上的虚拟机状态
动手之前,先搞清楚家底,在宿主机上执行下面这条命令,看看当前有哪几台虚拟机在跑:
virsh list --all
输出的表格里,你会看到虚拟机名称和状态,State这一列写着running的,就是正在运行的机器,想备份正在运行的机器,建议先看下一部分关于快照的内容,先把机器关机再备份是最保险的。
第二步:备份关键的配置文件
每台虚拟机都有一个XML格式的配置文件,记录着CPU核数、内存大小、网卡设置、磁盘路径等所有参数,用下面这条命令导出:
virsh dumpxml 虚拟机名称 > /backup/虚拟机名称.xml
比如你的虚拟机叫ubuntu-server,那就执行:
virsh dumpxml ubuntu-server > /backup/ubuntu-server.xml
这个文件非常小,才几KB,但没了它,你的镜像文件就成了无主之物,没法直接导入,所以这一步千万别跳过。
第三步:定位镜像文件并拷贝
配置文件里已经写明了镜像文件的位置,用vim或cat打开刚才导出的那个XML文件,找到<source file='/var/lib/libvirt/images/ubuntu-server.qcow2'/>这一行,路径就清楚了。
确认了路径之后,下一步就是拷贝文件。拷贝之前要先关停虚拟机,否则文件数据不一致,备份出来也白搭。

virsh shutdown 虚拟机名称
等虚拟机完全停止后,执行拷贝:
cp /var/lib/libvirt/images/ubuntu-server.qcow2 /backup/ubuntu-server.qcow2
拷贝完成后,重新启动虚拟机:
virsh start 虚拟机名称
这套操作下来,你的备份目录里就有了一份镜像文件加一份配置文件,复原的时候直接把这两样搞回去就行。
kvm增量备份方案怎么选
上面说的冷备方案,相当于给虚拟机做一次全量快照,适合数据量不大或者备份频率不高的场景,如果虚拟机几十GB甚至上百GB,每次都整个拷贝,既费时间又占硬盘,这时就需要增量备份。
方案A:基于qcow2格式的特性做链接克隆备份
qcow2是KVM默认的镜像格式,它支持一个叫Backing File的特性,简单说,你可以基于一个原始镜像,创建一个新的覆盖层,新数据都写在覆盖层里,原始镜像不变,这样每次备份,只需要拷贝新的覆盖层。
创建覆盖层的命令如下:
qemu-img create -f qcow2 -b /var/lib/libvirt/images/ubuntu-server.qcow2 /backup/ubuntu-server-overlay.qcow2
需要恢复时,用虚拟机管理界面配置新镜像指向overlay文件即可,这种方式的好处是快,缺点是如果原始镜像损坏,所有增量都废了,所以原始镜像本身还是要定期做全量备份。
方案B:使用virt-clone做独立副本
行业共识认为,用virt-clone不仅可以克隆虚拟机,还能自动处理网络MAC地址和主机名的冲突,比手动拷贝省心得多,用它创建出来的新虚拟机与旧虚拟机完全隔离,适合需要交付测试环境或迁移的场景。
virt-clone --original 虚拟机名称 --name 备份机名称 --file /backup/备份机名称.qcow2
这个命令会在宿主机上注册一个新的虚拟机,但如果你只是想要一份备份文件,并不想真的注册,可以加上--auto-clone配合--print-xml参数,把生成的XML输出而不实际注册。
方案C:用rsync做轻量级同步备份

如果虚拟机停机能接受,但拷贝时间过长,可以先用rsync做一次全量同步,后续每次只同步变化的数据块,比较适合有周期性备份需求的场景。
rsync -avP /var/lib/libvirt/images/ubuntu-server.qcow2 /backup/ubuntu-server.qcow2
配合cron定时任务,能实现每天凌晨自动同步一次,不过这需要你对Linux的定时任务比较熟悉,新手建议先从手动操作做起,跑顺了再玩自动化。
使用快照功能备份正在运行的虚拟机
很多新手不敢动生产环境,因为没法说关机就关机,这种情况下,可以用virsh的快照功能,让机器在不中断服务的情况下完成备份。
创建快照的命令是:
virsh snapshot-create-as 虚拟机名称 快照名称 --disk-only
加上--disk-only参数,表示只对磁盘做快照,不冻结内存状态,这样虚拟机短暂停顿一下(大概几百毫秒),随后就恢复正常运行了,快照文件会以新镜像的形式放在镜像目录下,你也可以把它拷贝到别处作为备份。
查看快照列表:
virsh snapshot-list 虚拟机名称
恢复快照:
virsh snapshot-revert 虚拟机名称 快照名称
需要留意的是,快照文件的体积会随着虚拟机持续运行而不断增长,因为它记录了从快照点以来的所有磁盘变化。快照不宜保留太久,建议在确认备份文件OK之后,尽快删除快照并合并数据。
virsh snapshot-delete 虚拟机名称 快照名称 --metadata
备份数据如何验证和恢复
备份做完了,如果不能恢复,等于白做,业内专家指出,一份没有经过恢复演练的备份数据,可靠性基本等同于零,所以备份流程的最后一步,一定要做恢复测试。
快速验证备份文件完整性
用qemu-img命令检查镜像文件有没有损坏:
qemu-img check /backup/ubuntu-server.qcow2
如果输出No errors were found,说明文件结构没问题,但这并不代表里面的操作系统和数据都完整,所以最可靠的验证方式还是实际启动一次。

在宿主机上注册并启动备份镜像
把备份的XML和qcow2文件放回到标准目录,重新定义虚拟机:
virsh define /backup/ubuntu-server.xml virsh start ubuntu-server
启动成功、能正常登录系统、看关键服务都跑起来了,这个备份才算真正合格,如果你有多余的宿主机,建议在另一台机器上做验证,还能顺带测试跨机器迁移的兼容性。
kvm虚拟机迁移到另一台机器
备份的另一层价值就是迁移,把XML文件和qcow2镜像打包传到新宿主机上,用同样的方式virsh define导入即可,只要两台机器都是KVM环境,版本差异不太大,基本能做到无缝迁移。
常见备份场景问答
虚拟机开机状态可以直接拷贝镜像文件吗
不建议,直接拷贝运行中的qcow2文件,得到的是一个时间点不一致的数据快照,内部文件系统可能处于写入中的状态,恢复到新机器上很容易出现数据损坏或引导失败,如果必须在线备份,请使用快照功能或qemu-agent配合的持久化快照方案。
没有界面怎么确定自己的虚拟磁盘是什么格式
执行qemu-img info /var/lib/libvirt/images/虚拟机名称.qcow2,输出信息里会明确告诉你file format是qcow2还是raw,raw格式磁盘不能做差量备份,每次只能全量拷贝,类型转换可以用qemu-img convert -p -f raw -O qcow2 原文件 目标文件.qcow2。
备份文件越来越大有办法清理吗
可以通过qemu-guest-agent在客户机内协调文件系统冻结,也可以定期对qcow2文件做qemu-img convert重新压缩,释放空闲空间,如果你每月都做一次全量备份,旧备份建议滚动保留最近三份,更早的可以删除或归档到离线存储。
备份这事儿看着简单,但出问题往往就出在“以为备份过了”上面,你应该现在就登录宿主机执行一次上面的冷备命令练练手,把配置文件导出来看一眼再决定下一步,虚拟化世界里,没有经过验证的备份,等于没有备份。