我在 Linux 主机下运行虚拟化 Win8(游戏)平台。我使用 Synergy 共享键盘和鼠标,但偶尔需要传递 USB 设备。GPU 已传递给客户机,我无法从客户机访问 QEMU 监视器。
问题是,如果不关闭客户机,我无法释放上述设备。我想即时传递usb_add host:bus.addr
命令,usb_del bus.addr
这样我就可以根据需要连接和分离设备。好处在于,我可以让 Synergy 一直运行,并且只在需要时将设备锁定给客户机。我应该补充一点,Synergy 的内置锁定方式lockCursorToScreen(toggle)
不够可靠。
我对 QMP 不太熟悉,但我可以使用-qmp tcp:192.168.0.10:4444,server,nowait
命令行选项设置 telnet 服务器来托管。我不知道如何在 Windows 下通过 telnet 传递三个命令并退出。
另一个选项是使用 为 QEMU 监视器设置套接字-qmp unix:/path/to/socket,server
。然后我想我会通过 SSH 连接到主机以与监视器交互。我也不确定如何实现自动化。从 SSH 命令行在主机上运行 shellscript?
SSH 更安全,但我信任这个私人网络上的机器,所以这不是一个大问题。
TL;DR:我需要一种方法将命令从客户机传递到正在运行的 QEMU。可以使用 Telnet 和套接字(可能通过 SSH 访问),但不知道如何自动化。欢迎提供其他解决方案。
答案1
我解决了这个问题,并将答案发布在这里,以便其他人遇到同样的问题时参考。我的主机是 Linux,客户机是 Windows。
QEMU 启动时-qmp tcp:192.168.0.10:4444,server,nowait
启用 telnet 访问监视器。要绑定启动时所需的设备,请添加-device usb-host,productid=12850,id="FancyKeyboard" -device usb-host,productid=64,id="FancyMouse"
到命令行。请注意,-device,productid=
需要十进制 ID,因此您必须先将获得的十六进制lsusb
或类似十六进制转换为十进制。该,id=
部分是为了轻松解除绑定,可以是任何唯一的字符串。
为了在运行时从主机绑定它们,我运行了一个名为 _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" }}'
并使用以下方式将输出传输到监视器nmap 的 netcat:
_kvm_bind|ncat 192.168.0.10 4444
我正在从另一个脚本运行它。ncat 很智能,在 EOF 之后自动退出 telnet 会话。
从客户机进行绑定是类似的,我也将 nmap 的命令行数据包安装到客户机。文件 _kvm_bind.bat 如下所示:
@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
是为了以防万一,在命令之间增加第二个延迟。我不确定& echo.
这是否真的有必要,我没有尝试过没有它。它只是在命令之间输出一个空白行。它可能不需要。
管道与Linux版本类似:
@echo off
_kvm_bind.bat|ncat 192.168.0.10 4444
解除绑定与绑定类似,只需将第二行和第三行替换为您之前绑定时提供的device_del
参数即可:id
echo '{ "execute": "qmp_capabilities" }'
echo '{ "execute": "device_del", "arguments": { "id":"FancyMouse" }}'
echo '{ "execute": "device_del", "arguments": { "id":"FancyKeyboard" }}'
就像我在问题中说的那样,我运行 Synergy 在客户机和主机之间共享鼠标和键盘,并且它们都有自己的显示器。绑定时我不需要关闭 Synergy,解除绑定后它工作正常。总而言之,我现在对此很满意。