Kvm-Virtualization

libvirt 儲存的 RAM 快照在哪裡?

  • July 13, 2021

我的理解是,當我執行此命令來創建正在執行的域的快照時:

virsh snapshot-create-as myvm snapshot1

這不僅是在每個磁碟映像文件中創建的內部快照,而且 RAM 狀態也保存在某處。因此,如果我稍後恢復到該快照,RAM 中的所有內容都將恢復到創建快照的時間。

我看到了 qcow2 磁碟映像中列出的快照,並且看到了為描述快照和域配置而創建的 XML 文件,但是RAM 的實際內容儲存在哪裡? 它是“永久的”嗎?例如,如果我重新啟動主機,如果我選擇恢復到該快照,則域的已保存 RAM 狀態仍然可用?

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 將外部快照的複雜性隱藏在使用者之外)。

引用自:https://serverfault.com/questions/1069493