virsh save vm_name memdump
然后virsh restore memdump
恢复正在运行的 VM。
但是,虚拟机在 之后关闭virsh save
。我正在为 KVM 虚拟机编写“实时”备份和恢复脚本,因此在备份部分,我显然需要在备份后运行虚拟机。virsh restore memdump
备份后立即执行此操作没有问题,但我觉得这基本上是不必要的 - 我“应该”能够暂停虚拟机,将其内存保存到文件中,然后简单地恢复/取消暂停虚拟机。
对于内存较少的虚拟机来说,这并不是什么问题,但如果虚拟机具有相当大的工作内存,则会不必要地延长备份时间。
virsh suspend
不幸的是,即使我先这样做,虚拟机也会在之前被关闭virsh save
。
有没有办法做到这一点?(即暂停,保存,取消暂停)
答案1
首先,我完全同意@dyasny,很难找到“完整 VM 状态(又名带有内存)”的合理用例。
但是,如果你真的想要'virsh save vm_name memdump'而不破坏虚拟机,你可以尝试
virsh snapshot-create-as ${domain} ${fake_snap} 'save vm while keep running' \
--no-metadata --atomic --live \
--memspec ${path_to_mem_dump_file},snapshot=external
祝你好运 :)
======== 正在更新:(太长,无法回复) ===============
哦,也许这是我的冗长之处,“完整 VM 状态”==mem_state + disk_state,而“mem_state”==“vm 物理内存”+“vm cpu 寄存器”+“虚拟机管理程序中的 vm 设备状态”。
因此,'virsh save' 和 'virsh store' 是安全的,因为没有什么可丢失的,'保存/恢复'就像'笔记本电脑睡眠'一样,通常你会在'恢复'虚拟机后让你的应用程序继续运行。
如果“mem_state”和“disk_state”不同步,那将是一场灾难,这就是为什么“virsh save”在“save mem”之后强制执行“destroy”。
我的“virsh save without destroy”实际上是“完整 VM 备份”,disk_snapshot 隐藏在原始 qcow2 中。所以你只看到一个“mem_state”。:)
答案2
如果虚拟机有大量内存,则保存它无论如何都意味着花费大量时间来保存内存状态。
如果没有硬性要求备份完整的虚拟机状态(因为通常它是冗余的,由于时间差异,恢复时会遇到错误,甚至可能导致崩溃)。
通常情况下,虚拟机的备份如下:
- 停止虚拟机的文件系统
- 对虚拟机磁盘进行实时快照
- 备份磁盘和虚拟机的配置(
virsh dumpxml VM
) - 实时合并磁盘,使快照消失
现在,kvm 唯一可能有点棘手的部分是最后一部分。blockpull
大多数当前发行版都支持使用它,但这不会将快照合并到基本映像中,它会执行相反的操作 - 将数据从基本映像拉入快照,这样您就可以删除基本映像。更好的命令是blockcommit
,它会将快照中更改的位推送到基本映像中,但是,它仅在非常前沿的发行版中可用。我希望它能进入 RHEL 7.1,我们拭目以待