Kvm-Virtualization
libvirt 儲存的 RAM 快照在哪裡?
我的理解是,當我執行此命令來創建正在執行的域的快照時:
virsh snapshot-create-as myvm snapshot1
這不僅是在每個磁碟映像文件中創建的內部快照,而且 RAM 狀態也保存在某處。因此,如果我稍後恢復到該快照,RAM 中的所有內容都將恢復到創建快照的時間。
我看到了 qcow2 磁碟映像中列出的快照,並且看到了為描述快照和域配置而創建的 XML 文件,但是RAM 的實際內容儲存在哪裡? 它是“永久的”嗎?例如,如果我重新啟動主機,如果我選擇恢復到該快照,則域的已保存 RAM 狀態仍然可用?
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 將外部快照的複雜性隱藏在使用者之外)。