| multiseat howto (with some multihead coverage) | |
| ============================================== | |
| host devices | |
| ------------ | |
| First you must compile qemu with a user interface supporting | |
| multihead/multiseat and input event routing. Right now this | |
| list includes sdl2, gtk (both 2+3) and vnc: | |
| ./configure --enable-sdl | |
| or | |
| ./configure --enable-gtk | |
| Next put together the qemu command line (sdk/gtk): | |
| qemu -accel kvm -usb $memory $disk $whatever \ | |
| -display [ sdl | gtk ] \ | |
| -vga std \ | |
| -device usb-tablet | |
| That is it for the first seat, which will use the standard vga, the | |
| standard ps/2 keyboard (implicitly there) and the usb-tablet. Now the | |
| additional switches for the second seat: | |
| -device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \ | |
| -device secondary-vga,bus=head.2,addr=02.0,id=video.2 \ | |
| -device nec-usb-xhci,bus=head.2,addr=0f.0,id=usb.2 \ | |
| -device usb-kbd,bus=usb.2.0,port=1,display=video.2 \ | |
| -device usb-tablet,bus=usb.2.0,port=2,display=video.2 | |
| This places a pci bridge in slot 12, connects a display adapter and | |
| xhci (usb) controller to the bridge. Then it adds a usb keyboard and | |
| usb mouse, both connected to the xhci and linked to the display. | |
| The "display=video2" sets up the input routing. Any input coming from | |
| the window which belongs to the video.2 display adapter will be routed | |
| to these input devices. | |
| Starting with qemu 2.4 and linux kernel 4.1 you can also use virtio | |
| for the input devices, using this ... | |
| -device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \ | |
| -device secondary-vga,bus=head.2,addr=02.0,id=video.2 \ | |
| -device virtio-keyboard-pci,bus=head.2,addr=03.0,display=video.2 \ | |
| -device virtio-tablet-pci,bus=head.2,addr=03.0,display=video.2 | |
| ... instead of xhci and usb hid devices. | |
| host ui | |
| ------- | |
| The sdl2 ui will start up with two windows, one for each display | |
| device. The gtk ui will start with a single window and each display | |
| in a separate tab. You can either simply switch tabs to switch heads, | |
| or use the "View / Detach tab" menu item to move one of the displays | |
| to its own window so you can see both display devices side-by-side. | |
| For vnc some additional configuration on the command line is needed. | |
| We'll create two vnc server instances, and bind the second one to the | |
| second seat, similar to input devices: | |
| -display vnc=:1,id=primary \ | |
| -display vnc=:2,id=secondary,display=video.2 | |
| Connecting to vnc display :1 gives you access to the first seat, and | |
| likewise connecting to vnc display :2 shows the second seat. | |
| Note on spice: Spice handles multihead just fine. But it can't do | |
| multiseat. For tablet events the event source is sent to the spice | |
| agent. But qemu can't figure it, so it can't do input routing. | |
| Fixing this needs a new or extended input interface between | |
| libspice-server and qemu. For keyboard events it is even worse: The | |
| event source isn't included in the spice protocol, so the wire | |
| protocol must be extended to support this. | |
| guest side | |
| ---------- | |
| You need a pretty recent linux guest. systemd with loginctl. kernel | |
| 3.14+ with CONFIG_DRM_BOCHS enabled. Fedora 20 will do. Must be | |
| fully updated for the new kernel though, i.e. the live iso doesn't cut | |
| it. | |
| Now we'll have to configure the guest. Boot and login. "lspci -vt" | |
| should list the pci bridge with the display adapter and usb controller: | |
| [root@fedora ~]# lspci -vt | |
| -[0000:00]-+-00.0 Intel Corporation 440FX - 82441FX PMC [Natoma] | |
| [ ... ] | |
| \-12.0-[01]--+-02.0 Device 1234:1111 | |
| \-0f.0 NEC Corporation USB 3.0 Host Controller | |
| Good. Now lets tell the system that the pci bridge and all devices | |
| below it belong to a separate seat by dropping a file into | |
| /etc/udev/rules.d: | |
| [root@fedora ~]# cat /etc/udev/rules.d/70-qemu-autoseat.rules | |
| SUBSYSTEMS=="pci", DEVPATH=="*/0000:00:12.0", TAG+="seat", ENV{ID_AUTOSEAT}="1" | |
| Reboot. System should come up with two seats. With loginctl you can | |
| check the configuration: | |
| [root@fedora ~]# loginctl list-seats | |
| SEAT | |
| seat0 | |
| seat-pci-pci-0000_00_12_0 | |
| 2 seats listed. | |
| You can use "loginctl seat-status seat-pci-pci-0000_00_12_0" to list | |
| the devices attached to the seat. | |
| Background info is here: | |
| http://www.freedesktop.org/wiki/Software/systemd/multiseat/ | |
| guest side with pci-bridge-seat | |
| ------------------------------- | |
| QEMU version 2.4 and newer has a new pci-bridge-seat device which | |
| can be used instead of pci-bridge. Just swap the device name in the | |
| qemu command line above. The only difference between the two devices | |
| is the pci id. We can match the pci id instead of the device path | |
| with a nice generic rule now, which simplifies the guest | |
| configuration: | |
| [root@fedora ~]# cat /etc/udev/rules.d/70-qemu-pci-bridge-seat.rules | |
| SUBSYSTEM=="pci", ATTR{vendor}=="0x1b36", ATTR{device}=="0x000a", \ | |
| TAG+="seat", ENV{ID_AUTOSEAT}="1" | |
| Patch with this rule has been submitted to upstream udev/systemd, was | |
| accepted and should be included in the next systemd release (222). | |
| So, if your guest has this or a newer version, multiseat will work just | |
| fine without any manual guest configuration. | |
| Enjoy! | |
| -- | |
| Gerd Hoffmann <kraxel@redhat.com> |