2014-05-20 09:17:01 +02:00
|
|
|
|
|
|
|
multiseat howto (with some multihead coverage)
|
|
|
|
==============================================
|
|
|
|
|
2015-06-24 11:59:16 +02:00
|
|
|
host devices
|
|
|
|
------------
|
2014-05-20 09:17:01 +02:00
|
|
|
|
|
|
|
First you must compile qemu with a user interface supporting
|
2014-06-02 15:39:54 +02:00
|
|
|
multihead/multiseat and input event routing. Right now this
|
2014-10-02 15:53:37 +02:00
|
|
|
list includes sdl2, gtk (both 2+3) and vnc:
|
2014-05-20 09:17:01 +02:00
|
|
|
|
2019-02-04 09:25:43 +01:00
|
|
|
./configure --enable-sdl
|
2014-05-20 09:17:01 +02:00
|
|
|
|
2014-06-02 15:39:54 +02:00
|
|
|
or
|
|
|
|
|
|
|
|
./configure --enable-gtk
|
|
|
|
|
2014-05-20 09:17:01 +02:00
|
|
|
|
2014-10-02 15:53:37 +02:00
|
|
|
Next put together the qemu command line (sdk/gtk):
|
2014-05-20 09:17:01 +02:00
|
|
|
|
2018-06-13 07:05:19 +02:00
|
|
|
qemu -accel kvm -usb $memory $disk $whatever \
|
2014-06-02 15:39:54 +02:00
|
|
|
-display [ sdl | gtk ] \
|
2014-05-20 09:17:01 +02:00
|
|
|
-vga std \
|
|
|
|
-device usb-tablet
|
|
|
|
|
2014-10-02 15:53:37 +02:00
|
|
|
That is it for the first seat, which will use the standard vga, the
|
2014-05-20 09:17:01 +02:00
|
|
|
standard ps/2 keyboard (implicitly there) and the usb-tablet. Now the
|
2014-10-02 15:53:37 +02:00
|
|
|
additional switches for the second seat:
|
2014-05-20 09:17:01 +02:00
|
|
|
|
|
|
|
-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.
|
|
|
|
|
2015-06-24 11:59:16 +02:00
|
|
|
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
|
|
|
|
-------
|
|
|
|
|
2014-06-02 15:39:54 +02:00
|
|
|
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.
|
|
|
|
|
2014-10-02 15:53:37 +02:00
|
|
|
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
|
2018-06-12 08:51:50 +02:00
|
|
|
second seat, similar to input devices:
|
2014-10-02 15:53:37 +02:00
|
|
|
|
|
|
|
-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.
|
|
|
|
|
2014-06-02 15:48:41 +02:00
|
|
|
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.
|
|
|
|
|
2014-05-20 09:17:01 +02:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2014-05-26 09:52:48 +02:00
|
|
|
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/
|
2014-05-20 09:17:01 +02:00
|
|
|
|
2015-06-18 12:17:29 +02:00
|
|
|
|
|
|
|
guest side with pci-bridge-seat
|
|
|
|
-------------------------------
|
|
|
|
|
2021-11-18 15:34:01 +01:00
|
|
|
QEMU version 2.4 and newer has a new pci-bridge-seat device which
|
2015-06-18 12:17:29 +02:00
|
|
|
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"
|
|
|
|
|
2015-07-01 10:59:47 +02:00
|
|
|
Patch with this rule has been submitted to upstream udev/systemd, was
|
2015-08-26 13:17:13 +02:00
|
|
|
accepted and should be included in the next systemd release (222).
|
2015-07-01 10:59:47 +02:00
|
|
|
So, if your guest has this or a newer version, multiseat will work just
|
|
|
|
fine without any manual guest configuration.
|
2015-06-18 12:17:29 +02:00
|
|
|
|
2014-05-20 09:17:01 +02:00
|
|
|
Enjoy!
|
|
|
|
|
|
|
|
--
|
|
|
|
Gerd Hoffmann <kraxel@redhat.com>
|