 9277d81f5c
			
		
	
	
		9277d81f5c
		
	
	
	
	
		
			
			Signed-off-by: Ville Skyttä <ville.skytta@iki.fi> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Eric Blake <eblake@redhat.com> Message-id: 20180612065150.21110-1-ville.skytta@iki.fi Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
		
			
				
	
	
		
			146 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| multiseat howto (with some multihead coverage)
 | |
| ==============================================
 | |
| 
 | |
| host devices
 | |
| ------------
 | |
| 
 | |
| First you must compile qemu with a user interface supporting
 | |
| multihead/multiseat and input event routing.  Right now this
 | |
| list includes sdl2, gtk (both 2+3) and vnc:
 | |
| 
 | |
|   ./configure --enable-sdl --with-sdlabi=2.0
 | |
| 
 | |
| or
 | |
| 
 | |
|   ./configure --enable-gtk
 | |
| 
 | |
| 
 | |
| Next put together the qemu command line (sdk/gtk):
 | |
| 
 | |
| qemu	-accel kvm -usb $memory $disk $whatever \
 | |
| 	-display [ sdl | gtk ] \
 | |
| 	-vga std \
 | |
| 	-device usb-tablet
 | |
| 
 | |
| That is it for the first seat, which will use the standard vga, the
 | |
| standard ps/2 keyboard (implicitly there) and the usb-tablet.  Now the
 | |
| additional switches for the second seat:
 | |
| 
 | |
| 	-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.
 | |
| 
 | |
| 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
 | |
| -------
 | |
| 
 | |
| 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.
 | |
| 
 | |
| 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
 | |
| second seat, similar to input devices:
 | |
| 
 | |
| 	-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.
 | |
| 
 | |
| 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.
 | |
| 
 | |
| 
 | |
| 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.
 | |
| 
 | |
| 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/
 | |
| 
 | |
| 
 | |
| guest side with pci-bridge-seat
 | |
| -------------------------------
 | |
| 
 | |
| Qemu version 2.4 and newer has a new pci-bridge-seat device which
 | |
| 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"
 | |
| 
 | |
| Patch with this rule has been submitted to upstream udev/systemd, was
 | |
| accepted and should be included in the next systemd release (222).
 | |
| So, if your guest has this or a newer version, multiseat will work just
 | |
| fine without any manual guest configuration.
 | |
| 
 | |
| Enjoy!
 | |
| 
 | |
| --
 | |
| Gerd Hoffmann <kraxel@redhat.com>
 |