Estou tendo uma instância qemu
rodando no Windows 7, rodando sem um terminal aberto. Agora eu quero desligar a máquina com o nome MyMachineName ou adicionar um dispositivo USB a ela. Eu preciso de uma solução programável. 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 eu posso fazer isso?
Minha maneira preferida de fazer isso é conectar-se ao "monitor" QEMU por meio de um soquete UNIX. Funciona bem, embora o método esteja muito mal documentado.
Ao iniciar o QEMU, adicione o
-monitor
parâmetro da seguinte forma: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á este arquivo criado quando o QEMU for iniciado.As opções
server,nowait
dizem ao QEMU para escutar as conexões, mas iniciar a VM sem esperar por uma conexão.Você pode usar o utilitário socat (disponível em todos os bons repositórios) para conectar-se ao soquete para digitar comandos no prompt do monitor QEMU:
O que o socat faz é conectar dois fluxos/soquetes arbitrários. O primeiro parâmetro
-
é sinônimo destdio
, ou seja, o teclado e a saída do console. O par de opçõesecho=0,icanon=0
torna a interação do teclado mais agradável aqui, impedindo a repetição dos comandos inseridos e permitindo a Tabconclusão e as teclas de seta para o histórico. O parâmetro final diz para conectar ao arquivo de soquete criado anteriormente.Para enviar um comando one-shot para o QEMU, faça eco através do socat para o soquete UNIX:
Para uma saída mais limpa em um script, também adiciono
| tail --lines=+2 | grep -v '^(qemu)'
para filtrar a primeira linha e as(qemu)
linhas de prompt:Para desligar a VM como você deseja, comandos de monitor úteis são
system_powerdown
, que pressiona o botão liga/desliga da máquina imaginária para que ela possa desligar normalmente, ouquit
, que sai do QEMU imediatamente.Algumas notas:
QEMU também permite
-qmp
no lugar de-monitor
, fornecendo uma interface baseada em JSON; isso pode ser mais robusto para controle programático, mas nunca tentei.Um arquivo de soquete no disco está sempre vazio. Não armazena dados; é apenas um identificador arbitrário para programas abrirem comunicações.
Alguém pode entrar em contato com um comando adequado para operar em TTYs, mas, enquanto isso, 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:
Em seguida, o QEMU pode ser programado por meio de comandos de canalização para
telnet
. Isso é bom, desde que a saída dos comandos possa ser descartada, pois a sessão telnet provavelmente será fechada muito rapidamente para feedback visual:Se a saída dos comandos executados no monitor precisar ser coletada, uma sessão TCP pode ser usada:
Em seguida, os comandos podem ser enviados ao monitor de escuta por meio
netcat
de um utilitário semelhante:Aqui está um link para a documentação parcial dos comandos do monitor QEMU: https://en.wikibooks.org/wiki/QEMU/Monitor