|  | 
 | 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> |