multiseat.txt 5.0 KB
Newer Older
G
Gerd Hoffmann 已提交
1 2 3 4

multiseat howto (with some multihead coverage)
==============================================

5 6
host devices
------------
G
Gerd Hoffmann 已提交
7 8

First you must compile qemu with a user interface supporting
9
multihead/multiseat and input event routing.  Right now this
G
Gerd Hoffmann 已提交
10
list includes sdl2, gtk (both 2+3) and vnc:
G
Gerd Hoffmann 已提交
11 12 13

  ./configure --enable-sdl --with-sdlabi=2.0

14 15 16 17
or

  ./configure --enable-gtk

G
Gerd Hoffmann 已提交
18

G
Gerd Hoffmann 已提交
19
Next put together the qemu command line (sdk/gtk):
G
Gerd Hoffmann 已提交
20

21
qemu	-accel kvm -usb $memory $disk $whatever \
22
	-display [ sdl | gtk ] \
G
Gerd Hoffmann 已提交
23 24 25
	-vga std \
	-device usb-tablet

G
Gerd Hoffmann 已提交
26
That is it for the first seat, which will use the standard vga, the
G
Gerd Hoffmann 已提交
27
standard ps/2 keyboard (implicitly there) and the usb-tablet.  Now the
G
Gerd Hoffmann 已提交
28
additional switches for the second seat:
G
Gerd Hoffmann 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

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

44 45 46 47 48 49 50 51 52 53 54 55 56
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
-------

57 58 59 60 61 62
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.

G
Gerd Hoffmann 已提交
63 64
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
V
Ville Skyttä 已提交
65
second seat, similar to input devices:
G
Gerd Hoffmann 已提交
66 67 68 69 70 71 72

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

73 74 75 76 77 78 79 80
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.

G
Gerd Hoffmann 已提交
81 82 83 84 85 86 87 88 89

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.

G
Gerd Hoffmann 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
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/
G
Gerd Hoffmann 已提交
121

G
Gerd Hoffmann 已提交
122 123 124 125

guest side with pci-bridge-seat
-------------------------------

126
Qemu version 2.4 and newer has a new pci-bridge-seat device which
G
Gerd Hoffmann 已提交
127 128 129 130 131 132 133 134 135 136
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"

137
Patch with this rule has been submitted to upstream udev/systemd, was
138
accepted and should be included in the next systemd release (222).
139 140
So, if your guest has this or a newer version, multiseat will work just
fine without any manual guest configuration.
G
Gerd Hoffmann 已提交
141

G
Gerd Hoffmann 已提交
142 143 144 145
Enjoy!

--
Gerd Hoffmann <kraxel@redhat.com>