qemu vm 종료(QMP를 사용하여 텔넷을 통해 시작됨)가 완료되는 시기 확인

qemu vm 종료(QMP를 사용하여 텔넷을 통해 시작됨)가 완료되는 시기 확인

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. 종료 프로세스는 비동기적으로 발생합니다. 따라서 스크립트는 vm이 종료를 완료할 때까지 기다리지 않고 즉시 반환됩니다. 작업이 완료되었는지 어떻게 알 수 있나요(qemu에 대해 ps를 grepping하거나 이와 유사한 것을 사용하지 않고)?

배경은 Linux 호스트의 VM 내부에서 Windows Server 2003 설치를 호스팅하고 UPS를 사용하고 싶다는 것입니다. 정전이 발생하는 경우 VM을 종료한 다음 호스트를 종료하고 싶습니다. 물론 호스트는 VM이 ​​완료될 때까지 종료를 시작해야 합니다.

답변1

예상을 사용하면 가능합니다. 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"

내 질문에 대해 이미 반대표를 받았고 특히 다음 설명을 고려하면

위와 같은 작업을 수행하는 경우 다른 모든 작업은 거의 작동하지 않는 완전한 엉망이 될 수 있으며 잘못 보면 문제가 발생할 수 있습니다.

또 다른 말을 해야겠다. 나는 왜 이런 일을 하는 것이 "아마도 완전한 혼란"인지, 특히 VM 자체를 이해하지 못합니다. libvirt를 통해 시작할 때 작업을 수행하는 쉘 스크립트와 비교하여 동일한 작업이 수행됩니다. 왜 "거의 작동하지" 않아야 하는가?! 게다가 QMP는 이런 식으로 "이런 일"을 할 수 있도록 텔넷 같은 것을 통해 설계되고 제공되었습니다.

그리고 libvirt는 여러 가상화 솔루션의 인터페이스에 대한 래퍼일 뿐이므로 동일한 방식으로 다른 하이퍼바이저에서 실행되는 여러 vm 설치를 처리할 수 있습니까? 그러면 하나의 하이퍼바이저에서 하나의 VM만 실행할 때 왜 이를 사용해야 합니까?

아마도 내가 완전히 틀렸을 수도 있지만 적어도 이것은 (bash) 스크립트를 사용하여 qemu 가상 머신을 종료하고 libvirt를 사용하지 않고도 적절한 방식으로 완료되었는지 알 수 있는 방법입니다.

답변2

libvirtd 없이 VM을 종료하려고 하는 것을 발견했습니다. 그 이유는 스왑 장치 오류로 인해 libvirtd가 시작되지 않습니다. VM을 완전히 종료하고 싶었지만 libvirt를 사용하여 디스크에 저장할 수 없었습니다. 위와 같이 내가 생각해 냈습니다.

/var/lib/libvirt/qemu에서

$(find | grep monitor)의 양말에 대해; do printf "{ 'execute': 'qmp_capability' }\n{ 'execute': 'system_powerdown' }\n" | socat - UNIX-CONNECT:$sock; 완료

우분투용입니다. 전반적으로 그렇습니다. 저는 일반적으로 libvirt를 사용하지만 이것이 종료하기 위한 다른 명령에 대한 인터페이스라는 것을 알고 있었습니다. libvirt가 실제로 무엇을 하고 있었는지 알면 VM을 완전히 종료할 수 있습니다.

관련 정보