]>
Commit | Line | Data |
---|---|---|
8977bd11 GH |
1 | |
2 | multiseat howto (with some multihead coverage) | |
3 | ============================================== | |
4 | ||
5cce1733 GH |
5 | host devices |
6 | ------------ | |
8977bd11 GH |
7 | |
8 | First you must compile qemu with a user interface supporting | |
90525fe2 | 9 | multihead/multiseat and input event routing. Right now this |
86fdcf23 | 10 | list includes sdl2, gtk (both 2+3) and vnc: |
8977bd11 GH |
11 | |
12 | ./configure --enable-sdl --with-sdlabi=2.0 | |
13 | ||
90525fe2 GH |
14 | or |
15 | ||
16 | ./configure --enable-gtk | |
17 | ||
8977bd11 | 18 | |
86fdcf23 | 19 | Next put together the qemu command line (sdk/gtk): |
8977bd11 | 20 | |
a1d30f28 | 21 | qemu -accel kvm -usb $memory $disk $whatever \ |
90525fe2 | 22 | -display [ sdl | gtk ] \ |
8977bd11 GH |
23 | -vga std \ |
24 | -device usb-tablet | |
25 | ||
86fdcf23 | 26 | That is it for the first seat, which will use the standard vga, the |
8977bd11 | 27 | standard ps/2 keyboard (implicitly there) and the usb-tablet. Now the |
86fdcf23 | 28 | additional switches for the second seat: |
8977bd11 GH |
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 | ||
5cce1733 GH |
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 | ||
90525fe2 GH |
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 | ||
86fdcf23 GH |
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 | |
65 | second seat, simliar to input devices: | |
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 | ||
2082bac1 GH |
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 | ||
8977bd11 GH |
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 | ||
3503206a GH |
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: | |
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 | ||
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: | |
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 | ||
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/ | |
8977bd11 | 121 | |
eb6c6a60 GH |
122 | |
123 | guest side with pci-bridge-seat | |
124 | ------------------------------- | |
125 | ||
496eacaa | 126 | Qemu version 2.4 and newer has a new pci-bridge-seat device which |
eb6c6a60 GH |
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 | ||
496eacaa | 137 | Patch with this rule has been submitted to upstream udev/systemd, was |
b6af0975 | 138 | accepted and should be included in the next systemd release (222). |
496eacaa GH |
139 | So, if your guest has this or a newer version, multiseat will work just |
140 | fine without any manual guest configuration. | |
eb6c6a60 | 141 | |
8977bd11 GH |
142 | Enjoy! |
143 | ||
144 | -- | |
145 | Gerd Hoffmann <[email protected]> |