如何以像虛擬機器一樣可預測的方式使用 QEMU 快照/savevm?

如何以像虛擬機器一樣可預測的方式使用 QEMU 快照/savevm?

Q:有沒有辦法讓 QEMU 虛擬機器運行,我可以選擇(線上或離線)保存復原點?

帶有調查的長文本,已經檢查過的替代方案和小咆哮:

我很難掌握 qemu 多種完全不相容的儲存和丟棄虛擬機器和磁碟狀態/更改的方法。

有的是-snapshot旗幟。但它似乎沒有完成(引用自doc

這是一項正在進行的工作,隨著我們的進展,情況可能會改變。

),並且取決於客座代理,這似乎也沒有完成,而且有些破壞,因為開發人員在將其從 QMP 遷移到 QAPI 時改變了方向,然後在中途開始研究 libvirt 過度殺傷「解決方案」。

這兩份文件都提到了 QEMU 版本 0.16~17...但我的系統都有版本 7.2+,所以我不確定它是否是一些內部 lib 版本或非常舊的文件。

然後還有檔案系統快照 -drive file=hda.qcow2,snapshot=on這似乎不適用於我的系統。我的意思是,它的工作原理是,當使用該選項時,所有內容總是被丟棄。無法實際將任何資料提交至 QCOW2 映像的快照。

那麼,有savevm監控命令,但是雖然它似乎是唯一真正利用QCOW2 快照功能的一個,但它也會存儲大量不需要的CPU/內存狀態(它們更令人煩惱,會在以後破壞事情,並且只在罕見的QA 情況下真正有幫助) ,而且我沒有找到一種方法可以在下次運行時輕鬆丟棄它們並只保留 QCOW2 更改)

這就是我想要的。始終提交更改的方法,但有一種方法,當機器運行時離線將該點保存在儲存為快照

但最後一種方法與 qemu 和圖像完全無關。我必須隨著進度建立新的檔案名,而不是新增儲存狀態。

我認為理想的狀態是擁有這種離線狀態方法,但使用內部 QCOW2 快照支援而不是不同的文件。

最後,還有另外一個選擇這是最後一個離線用例,但在線完成。即在運行虛擬機器時,透過 qemu 代理暫停執行,在外部主機上建立新的快照文件,並指示正在運行的實例切換到新的快照覆蓋並恢復執行。

答案1

我不明白你所說的可預測是什麼意思,但我認為你可能正在尋找這個:

List, apply, create or delete snapshots in image FILENAME.

qemu-img snapshot \
    [--object OBJECTDEF] [--image-opts] [-U] [-q] \
    [-l | -a SNAPSHOT | -c SNAPSHOT | -d SNAPSHOT] FILENAME


    Parameters to snapshot subcommand:

    SNAPSHOT
           Is the name of the snapshot to create, apply or delete

    -a     Applies a snapshot (revert disk to saved state)
    -c     Creates a snapshot
    -d     Deletes a snapshot
    -l     Lists all snapshots in the given image

(取自 qemu-img 線上說明頁 &https://www.qemu.org/docs/master/tools/qemu-img.html#cmdoption-qemu-img-commands-arg-snapshot

該命令將創建一個內部的qcow2 虛擬機器映像中的快照/檢查點(我不確定它是否適用於其他磁碟格式)。

qemu-img snapshot create -f qcow2 -b <backing.file> -F qcow2 <image.file>(與建立新的磁碟映像檔並使用現有映像檔作為後備檔案的格式不同。 - 適合不可變的檔案。)

有關特定 qemu 版本支援的功能的完整列表,請檢查qemu-img --help輸出。

例子:

$ qemu-img snapshot -l myamazingqemuvm.qcow2
$ qemu-img snapshot -c testing myamazingqemuvm.qcow2
$ qemu-img snapshot -l myamazingqemuvm.qcow2
Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         testing               0 B 2023-05-21 00:57:50 00:00:00.000          0
$ qemu-img snapshot -d testing myamazingqemuvm.qcow2
$ qemu-img snapshot -l myamazingqemuvm.qcow2
$

要建立快照,qemu-img 需要寫鎖文件上,這意味著它僅適用於離線虛擬機器。


創建一個快照線上虛擬機,您需要在正在運行的qemu-system進程中使用“HMP”命令:

(qemu) savevm my_snapshot

(qemu) loadvm my_snapshot

分別儲存和載入快照。要在終端啟動的虛擬機器中取得這樣的控制台,您可以使用以下參數啟動它monitor

qemu-system-x86_64 [...] -monitor unix:/tmp/qemu-mon_${VMNAME}.sock,server,nowait

這將建立一個 unix 套接字來與您的虛擬機器進行通訊:

#!/bin/sh
#
# connect to qemu monitor socket
# disconnect from it with Ctrl-C

MACHINE="${1}"
SOCKET="/tmp/qemu-mon_${MACHINE}.sock"

echo "CONNECTING TO ${MACHINE} ..."
socat ${SOCKET} STDIN

然後你需要做的就是

$ ./qemu-monitor.sh myamazingqemuvm
CONNECTING TO myamazingqemuvm ...
QEMU 5.2.0 monitor - type 'help' for more information
(qemu) savevm testsnap
savevm testsnap
(qemu) loadvm testsnap
loadvm testsnap

....一旦您重新離線,您可以切換回使用qemu-img snapshot

$ qemu-img snapshot -l myamazingqemuvm.qcow2
Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         testing               0 B 2023-05-21 00:57:50 00:00:00.000          0
2         testsnap          14.3 MiB 2023-05-21 01:03:45 00:05:32.995           

相關內容