Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 1 | |
| 2 | multiseat howto (with some multihead coverage) |
| 3 | ============================================== |
| 4 | |
Gerd Hoffmann | 5cce173 | 2015-06-24 11:59:16 +0200 | [diff] [blame] | 5 | host devices |
| 6 | ------------ |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 7 | |
| 8 | First you must compile qemu with a user interface supporting |
Gerd Hoffmann | 90525fe | 2014-06-02 15:39:54 +0200 | [diff] [blame] | 9 | multihead/multiseat and input event routing. Right now this |
Gerd Hoffmann | 86fdcf2 | 2014-10-02 15:53:37 +0200 | [diff] [blame] | 10 | list includes sdl2, gtk (both 2+3) and vnc: |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 11 | |
Thomas Huth | 335dbb5 | 2019-02-04 09:25:43 +0100 | [diff] [blame] | 12 | ./configure --enable-sdl |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 13 | |
Gerd Hoffmann | 90525fe | 2014-06-02 15:39:54 +0200 | [diff] [blame] | 14 | or |
| 15 | |
| 16 | ./configure --enable-gtk |
| 17 | |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 18 | |
Gerd Hoffmann | 86fdcf2 | 2014-10-02 15:53:37 +0200 | [diff] [blame] | 19 | Next put together the qemu command line (sdk/gtk): |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 20 | |
Thomas Huth | a1d30f2 | 2018-06-13 07:05:19 +0200 | [diff] [blame] | 21 | qemu -accel kvm -usb $memory $disk $whatever \ |
Gerd Hoffmann | 90525fe | 2014-06-02 15:39:54 +0200 | [diff] [blame] | 22 | -display [ sdl | gtk ] \ |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 23 | -vga std \ |
| 24 | -device usb-tablet |
| 25 | |
Gerd Hoffmann | 86fdcf2 | 2014-10-02 15:53:37 +0200 | [diff] [blame] | 26 | That is it for the first seat, which will use the standard vga, the |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 27 | standard ps/2 keyboard (implicitly there) and the usb-tablet. Now the |
Gerd Hoffmann | 86fdcf2 | 2014-10-02 15:53:37 +0200 | [diff] [blame] | 28 | additional switches for the second seat: |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 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 | |
| 36 | This places a pci bridge in slot 12, connects a display adapter and |
| 37 | xhci (usb) controller to the bridge. Then it adds a usb keyboard and |
| 38 | usb mouse, both connected to the xhci and linked to the display. |
| 39 | |
| 40 | The "display=video2" sets up the input routing. Any input coming from |
| 41 | the window which belongs to the video.2 display adapter will be routed |
| 42 | to these input devices. |
| 43 | |
Gerd Hoffmann | 5cce173 | 2015-06-24 11:59:16 +0200 | [diff] [blame] | 44 | Starting with qemu 2.4 and linux kernel 4.1 you can also use virtio |
| 45 | for 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 | |
| 54 | host ui |
| 55 | ------- |
| 56 | |
Gerd Hoffmann | 90525fe | 2014-06-02 15:39:54 +0200 | [diff] [blame] | 57 | The sdl2 ui will start up with two windows, one for each display |
| 58 | device. The gtk ui will start with a single window and each display |
| 59 | in a separate tab. You can either simply switch tabs to switch heads, |
| 60 | or use the "View / Detach tab" menu item to move one of the displays |
| 61 | to its own window so you can see both display devices side-by-side. |
| 62 | |
Gerd Hoffmann | 86fdcf2 | 2014-10-02 15:53:37 +0200 | [diff] [blame] | 63 | For vnc some additional configuration on the command line is needed. |
| 64 | We'll create two vnc server instances, and bind the second one to the |
Ville Skyttä | 9277d81 | 2018-06-12 09:51:50 +0300 | [diff] [blame] | 65 | second seat, similar to input devices: |
Gerd Hoffmann | 86fdcf2 | 2014-10-02 15:53:37 +0200 | [diff] [blame] | 66 | |
| 67 | -display vnc=:1,id=primary \ |
| 68 | -display vnc=:2,id=secondary,display=video.2 |
| 69 | |
| 70 | Connecting to vnc display :1 gives you access to the first seat, and |
| 71 | likewise connecting to vnc display :2 shows the second seat. |
| 72 | |
Gerd Hoffmann | 2082bac | 2014-06-02 15:48:41 +0200 | [diff] [blame] | 73 | Note on spice: Spice handles multihead just fine. But it can't do |
| 74 | multiseat. For tablet events the event source is sent to the spice |
| 75 | agent. But qemu can't figure it, so it can't do input routing. |
| 76 | Fixing this needs a new or extended input interface between |
| 77 | libspice-server and qemu. For keyboard events it is even worse: The |
| 78 | event source isn't included in the spice protocol, so the wire |
| 79 | protocol must be extended to support this. |
| 80 | |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 81 | |
| 82 | guest side |
| 83 | ---------- |
| 84 | |
| 85 | You need a pretty recent linux guest. systemd with loginctl. kernel |
| 86 | 3.14+ with CONFIG_DRM_BOCHS enabled. Fedora 20 will do. Must be |
| 87 | fully updated for the new kernel though, i.e. the live iso doesn't cut |
| 88 | it. |
| 89 | |
Gerd Hoffmann | 3503206 | 2014-05-26 09:52:48 +0200 | [diff] [blame] | 90 | Now we'll have to configure the guest. Boot and login. "lspci -vt" |
| 91 | should list the pci bridge with the display adapter and usb controller: |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 92 | |
Gerd Hoffmann | 3503206 | 2014-05-26 09:52:48 +0200 | [diff] [blame] | 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 |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 98 | |
Gerd Hoffmann | 3503206 | 2014-05-26 09:52:48 +0200 | [diff] [blame] | 99 | Good. Now lets tell the system that the pci bridge and all devices |
| 100 | below it belong to a separate seat by dropping a file into |
| 101 | /etc/udev/rules.d: |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 102 | |
Gerd Hoffmann | 3503206 | 2014-05-26 09:52:48 +0200 | [diff] [blame] | 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" |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 105 | |
Gerd Hoffmann | 3503206 | 2014-05-26 09:52:48 +0200 | [diff] [blame] | 106 | Reboot. System should come up with two seats. With loginctl you can |
| 107 | check 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 | |
| 116 | You can use "loginctl seat-status seat-pci-pci-0000_00_12_0" to list |
| 117 | the devices attached to the seat. |
| 118 | |
| 119 | Background info is here: |
| 120 | http://www.freedesktop.org/wiki/Software/systemd/multiseat/ |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 121 | |
Gerd Hoffmann | eb6c6a6 | 2015-06-18 12:17:29 +0200 | [diff] [blame] | 122 | |
| 123 | guest side with pci-bridge-seat |
| 124 | ------------------------------- |
| 125 | |
Gerd Hoffmann | 496eaca | 2015-07-01 10:59:47 +0200 | [diff] [blame] | 126 | Qemu version 2.4 and newer has a new pci-bridge-seat device which |
Gerd Hoffmann | eb6c6a6 | 2015-06-18 12:17:29 +0200 | [diff] [blame] | 127 | can be used instead of pci-bridge. Just swap the device name in the |
| 128 | qemu command line above. The only difference between the two devices |
| 129 | is the pci id. We can match the pci id instead of the device path |
| 130 | with a nice generic rule now, which simplifies the guest |
| 131 | configuration: |
| 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 Hoffmann | 496eaca | 2015-07-01 10:59:47 +0200 | [diff] [blame] | 137 | Patch with this rule has been submitted to upstream udev/systemd, was |
Daniel P. Berrange | b6af097 | 2015-08-26 12:17:13 +0100 | [diff] [blame] | 138 | accepted and should be included in the next systemd release (222). |
Gerd Hoffmann | 496eaca | 2015-07-01 10:59:47 +0200 | [diff] [blame] | 139 | So, if your guest has this or a newer version, multiseat will work just |
| 140 | fine without any manual guest configuration. |
Gerd Hoffmann | eb6c6a6 | 2015-06-18 12:17:29 +0200 | [diff] [blame] | 141 | |
Gerd Hoffmann | 8977bd1 | 2014-05-20 09:17:01 +0200 | [diff] [blame] | 142 | Enjoy! |
| 143 | |
| 144 | -- |
| 145 | Gerd Hoffmann <kraxel@redhat.com> |