我想要一种在运行时备份 qcow2 文件的 KVM VPS 的可靠方法。经过长时间的搜索,我发现我们可以使用同步用于实时备份。我使用以下命令进行 rsync:
rsync -avh /vms/base.qcow2 /backup/backup.qcow2
它工作正常。但我担心如果在 VPS 因写入和删除操作(如安装新软件或更新)而发生变化时进行备份,它可能会损坏备份 qcow2 映像。
因此,从实时 VPS 的快照进行备份似乎是更有趣的选择。
我使用以下命令来备份正在运行的 VPS:
1.创建快照:
qemu-img create -f qcow2 -b base.qcow2 snapshot.qcow2
2.将快照转换为原始图像格式(.img):
qemu-img convert -O raw snapshot.qcow2 /backup/backup.img
要恢复 VPS:
3.将原始图像转换为qcow2图像:
qemu-img convert -O qcow2 /backup/backup.img base.qcow2
然后我们就可以通过virsh create base.xml
命令启动VPS了。
尽管这种方法也非常有效,但我仍然不确定这是否是备份正在运行的 VPS 的正确方法。我在 qemu-img 命令上找到了很好的文档这里和这里。但他们没有提及任何有关将实时 VPS 快照转换为原始图像的内容。
哪种方法更适合实时 VPS 备份?将快照转换为原始图像是否安全?
如果我能获得关于快照和基础文件在特定条件下如何运行的详细文档,那将非常有帮助。
也许我们还可以将基本 qcow2 映像转换为原始备份文件,而不是转换快照。因此命令流程将是:
1. 创建快照
2. 将基本 qcow2 转换为备份原始映像
3. 将快照更改提交到基本映像
4. 删除快照
我试过这个,它在 5GB 的小型 VPS 上运行良好。但是当 VPS 大小很大时,是否存在出现错误或 VPS 损坏的可能性?
提前致谢...
答案1
virsh domfsfreeze
您唯一缺少的是在拍摄快照之前让客户文件系统静止,以确保其一致性。如果您使用 libvirtd,则可以完成此操作。
例如,操作顺序为:
# Freeze guest filesystems
virsh domfsfreeze $VM_NAME
# Create snapshot
qemu-img create -f qcow2 -b $VM_NAME.qcow2 snapshot.qcow2
# Thaw guest filesystems
virsh domfsthaw $VM_NAME
# Take backup from snapshot
qemu-img convert -O raw snapshot.qcow2 /backup/backup.img
请注意,这需要qemu-guest-agent
在虚拟机中安装并运行。根据发行版和安装选择,情况可能如此,也可能不如此。
它qemu-guest-agent
也具有可扩展性;您可以向其中添加脚本以支持特定软件。例如,它包含一个示例脚本,用于使 MySQL 处于一致状态。
答案2
还有另一种方法,即在备份期间创建临时快照,然后将其提交回来。
# Create a temporary backup snapshot which records changes during backup
virsh snapshot-create-as vm backup-tmp --disk-only --atomic --quiesce --no-metadata --diskspec sda,file=/tmp/sda_temp.qcow2
# Now the main image is frozen and the changes are going into /tmp/sda_temp.qcow2
# Do your backup here
...
# Now we commit back data from temp snapshot into the main image
virsh blockcommit vm sda --active --pivot
# Remove the temporary snapshot file
rm /tmp/sda_temp.qcow2
更多信息请参阅: https://wiki.libvirt.org/page/Live-disk-backup-with-active-blockcommit