Conecte-se à instância do qemu em execução com o monitor qemu

2

Estou tendo uma instância de qemu em execução no Windows 7, executando sem um terminal aberto. Agora eu quero desligar a máquina com o nome MyMachineName ou adicionar um dispositivo USB para ele. Eu preciso de uma solução de script. Libvirt não é uma solução, porque tem outras desvantagens para o meu sistema.

Estou procurando uma linha mágica como:

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

Como posso fazer isso?

    
por Cutton Eye 26.02.2018 / 12:07

2 respostas

2

Alguém poderá entrar em contato com um comando adequado para operar em TTYs, mas, no meio tempo, postarei uma solução envolvendo a rede.

Existem algumas opções para redirecionar o monitor QEMU. Uma maneira é fazer com que o QEMU ofereça acesso ao seu monitor via telnet:

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

Em seguida, o QEMU pode ser criado por comandos de tubulação para telnet . Isso é bom, desde que a saída dos comandos possa ser descartada, já que a sessão de telnet provavelmente fechará muito rapidamente para um feedback visual:

$ 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

Se a saída dos comandos executados no monitor precisar ser coletada, uma sessão TCP pode ser usada:

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

Em seguida, os comandos podem ser enviados para o monitor de escuta por meio de netcat ou um utilitário semelhante:

$ 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

Aqui está um link para a documentação parcial dos comandos do monitor QEMU: link

    
por 27.02.2018 / 15:30
2

Minha maneira preferida de fazer isso é conectar-se ao "monitor" QEMU através de um soquete UNIX. O QEMU é bastante flexível como este, embora o método esteja muito mal documentado.

Inicie o QEMU com o parâmetro -monitor da seguinte maneira:

$ qemu-system-i386 -monitor unix:qemu-monitor-socket,server,nowait

qemu-monitor-socket aqui não é uma palavra-chave, mas um caminho de host e um nome de arquivo de sua escolha para representar o soquete no disco. Você verá esse arquivo criado assim que o QEMU for iniciado.

As opções server,nowait dizem ao QEMU para escutar conexões, mas não bloqueá-las enquanto esperam por elas.

Você pode usar o utilitário socat para se conectar ao soquete para digitar os comandos no prompt do monitor QEMU:

$ socat - unix-connect:qemu-monitor-socket
QEMU 2.8.1 monitor - type 'help' for more information
(qemu)

O que a socat realmente faz é conectar dois fluxos / soquetes arbitrários. - é um sinônimo para stdio , ou seja, o teclado e a saída do console. O parâmetro dois diz para se conectar ao arquivo de soquete criado anteriormente.

Para emitir um comando one-shot para o monitor, echo em socat, que irá canalizá-lo através do socket UNIX para o QEMU:

$ 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)
$

Para uma exibição mais limpa ao criar scripts, também adiciono | tail --lines=+2 | grep -v "^(qemu) " para filtrar a linha inicial desnecessária e as linhas de prompt (qemu) .

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

(o QEMU também permite -qmp no lugar de -monitor , fornecendo uma interface baseada em JSON; que pode ser mais robusta para o controle programático, mas nunca tentei isso.)

Para desligar a VM, os comandos úteis do monitor são system_powerdown , o equivalente a pressionar o botão liga / desliga da máquina imaginária e quit , encerrando o QEMU imediatamente.

Observe que o arquivo de soquete no disco estará sempre vazio. Não armazena dados; é apenas um identificador arbitrário para os programas estabelecerem comunicações.

    
por 19.10.2018 / 20:41

Tags