Come passare i comandi in modo non interattivo all'esecuzione di QEMU dal guest. QMP via telnet / SSH?


1

Sto eseguendo una piattaforma Win8 (gaming) virtualizzata su host Linux. Uso Synergy per la condivisione di tastiera e mouse, ma devo passare occasionalmente i dispositivi USB. La GPU è passata al guest e non riesco ad accedere al monitor QEMU dal guest.

Il problema è che non posso rilasciare i suddetti dispositivi senza spegnere l'ospite. Vorrei passare usb_add host:bus.addre usb_del bus.addrcomandi al volo in modo da poter collegare e staccare i dispositivi di cui ho bisogno. La bellezza sarebbe che posso mantenere Synergy sempre in esecuzione e bloccare i dispositivi agli ospiti solo quando ne ho bisogno. Dovrei aggiungere che il blocco integrato di Synergy tramite lockCursorToScreen(toggle)non funziona in modo abbastanza affidabile.

Non conosco eccessivamente QMP ma posso configurare un server Telnet per ospitare con l' -qmp tcp:192.168.0.10:4444,server,nowaitopzione della riga di comando. Non so come passare tre comandi via telnet ed uscire da Windows.

Un'altra opzione potrebbe essere quella di impostare un socket per il monitor QEMU con -qmp unix:/path/to/socket,server. Quindi suppongo che avrei SSH per l'host per interagire con il monitor. Non sono sicuro di come automatizzare neanche quello. Eseguire uno shellscript sull'host dalla riga di comando SSH?

SSH è più sicuro ma mi fido delle macchine su questa rete privata, quindi non è un grosso problema.

TL; DR: ho bisogno di un modo per passare i comandi all'esecuzione di QEMU dal guest. Telnet e socket (eventualmente accessibili tramite SSH) sono possibili ma non sanno come automatizzare. Altri sollutions benvenuti.

Risposte:


1

Ho risolto il problema e ho pubblicato la risposta qui per i posteri se qualcun altro ha lo stesso problema. Il mio host è Linux e guest windows.

QEMU viene avviato con -qmp tcp:192.168.0.10:4444,server,nowaitper consentire l'accesso telnet al monitor. Per associare i dispositivi desiderati in occasione del lancio, aggiungere -device usb-host,productid=12850,id="FancyKeyboard" -device usb-host,productid=64,id="FancyMouse"alla riga di comando. Nota che -device,productid=vuole un ID decimale, quindi devi prima convertire l'esagono da cui ottieni lsusbo simile in decimale. la ,id=parte è per consentire un semplice sblocco e può essere qualsiasi stringa univoca.

Per collegarli in fase di esecuzione dall'host, eseguo uno script che ho chiamato _kvm_bind

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 convoglia l'output sul monitor con netcat di nmap : _kvm_bind|ncat 192.168.0.10 4444 lo sto eseguendo da un altro script. ncat è intelligente ed esce automaticamente dalla sessione telnet dopo EOF.

Il binding da guest è simile e ho installato il pacchetto della riga di comando di nmap anche per il guest. Il file _kvm_bind.bat ha il seguente aspetto:

@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.

choiceè lì per facilitare un secondo ritardo tra i comandi per ogni evenienza. Non sono sicuro che & echo.sia effettivamente necessario, non ci ho provato senza di esso. Emette solo un vuoto tra i comandi. Probabilmente non è necessario.

Il piping è simile alla versione linux:

@echo off
_kvm_bind.bat|ncat 192.168.0.10 4444

La non associazione è simile alla rilegatura, basta scambiare la seconda e la terza riga device_delcon l'argomento idfornito con il collegamento fornito in precedenza:

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

Come ho detto nella domanda, eseguo Synergy per condividere il mouse e la tastiera tra guest e host ed entrambi hanno un monitor tutto loro. Non ho bisogno di chiudere Synergy sull'associazione e funziona bene dopo lo scioglimento. Tutto sommato, per ora sono contento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.