qemu 모니터를 사용하여 실행 중인 qemu 인스턴스에 연결

qemu 모니터를 사용하여 실행 중인 qemu 인스턴스에 연결

qemu터미널을 열지 않고 Windows 7에서 인스턴스를 실행하고 있습니다 . 이제 다음과 같은 컴퓨터를 종료하고 싶습니다.내 컴퓨터 이름아니면 USB 장치를 추가하세요. 스크립트 가능한 솔루션이 필요합니다. Libvirt는 내 시스템에 다른 단점이 있으므로 솔루션이 아닙니다.

나는 다음과 같은 마법의 라인을 찾고 있습니다.

qemu-monitor -connect=MyMachineName command="shutdown"

어떻게 해야 합니까?

답변1

내가 선호하는 방법은 UNIX 소켓을 통해 QEMU "모니터"에 연결하는 것입니다. 이 방법은 제대로 문서화되어 있지 않지만 잘 작동합니다.

QEMU를 시작할 때 -monitor다음 매개변수를 추가합니다.

$ qemu-system-i386 [..other params..] -monitor unix:qemu-monitor-socket,server,nowait

qemu-monitor-socket이는 키워드가 아니라 디스크의 소켓을 나타내는 호스트 경로와 파일 이름을 선택하는 것입니다. QEMU가 시작되면 이 파일이 생성되는 것을 볼 수 있습니다.

이 옵션은 server,nowaitQEMU에게 연결을 수신하지만 연결을 기다리지 않고 가상 머신을 시작하도록 지시합니다.

당신은 그것을 사용할 수 있습니다소캇유틸리티(모든 좋은 저장소에서 사용 가능)는 소켓에 연결하여 QEMU 모니터 프롬프트에 명령을 입력합니다.

$ socat -,echo=0,icanon=0 unix-connect:qemu-monitor-socket
QEMU 2.8.1 monitor - type 'help' for more information
(qemu) _

socat이 하는 일은 두 개의 임의의 스트림/소켓을 함께 연결하는 것입니다. 첫 번째 인수 는 콘솔 키보드 및 출력과 -동의어입니다 . stdio이 두 가지 옵션은 echo=0,icanon=0입력한 명령이 다시 반향되는 것을 방지하고 Tab기록 완성 및 화살표 키를 활성화하여 키보드 상호 작용을 향상시킵니다. 마지막 매개변수는 이전에 생성된 소켓 파일에 대한 연결을 나타냅니다.

QEMU에 일회성 명령을 보내려면,에코socat을 통해 UNIX 소켓에 도달합니다.

$ echo "info status" | socat - unix-connect:qemu-monitor-socket
QEMU 2.8.1 monitor - type 'help' for more information
(qemu) info status
VM status: running
(qemu)
$ _

스크립트의 출력을 더 명확하게 만들기 위해 첫 번째 줄과 프롬프트 줄을 | tail --lines=+2 | grep -v '^(qemu)'필터링하는 필터 도 추가했습니다.(qemu)

$ echo "info status" | socat - unix-connect:qemu-monitor-socket | tail --lines=+2 | grep -v '^(qemu)'
VM status: running
$ _

요청 시 가상 머신을 종료하기 위해 유용한 모니터 명령은 system_powerdown가상 머신의 켜기/끄기 버튼을 눌러 정상적으로 종료되도록 하거나 quit, QEMU를 즉시 종료하는 것입니다.

몇 가지 참고사항:

  • -qmpQEMU를 사용 하면 대신 JSON 기반 인터페이스를 제공할 수 있습니다 . -monitor이는 프로그램 제어에 더 강력할 수 있지만 저는 시도해 본 적이 없습니다.

  • 디스크의 소켓 파일은 항상 비어 있습니다. 이는 데이터를 저장하지 않고 프로그램이 통신을 위해 여는 임의의 핸들일 뿐입니다.

답변2

누군가 TTY에서 올바른 명령을 사용하여 이를 수행할 수 있지만 그 동안 네트워킹과 관련된 솔루션을 게시하겠습니다.

QEMU 모니터를 리디렉션하는 데는 여러 가지 옵션이 있습니다. 한 가지 방법은 QEMU가 텔넷을 통해 모니터에 대한 액세스를 제공하도록 하는 것입니다.

$ qemu-system-i386 -monitor telnet:127.0.0.1:55555,server,nowait;

그런 다음 명령을 .QEMU 에 파이프하여 스크립트를 작성할 수 있습니다 telnet. 텔넷 세션이 너무 빨리 닫혀서 시각적 피드백을 얻을 수 없기 때문에 명령의 출력을 삭제할 수 있다면 괜찮습니다.

$ echo system_powerdown |telnet 127.0.0.1 55555
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.
$ _  # qemu sends the guest an ACPI shutdown signal

모니터에서 실행된 명령의 출력을 수집해야 하는 경우 TCP 세션을 사용할 수 있습니다.

$ qemu-system-i386 -monitor tcp:127.0.0.1:55555,server,nowait;

netcat그런 다음 유사한 유틸리티를 통해 명령을 청취 모니터로 보낼 수 있습니다.

$ echo info\ kvm |nc -N 127.0.0.1 55555
QEMU 2.11.0 monitor - type 'help' for more information
(qemu) info kvm
kvm support: enabled
(qemu) $ echo system_powerdown |nc -N 127.0.0.1 55555
QEMU 2.11.0 monitor - type 'help' for more information
(qemu) system_powerdown
(qemu) $  # hit return
$ _  # qemu sends the guest an ACPI shutdown signal

다음은 QEMU 모니터링 명령에 대한 일부 문서에 대한 링크입니다.https://en.wikibooks.org/wiki/QEMU/Monitor

관련 정보