Об этом не часто упоминается, но для шаринга клавы и мыши между хостом и гостём можно использовать не только synergy, но и встроенный в qemu так называемый evdev passthrough (начиная c версии 2.6)
qemu-system-x86_64 \
-object input-linux,id=kbd,evdev=/dev/input/event0,grab_all=yes \
-object input-linux,id=mouse,evdev=/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse \
...
(полный скрипт в конце)
я использую вот что:
хост - qemu 2.9, linux 4.11
гость - винда 8.1
Проблема вот в чём:
в госте DPI мыши меньше, чем в хосте, причём значительно - примерно в два-три раза (я сравниваю отношение расстояния, пройденного мышью по коврику, к расстоянию, пройденному курсором мыши по экрану)
При использовании synergy, например, DPI мыши одинаковое и в хосте, и в госте. Но с synergy есть другие проблемы, поэтому не хотелось бы его использовать.
Я пробовал настраивать скорость курсора в настройках винды, но даже с максимальной скоростью получается меньше чем в хосте. Чую, дело где-то в evdev или qemu, но я не сведущ в этох вопросах.
Я пробовал гуглить настройки для qemu и evdev, но не нашёл ничего релевантного, кроме, разве что, этого патча для qemu (не вошёл в 2.9), добавляющего поддержку абсолютных координат. На сколько я понимаю, он добавляет поддержку пробрасывания эвентов от тачпадов и планшетов. Может быть можно как-нибудь сэмулировать из мыши тачпад? (судя по комментарию в патче - можно, жаль что не написали как)
А может быть мне нужно просто как-то по другому сконфигурить мышь и клаву в qemu? Cейчас они определяются как PS/2 - это дефолтное поведение.
#!/bin/bash
# Guest grabs host keyboard and mouse.
# Press L.Ctrl+R.Ctrl to switch input between host and guest.
qusb=""
# webcam
if [ "$(lsusb | grep 046d:0825 | wc -l)" == "1" ]; then
echo "$(lsusb | grep 046d:0825)"
qusb+=" -device usb-host,bus=ehci.0,vendorid=0x046d,productid=0x0825,port=1"
fi
# xbox gamepads
if [ "$(lsusb | grep 045e:0719 | wc -l)" == "1" ]; then
echo "$(lsusb | grep 045e:0719)"
qusb+=" -usbdevice host:045e:0719"
fi
# spare keyboard
if [ "$(lsusb | grep 04d9:1203 | wc -l)" == "1" ]; then
echo "$(lsusb | grep 04d9:1203)"
qusb+=" -usbdevice host:04d9:1203"
fi
# spare mouse
if [ "$(lsusb | grep 09da:000a | wc -l)" == "1" ]; then
echo "$(lsusb | grep 09da:000a)"
qusb+=" -usbdevice host:09da:000a"
fi
cp /usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd /tmp/my_vars.fd
QEMU_PA_SAMPLES=128 QEMU_AUDIO_DRV=pa
qemu-system-x86_64 \
-serial none \
-parallel none \
-enable-kvm \
-name win8x64 \
-machine type=pc,accel=kvm \
-m 8196 \
-smp cores=4,threads=2,sockets=1 \
-cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time,kvm=off,hv_vendor_id=Nvidia43FIX \
-vga none \
-display none \
-soundhw hda \
-rtc base=localtime,clock=host,driftfix=none \
-object input-linux,id=kbd,evdev=/dev/input/event0,grab_all=yes \
-object input-linux,id=mouse,evdev=/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse \
-device usb-ehci,id=ehci -usb $qusb \
-device vfio-pci,host=01:00.0,multifunction=on \
-device vfio-pci,host=01:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd \
-drive if=pflash,format=raw,file=/tmp/my_vars.fd \
-device virtio-scsi-pci,id=scsi \
-drive file=/home/slowpoke/data/vm/win8x64.img,id=disk1,format=qcow2,if=none,cache=writeback -device scsi-hd,drive=disk1 \
-drive file=/dev/sda7,id=disk2,format=raw,if=none,cache=none -device scsi-hd,drive=disk2 \
-netdev user,id=lan0 -device virtio-net,netdev=lan0,mac=52:54:00:be:ef:00