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,nowait
QEMU에게 연결을 수신하지만 연결을 기다리지 않고 가상 머신을 시작하도록 지시합니다.
당신은 그것을 사용할 수 있습니다소캇유틸리티(모든 좋은 저장소에서 사용 가능)는 소켓에 연결하여 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를 즉시 종료하는 것입니다.
몇 가지 참고사항:
-qmp
QEMU를 사용 하면 대신 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