
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