blob: 11850c96ff874a54db3616ae174182e5af9ad93d [file] [log] [blame]
Gerd Hoffmann8977bd12014-05-20 09:17:01 +02001
2multiseat howto (with some multihead coverage)
3==============================================
4
Gerd Hoffmann5cce1732015-06-24 11:59:16 +02005host devices
6------------
Gerd Hoffmann8977bd12014-05-20 09:17:01 +02007
8First you must compile qemu with a user interface supporting
Gerd Hoffmann90525fe2014-06-02 15:39:54 +02009multihead/multiseat and input event routing. Right now this
Gerd Hoffmann86fdcf22014-10-02 15:53:37 +020010list includes sdl2, gtk (both 2+3) and vnc:
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020011
Thomas Huth335dbb52019-02-04 09:25:43 +010012 ./configure --enable-sdl
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020013
Gerd Hoffmann90525fe2014-06-02 15:39:54 +020014or
15
16 ./configure --enable-gtk
17
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020018
Gerd Hoffmann86fdcf22014-10-02 15:53:37 +020019Next put together the qemu command line (sdk/gtk):
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020020
Thomas Hutha1d30f22018-06-13 07:05:19 +020021qemu -accel kvm -usb $memory $disk $whatever \
Gerd Hoffmann90525fe2014-06-02 15:39:54 +020022 -display [ sdl | gtk ] \
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020023 -vga std \
24 -device usb-tablet
25
Gerd Hoffmann86fdcf22014-10-02 15:53:37 +020026That is it for the first seat, which will use the standard vga, the
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020027standard ps/2 keyboard (implicitly there) and the usb-tablet. Now the
Gerd Hoffmann86fdcf22014-10-02 15:53:37 +020028additional switches for the second seat:
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020029
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
Gerd Hoffmann5cce1732015-06-24 11:59:16 +020044Starting 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
Gerd Hoffmann90525fe2014-06-02 15:39:54 +020057The 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
Gerd Hoffmann86fdcf22014-10-02 15:53:37 +020063For vnc some additional configuration on the command line is needed.
64We'll create two vnc server instances, and bind the second one to the
Ville Skyttä9277d812018-06-12 09:51:50 +030065second seat, similar to input devices:
Gerd Hoffmann86fdcf22014-10-02 15:53:37 +020066
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
Gerd Hoffmann2082bac2014-06-02 15:48:41 +020073Note 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
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020081
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
Gerd Hoffmann35032062014-05-26 09:52:48 +020090Now we'll have to configure the guest. Boot and login. "lspci -vt"
91should list the pci bridge with the display adapter and usb controller:
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020092
Gerd Hoffmann35032062014-05-26 09:52:48 +020093 [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
Gerd Hoffmann8977bd12014-05-20 09:17:01 +020098
Gerd Hoffmann35032062014-05-26 09:52:48 +020099Good. 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:
Gerd Hoffmann8977bd12014-05-20 09:17:01 +0200102
Gerd Hoffmann35032062014-05-26 09:52:48 +0200103 [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"
Gerd Hoffmann8977bd12014-05-20 09:17:01 +0200105
Gerd Hoffmann35032062014-05-26 09:52:48 +0200106Reboot. 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/
Gerd Hoffmann8977bd12014-05-20 09:17:01 +0200121
Gerd Hoffmanneb6c6a62015-06-18 12:17:29 +0200122
123guest side with pci-bridge-seat
124-------------------------------
125
Gerd Hoffmann496eaca2015-07-01 10:59:47 +0200126Qemu version 2.4 and newer has a new pci-bridge-seat device which
Gerd Hoffmanneb6c6a62015-06-18 12:17:29 +0200127can 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
Gerd Hoffmann496eaca2015-07-01 10:59:47 +0200137Patch with this rule has been submitted to upstream udev/systemd, was
Daniel P. Berrangeb6af0972015-08-26 12:17:13 +0100138accepted and should be included in the next systemd release (222).
Gerd Hoffmann496eaca2015-07-01 10:59:47 +0200139So, if your guest has this or a newer version, multiseat will work just
140fine without any manual guest configuration.
Gerd Hoffmanneb6c6a62015-06-18 12:17:29 +0200141
Gerd Hoffmann8977bd12014-05-20 09:17:01 +0200142Enjoy!
143
144--
145Gerd Hoffmann <kraxel@redhat.com>