Windows

知道 qemu vm 關閉(使用 QMP 通過 telnet 啟動)何時完成

  • May 7, 2017

當我啟動一個 qemu (Windows Server 2003) 虛擬機時

-qmp tcp:127.0.0.1:4444,server,nowait

我可以使用以下腳本將其關閉

#!/bin/bash
telnet 127.0.0.1 4444 <<JSON 
{ "execute": "qmp_capabilities" } 
{ "execute": "system_powerdown" } 

JSON

但是有兩個問題:

  1. 腳本以 $? 退出 = 1 並說“連接被外國主機關閉”。我可以讓它以乾淨的方式退出嗎?
  2. 關閉過程非同步發生。因此,腳本立即返回,而不是等待虛擬機完成關閉。我怎麼知道它什麼時候完成(沒有為 qemu grepping ps 或類似的東西)?

背景是我想在 Linux 主機上的 VM 內託管 Windows Server 2003 安裝,並且我想使用 UPS。在停電的情況下,我想關閉虛擬機,然後關閉主機——當然,主機應該在虛擬機完成之前開始關閉。

可以使用expect。當 vm 完成時,將發出一個名為“SHUTDOWN”的事件。因此,以下腳本開始關閉並等待它完成:

#!/usr/bin/expect

set timeout -1

spawn telnet 127.0.0.1 4444

expect "QMP"
send "{ 'execute': 'qmp_capabilities' }\n"

expect "return"
send "{ 'execute': 'system_powerdown' }\n"

expect "SHUTDOWN"

因為我已經對我的問題投了反對票,特別是考慮到以下陳述

如果您正在執行上述操作,那麼其他所有內容可能都是一團糟,幾乎無法正常工作,並且如果您以錯誤的方式看待它,就會崩潰。

我不得不說另一件事。我真的不明白為什麼做這樣的事情“可能是一團糟”,尤其是虛擬機本身。當通過 libvirt 啟動它時,與執行該工作的 shell 腳本相比,所做的事情完全相同。為什麼它應該“勉強工作”?!此外,QMP 已被設計並通過諸如 telnet 之類的方式提供,以便以這種方式執行“類似這樣的事情”,不是嗎?

libvirt 不只是幾個虛擬化解決方案介面的包裝器,因此可以處理由不同管理程序以相同方式執行的多個 vm 安裝嗎?那麼當我只在一個管理程序中執行一個虛擬機時,我為什麼要使用它呢?

可能我在這裡完全錯了,但至少,這是如何使用(bash)腳本關閉 qemu 虛擬機並知道它何時以體面的方式完成而無需使用 libvirt。

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