Como passar comandos não interativamente para executar o QEMU a partir do convidado. QMP via telnet / SSH?

1

Estou executando uma plataforma Win8 (jogos) virtualizada no host Linux. Eu uso o Synergy para compartilhamento de teclado e mouse, mas eu preciso passar os dispositivos USB ocasionalmente. A GPU é passada para o convidado e não consigo acessar o monitor QEMU do convidado.

O problema é que não consigo liberar os dispositivos sem encerrar o convidado. Gostaria de passar os comandos usb_add host:bus.addr e usb_del bus.addr rapidamente para que eu possa conectar e desconectar os dispositivos conforme necessário. Beleza seria que eu posso manter o Synergy funcionando o tempo todo e só bloquear os dispositivos para convidado quando eu precisar deles. Devo acrescentar que o bloqueio embutido do Synergy via lockCursorToScreen(toggle) não funciona de forma confiável o suficiente.

Não estou muito familiarizado com o QMP, mas posso configurar um servidor telnet para hospedar com a opção de linha de comando -qmp tcp:192.168.0.10:4444,server,nowait . Eu não sei como passar três comandos via telnet e sair no windows.

Outra opção poderia ser configurar um soquete para o monitor QEMU com -qmp unix:/path/to/socket,server . Então eu suponho que eu SSH para o host para interagir com o monitor. Eu não sei como automatizar isso também. Executar um shellscript no host da linha de comando do SSH?

O SSH é mais seguro, mas confio em máquinas nessa rede privada, então isso não é um grande problema.

TL; DR: Eu preciso de uma maneira de passar comandos para executar o QEMU do guest. Telnet e socket (acessados possivelmente via SSH) são possíveis, mas não sabem como automatizar. Outras soluções bem-vindas.

    
por WhimsicalWombat 21.06.2015 / 11:27

1 resposta

1

Resolvi o problema e postei a resposta aqui para a posteridade, se outra pessoa tiver o mesmo problema. Meu host é linux e janelas de convidados.

O QEMU é iniciado com -qmp tcp:192.168.0.10:4444,server,nowait para permitir que o acesso telnet seja monitorado. Para vincular os dispositivos desejados no lançamento, adicione -device usb-host,productid=12850,id="FancyKeyboard" -device usb-host,productid=64,id="FancyMouse" à linha de comando. Observe que -device,productid= quer o ID decimal, portanto, você precisa converter o hexadecimal obtido de lsusb ou semelhante ao decimal primeiro. a parte ,id= é para facilitar a desvinculação e pode ser qualquer string única.

Para ligá-los em tempo de execução a partir do host, eu corro um script que chamo de _kvm_bind com

echo '{ "execute": "qmp_capabilities" }'
echo '{ "execute": "device_add", "arguments": { "driver": "usb-host","productid": "12850","id": "FancyKeyboard" }}'
echo '{ "execute": "device_add", "arguments": { "driver": "usb-host","productid": "64","id": "FancyMouse" }}'

E canalize a saída para o monitor com netcat do nmap : %código% Eu estou correndo de outro script. ncat é inteligente e sai da sessão de telnet automagicamente após o EOF.

A vinculação de convidado é semelhante e eu instalei o pacote de linha de comando do nmap também para o convidado. O arquivo _kvm_bind.bat é o seguinte:

@echo off
echo { "execute": "qmp_capabilities" } & echo.
choice /T 1 /D y > nul
echo { "execute": "device_add", "arguments": { "driver": "usb-host","productid": "12850","id": "FancyKeyboard" }} & echo.
choice /T 1 /D y > nul
echo { "execute": "device_add", "arguments": { "driver": "usb-host","productid": "64","id": "FancyMouse" }} & echo.

_kvm_bind|ncat 192.168.0.10 4444 está lá para facilitar um segundo atraso entre os comandos apenas no caso. Não tenho certeza se choice é realmente necessário, não tentei isso sem ele. Apenas mostra um texto em branco entre os comandos. Provavelmente não é necessário.

O piping é semelhante à versão do linux:

@echo off
_kvm_bind.bat|ncat 192.168.0.10 4444

Desassociar é semelhante à ligação, basta trocar a segunda e a terceira linha para & echo. e argumentar com o device_del que você forneceu quando vinculou antes:

echo '{ "execute": "qmp_capabilities" }'
echo '{ "execute": "device_del", "arguments": { "id":"FancyMouse" }}'
echo '{ "execute": "device_del", "arguments": { "id":"FancyKeyboard" }}'

Como eu disse na pergunta, eu corro o Synergy para compartilhar o mouse e o teclado entre o convidado e o host e ambos têm um monitor próprio. Eu não preciso desligar Synergy na ligação e funciona bem depois de desvincular. Apesar de tudo, estou feliz com isso por enquanto.

    
por 23.06.2015 / 20:33

Tags