直通 PS/2 键盘至客户操作系统

直通 PS/2 键盘至客户操作系统

Windows 操作系统在虚拟机(ubuntu、libvirt、qemu-kvm)上运行。我的主机硬件上有 PS/2 键盘。有什么方法可以将其传递到来宾操作系统而不损失性能(也许可以使用 PS/2 键盘的按键映射来模拟 USB 键盘)。我尝试使用 Spice 服务器(来自 libvirt GUI“虚拟机管理器”),但按键时它会产生非常烦人的延迟。

答案1

首先,您必须使用virsh edit <vm-name>来修改配置 XML,因为您无法通过 virt-manager GUI 来执行此操作。

检查您的顶级<domain>标签。它应该看起来像这样:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

如果类型不是 kvm,则说明您登上了错误的航班 - 使用新的 VM 重新开始。如果 xmlns:qemu 属性不存在,请添加它。

如果您已经有一个<qemu:commandline>部分,请在其中添加以下两行:

<qemu:arg value='-object'/>
<qemu:arg value='input-linux,id=kbd,evdev=/dev/input/eventN,grab_all=on,repeat=on'/>

如果不这样做,则在标签下创建它,<domain>并在其中包含这两个标签。

您还需要使用以下 XML 在客户机中创建键盘设备,您应将其添加到该<devices>部分:

<serial type='dev'>
<source path='/dev/input/eventN'/>
<target port='0'/>
</serial>

第二个qemu:arg和这里定义的源码路径都已经eventN定义了。您需要将 N 替换为键盘的输入设备编号。不要更改目标端口 - 只需更改源路径。

我的键盘设备是 2,但你的可能是 0 或其他数字。要找出您的键盘设备,请dmesg | grep input查找您的键盘设备。我的说:

input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input2

您仍然想使用 /dev/input/eventN 的路径 - 这只是让您知道 N 使用的正确数字是多少。如果您将 X 与 evdev 一起使用(您可能就是这样),您还可以找到此信息在 X 日志文件中。需要注意的是:如果您重新配置主机硬件,您的设备编号可能会发生变化。

当您在访客中使用键盘时,主机将不再识别您的键盘。要控制主机,您可以:

  • 退出客人,或
  • 通过 USB 连接另一个键盘,或
  • 通过 ssh 登录,或者
  • 使用串行控制台。

我从这个链接获得了大部分信息:

https://www.reddit.com/r/VFIO/comments/5hja2k/how_do_you_pass_through_a_ps2_keyboard/

答案2

我尝试了 Debian Bullseye 上其他答案中的步骤,并想更新一些说明。我建议使用journalctl -b然后搜索input.*keyboard。我的系统的正常运行时间更长,并且 dmesg 不再显示这些行。我发现:

kernel: input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/in>
systemd-logind[2716]: Watching system buttons on /dev/input/event0 (AT Translated Set 2 keyboard)

有了这个,我知道我的键盘此时正在使用 event0,因此我可以通过ls -l /dev/input/by-pathas找到它/dev/input/by-path/platform-i8042-serio-0-event-kbd

从 libvirt 7.4.0 版开始,域 XML 支持<input type='evdev'>.我从 bullseye-backports 更新了 libvirt 以获得版本 8。因此,我必须添加到 VM XML 中的是:

<input type="evdev">
  <source dev="/dev/input/by-path/platform-i8042-serio-0-event-kbd" grab="all" grabToggle="ctrl-ctrl" repeat="on"/>
</input>

请注意附加功能grabToggle="ctrl-ctrl",它允许通过左 ctrl + 右 ctrl 在访客和主机之间切换键盘。

我从那里得到这个Archlinux 维基。这还包含通过“从 PS/2 切换到 Virtio 输入”进一步减少延迟的建议,但我还没有尝试过。

这种方法的好处是您无需为 Qemu 配置额外的 ACL/权限即可使用键盘。当我尝试该部分的方法时,这给我带来了问题qemu:commandline

相关内容