1 2multiseat howto (with some multihead coverage) 3============================================== 4 5host side 6--------- 7 8First you must compile qemu with a user interface supporting 9multihead/multiseat and input event routing. Right now this 10list includes sdl2, gtk (both 2+3) and vnc: 11 12 ./configure --enable-sdl --with-sdlabi=2.0 13 14or 15 16 ./configure --enable-gtk 17 18 19Next put together the qemu command line (sdk/gtk): 20 21qemu -enable-kvm -usb $memory $disk $whatever \ 22 -display [ sdl | gtk ] \ 23 -vga std \ 24 -device usb-tablet 25 26That is it for the first seat, which will use the standard vga, the 27standard ps/2 keyboard (implicitly there) and the usb-tablet. Now the 28additional switches for the second seat: 29 30 -device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \ 31 -device secondary-vga,bus=head.2,addr=02.0,id=video.2 \ 32 -device nec-usb-xhci,bus=head.2,addr=0f.0,id=usb.2 \ 33 -device usb-kbd,bus=usb.2.0,port=1,display=video.2 \ 34 -device usb-tablet,bus=usb.2.0,port=2,display=video.2 35 36This places a pci bridge in slot 12, connects a display adapter and 37xhci (usb) controller to the bridge. Then it adds a usb keyboard and 38usb mouse, both connected to the xhci and linked to the display. 39 40The "display=video2" sets up the input routing. Any input coming from 41the window which belongs to the video.2 display adapter will be routed 42to these input devices. 43 44The sdl2 ui will start up with two windows, one for each display 45device. The gtk ui will start with a single window and each display 46in a separate tab. You can either simply switch tabs to switch heads, 47or use the "View / Detach tab" menu item to move one of the displays 48to its own window so you can see both display devices side-by-side. 49 50For vnc some additional configuration on the command line is needed. 51We'll create two vnc server instances, and bind the second one to the 52second seat, simliar to input devices: 53 54 -display vnc=:1,id=primary \ 55 -display vnc=:2,id=secondary,display=video.2 56 57Connecting to vnc display :1 gives you access to the first seat, and 58likewise connecting to vnc display :2 shows the second seat. 59 60Note on spice: Spice handles multihead just fine. But it can't do 61multiseat. For tablet events the event source is sent to the spice 62agent. But qemu can't figure it, so it can't do input routing. 63Fixing this needs a new or extended input interface between 64libspice-server and qemu. For keyboard events it is even worse: The 65event source isn't included in the spice protocol, so the wire 66protocol must be extended to support this. 67 68 69guest side 70---------- 71 72You need a pretty recent linux guest. systemd with loginctl. kernel 733.14+ with CONFIG_DRM_BOCHS enabled. Fedora 20 will do. Must be 74fully updated for the new kernel though, i.e. the live iso doesn't cut 75it. 76 77Now we'll have to configure the guest. Boot and login. "lspci -vt" 78should list the pci bridge with the display adapter and usb controller: 79 80 [root@fedora ~]# lspci -vt 81 -[0000:00]-+-00.0 Intel Corporation 440FX - 82441FX PMC [Natoma] 82 [ ... ] 83 \-12.0-[01]--+-02.0 Device 1234:1111 84 \-0f.0 NEC Corporation USB 3.0 Host Controller 85 86Good. Now lets tell the system that the pci bridge and all devices 87below it belong to a separate seat by dropping a file into 88/etc/udev/rules.d: 89 90 [root@fedora ~]# cat /etc/udev/rules.d/70-qemu-autoseat.rules 91 SUBSYSTEMS=="pci", DEVPATH=="*/0000:00:12.0", TAG+="seat", ENV{ID_AUTOSEAT}="1" 92 93Reboot. System should come up with two seats. With loginctl you can 94check the configuration: 95 96 [root@fedora ~]# loginctl list-seats 97 SEAT 98 seat0 99 seat-pci-pci-0000_00_12_0 100 101 2 seats listed. 102 103You can use "loginctl seat-status seat-pci-pci-0000_00_12_0" to list 104the devices attached to the seat. 105 106Background info is here: 107 http://www.freedesktop.org/wiki/Software/systemd/multiseat/ 108 109 110guest side with pci-bridge-seat 111------------------------------- 112 113Qemu version FIXME and newer has a new pci-bridge-seat device which 114can be used instead of pci-bridge. Just swap the device name in the 115qemu command line above. The only difference between the two devices 116is the pci id. We can match the pci id instead of the device path 117with a nice generic rule now, which simplifies the guest 118configuration: 119 120 [root@fedora ~]# cat /etc/udev/rules.d/70-qemu-pci-bridge-seat.rules 121 SUBSYSTEM=="pci", ATTR{vendor}=="0x1b36", ATTR{device}=="0x000a", \ 122 TAG+="seat", ENV{ID_AUTOSEAT}="1" 123 124Patch with this rule will be submitted to upstream udev/systemd, so 125long-term, when systemd with this lands in distros, things will work 126just fine without any manual guest configuration. 127 128Enjoy! 129 130-- 131Gerd Hoffmann <kraxel@redhat.com> 132