我的理解是,当我运行此命令来创建正在运行的域的快照时:
virsh snapshot-create-as myvm snapshot1
不仅每个磁盘映像文件中都创建了内部快照,而且 RAM 状态也保存在某个地方。因此,如果我稍后恢复到该快照,RAM 中的所有内容都将恢复到创建快照时的状态。
我看到了 qcow2 磁盘映像中列出的快照,也看到了为描述快照和域配置而创建的 XML 文件,但是RAM 的实际内容存储在哪里? 它是“永久的”吗?所以如果我重新启动主机,例如,如果我选择恢复到该快照,域的已保存的 RAM 状态仍然可用?
答案1
qcow2 格式确实提供了永恒的虚拟机内存的内部存储。对正在运行的 qcow2 支持的虚拟机进行快照时,其 RAM 状态将转储到用于存储的同一个 qcow2 文件中。
Each snapshot is described by a header:
typedef struct QCowSnapshotHeader {
/* header is 8 byte aligned */
uint64_t l1_table_offset;
uint32_t l1_size;
uint16_t id_str_size;
uint16_t name_size;
uint32_t date_sec;
uint32_t date_nsec;
uint64_t vm_clock_nsec;
uint32_t vm_state_size;
uint32_t extra_data_size; /* for extension */
/* extra data follows */
/* id_str follows */
/* name follows */
} QCowSnapshotHeader;
进一步解释道:
vm_state_size
给出作为此快照的一部分保存的虚拟机状态的大小。状态保存到原始 L1 表的位置,紧接着镜像头。
另一方面,当拍摄原始图像文件快照时(即不使用 qcow2)会发生什么?Libvirt 将这类快照称为外部快照(与内部快照qcow2 文件),因为会生成一个新的 qcow2 文件并将其链接到原始(现在是只读的)原始文件。然后,Libvirt 将虚拟机状态(即其 RAM 内容)保存在特定文件中,通常在 的子目录中/var/lib/libvirt/
。最后会创建一个元数据 XML 文件,以将转储文件“粘合”到覆盖文件中保存的磁盘状态。
Libvirt 对外部快照的支持不是很强大;例如(如果最近情况没有发生变化),您可以使用单个命令创建外部快照,但需要多个复杂命令来删除/恢复它。同时,对于生产工作负载,RedHat 官方建议使用外部快照,因为它们比一长串内部快照更强大、更快(他们出售的 RHEV 隐藏了外部快照的复杂性)。