qemu/docs/multiseat.txt
<<
>>
Prefs
   1
   2multiseat howto (with some multihead coverage)
   3==============================================
   4
   5host devices
   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
  44Starting with qemu 2.4 and linux kernel 4.1 you can also use virtio
  45for the input devices, using this ...
  46
  47        -device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \
  48        -device secondary-vga,bus=head.2,addr=02.0,id=video.2 \
  49        -device virtio-keyboard-pci,bus=head.2,addr=03.0,display=video.2 \
  50        -device virtio-tablet-pci,bus=head.2,addr=03.0,display=video.2
  51
  52... instead of xhci and usb hid devices.
  53
  54host ui
  55-------
  56
  57The sdl2 ui will start up with two windows, one for each display
  58device.  The gtk ui will start with a single window and each display
  59in a separate tab.  You can either simply switch tabs to switch heads,
  60or use the "View / Detach tab" menu item to move one of the displays
  61to its own window so you can see both display devices side-by-side.
  62
  63For vnc some additional configuration on the command line is needed.
  64We'll create two vnc server instances, and bind the second one to the
  65second seat, simliar to input devices:
  66
  67        -display vnc=:1,id=primary \
  68        -display vnc=:2,id=secondary,display=video.2
  69
  70Connecting to vnc display :1 gives you access to the first seat, and
  71likewise connecting to vnc display :2 shows the second seat.
  72
  73Note on spice: Spice handles multihead just fine.  But it can't do
  74multiseat.  For tablet events the event source is sent to the spice
  75agent.  But qemu can't figure it, so it can't do input routing.
  76Fixing this needs a new or extended input interface between
  77libspice-server and qemu.  For keyboard events it is even worse:  The
  78event source isn't included in the spice protocol, so the wire
  79protocol must be extended to support this.
  80
  81
  82guest side
  83----------
  84
  85You need a pretty recent linux guest.  systemd with loginctl.  kernel
  863.14+ with CONFIG_DRM_BOCHS enabled.  Fedora 20 will do.  Must be
  87fully updated for the new kernel though, i.e. the live iso doesn't cut
  88it.
  89
  90Now we'll have to configure the guest.  Boot and login.  "lspci -vt"
  91should list the pci bridge with the display adapter and usb controller:
  92
  93    [root@fedora ~]# lspci -vt
  94    -[0000:00]-+-00.0  Intel Corporation 440FX - 82441FX PMC [Natoma]
  95               [ ... ]
  96               \-12.0-[01]--+-02.0  Device 1234:1111
  97                            \-0f.0  NEC Corporation USB 3.0 Host Controller
  98
  99Good.  Now lets tell the system that the pci bridge and all devices
 100below it belong to a separate seat by dropping a file into
 101/etc/udev/rules.d:
 102
 103    [root@fedora ~]# cat /etc/udev/rules.d/70-qemu-autoseat.rules
 104    SUBSYSTEMS=="pci", DEVPATH=="*/0000:00:12.0", TAG+="seat", ENV{ID_AUTOSEAT}="1"
 105
 106Reboot.  System should come up with two seats.  With loginctl you can
 107check the configuration:
 108
 109    [root@fedora ~]# loginctl list-seats
 110    SEAT
 111    seat0
 112    seat-pci-pci-0000_00_12_0
 113
 114    2 seats listed.
 115
 116You can use "loginctl seat-status seat-pci-pci-0000_00_12_0" to list
 117the devices attached to the seat.
 118
 119Background info is here:
 120  http://www.freedesktop.org/wiki/Software/systemd/multiseat/
 121
 122
 123guest side with pci-bridge-seat
 124-------------------------------
 125
 126Qemu version 2.4 and newer has a new pci-bridge-seat device which
 127can be used instead of pci-bridge.  Just swap the device name in the
 128qemu command line above.  The only difference between the two devices
 129is the pci id.  We can match the pci id instead of the device path
 130with a nice generic rule now, which simplifies the guest
 131configuration:
 132
 133    [root@fedora ~]# cat /etc/udev/rules.d/70-qemu-pci-bridge-seat.rules
 134    SUBSYSTEM=="pci", ATTR{vendor}=="0x1b36", ATTR{device}=="0x000a", \
 135            TAG+="seat", ENV{ID_AUTOSEAT}="1"
 136
 137Patch with this rule has been submitted to upstream udev/systemd, was
 138accepted and should be included in the next systemd release (222).
 139So, if your guest has this or a newer version, multiseat will work just
 140fine without any manual guest configuration.
 141
 142Enjoy!
 143
 144--
 145Gerd Hoffmann <kraxel@redhat.com>
 146