libvirt 将 RAM 快照存储在哪里?

libvirt 将 RAM 快照存储在哪里?

我的理解是,当我运行此命令来创建正在运行的域的快照时:

virsh snapshot-create-as myvm snapshot1

不仅每个磁盘映像文件中都创建了内部快照,而且 RAM 状态也保存在某个地方。因此,如果我稍后恢复到该快照,RAM 中的所有内容都将恢复到创建快照时的状态。

我看到了 qcow2 磁盘映像中列出的快照,也看到了为描述快照和域配置而创建的 XML 文件,但是RAM 的实际内容存储在哪里? 它是“永久的”吗?所以如果我重新启动主机,例如,如果我选择恢复到该快照,域的已保存的 RAM 状态仍然可用?

答案1

qcow2 格式确实提供了永恒的虚拟机内存的内部存储。对正在运行的 qcow2 支持的虚拟机进行快照时,其 RAM 状态将转储到用于存储的同一个 qcow2 文件中。

来自官方 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 隐藏了外部快照的复杂性)。

相关内容