Durchreichen von Eingabegeräten
Eingaben über Maus und Tastatur können über ein virtio-input Gerät an die virtuelle Maschine übergeben werden. In diesem Fall muss nicht der gesamte USB-Controller via PCI-Device-Passthrough durchgereicht werden sodass andere USB-Schnittstellen weiterhin dem TwinCAT/BSD Host zur Verfügung stehen.
Um Eingaben über virtio-input an die virtuelle Maschine weiterzuleiten, müssen dem virtio-input
Gerät die Eingabe-Events des angeschlossenen Gerätes /dev/input/eventN
übergeben werden.
Der folgende Beispielaufruf übergibt die integrierte GPU mit Hilfe von PCI-Device Passthrough und die Eingabe-Events /dev/input/event4
und /dev/input/event3
per virtio-net
.
doas bhyve \
-c sockets=1,cores=2,threads=1 \
-m 4G \
-l bootrom,/vms/samplevm/UEFI.fd,/vms/samplevm/EFI_VARS.fd,fwcfg=qemu \
-s 0,hostbridge \
-s 2,passthru,0/2/0,rom=/vms/samplevm/gop.rom \
-s 3,virtio-input,/dev/input/event4 \
-s 4,virtio-input,/dev/input/event3 \
-s 10,nvme,/vms/samplevm/disk0.img \
-s 31,lpc \
-o pci.0.31.0.pcireg.vendor=host \
-o pci.0.31.0.pcireg.device=host \
-o pci.0.31.0.pcireg.revid=host \
-o pci.0.31.0.pcireg.subvendor=host \
-o pci.0.31.0.pcireg.subdevice=host \
-A -H -P samplevm
Identifizierung von Eingabe-Events angeschlossener USB-Geräte
Mit Hilfe des Kommandos sysctl kern.evdev.input
können angeschlossene Eingabegeräte sowie ihre IDs gelistet werden, um so die Zuordnung zwischen Eingabegerät und /dev/input/event<ID>
zu ermitteln.
Im folgenden Beispiel lässt sich eine USB Maus (ums0
) mit Input ID 4 und eine USB-Tastatur (ukbd0
) mit Input ID 3 erkennen.
kern.evdev.input.4.uniq: 2057366C5943
kern.evdev.input.4.phys: ukbd1
kern.evdev.input.4.id: { bustype = 0x0003, vendor = 0x046d, product = 0xc093, version = 0x0000 }
kern.evdev.input.4.name: Logitech Advanced Corded Mouse M500s, class 0/0, rev 2.00/53.00, addr 2
kern.evdev.input.3.uniq:
kern.evdev.input.3.phys: ukbd0
kern.evdev.input.3.id: { bustype = 0x0003, vendor = 0x046d, product = 0xc328, version = 0x0000 }
kern.evdev.input.3.name: Logitech USB Keyboard, class 0/0, rev 1.10/86.00, addr 1
kern.evdev.input.2.uniq:
kern.evdev.input.2.phys: acpi_button0
kern.evdev.input.2.id: { bustype = 0x0019, vendor = 0x0000, product = 0x0000, version = 0x0001 }
kern.evdev.input.2.name: Sleep Button
kern.evdev.input.1.uniq:
kern.evdev.input.1.phys: sysmouse
kern.evdev.input.1.id: { bustype = 0x0006, vendor = 0x0000, product = 0x0000, version = 0x0000 }
kern.evdev.input.1.name: System mouse
kern.evdev.input.0.uniq:
kern.evdev.input.0.phys: kbdmux0
kern.evdev.input.0.id: { bustype = 0x0006, vendor = 0x0000, product = 0x0000, version = 0x0000 }
kern.evdev.input.0.name: System keyboard multiplexer
Dementsprechend können wie im Beispiel oben die Eingabe-Events von Maus und Tastatur an die virtuelle Maschine übergeben werden.