diff mbox

[6/6] docs: add multiseat.txt

Message ID 1400594447-16637-7-git-send-email-kraxel@redhat.com
State New
Headers show

Commit Message

Gerd Hoffmann May 20, 2014, 2 p.m. UTC
Howto on setting up multiseat for guests.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 docs/multiseat.txt | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)
 create mode 100644 docs/multiseat.txt

Comments

Paolo Bonzini May 20, 2014, 6:08 p.m. UTC | #1
Il 20/05/2014 16:00, Gerd Hoffmann ha scritto:
> +	-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.
> +

Is there anything about the window that we would like to configure?  If 
so, should this be something like

	-object window,id=window.2 \
	-device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \
	-device secondary-vga,bus=head.2,addr=02.0,window=window.2 \
	-device nec-usb-xhci,bus=head.2,addr=0f.0,id=usb.2 \
	-device usb-kbd,bus=usb.2.0,port=1,window=window.2 \
	-device usb-tablet,bus=usb.2.0,port=2,window=window.2

?

Paolo
Gerd Hoffmann May 21, 2014, 8:38 a.m. UTC | #2
On Di, 2014-05-20 at 20:08 +0200, Paolo Bonzini wrote:
> Il 20/05/2014 16:00, Gerd Hoffmann ha scritto:
> > +	-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.
> > +
> 
> Is there anything about the window that we would like to configure?  If 
> so, should this be something like
> 
> 	-object window,id=window.2 \
> 	-device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \
> 	-device secondary-vga,bus=head.2,addr=02.0,window=window.2 \
> 	-device nec-usb-xhci,bus=head.2,addr=0f.0,id=usb.2 \
> 	-device usb-kbd,bus=usb.2.0,port=1,window=window.2 \
> 	-device usb-tablet,bus=usb.2.0,port=2,window=window.2
> 
> ?

The "window" is a QemuConsole.  Which is a object already, visible
in /backend/console[nr].  Has a device link pointing to the display
device it is bound to.

QemuConsoles are automatically created by display devices and don't have
ids, so we lookup them using the display device id.  See
qemu_input_handler_bind in patch #3.

If there is anything to configure then it most likely will be ui
specific, i.e. we could possibly allow something like this ...

   -display gtk,display=video.1 \
   -vnc :0,display=video.2

... to have one head show up on gtk and the other on vnc (needs '-vga
none -device VGA,id=video.1' instead of '-vga std').

cheers,
  Gerd
Paolo Bonzini May 21, 2014, 9:18 a.m. UTC | #3
Il 21/05/2014 10:38, Gerd Hoffmann ha scritto:
> On Di, 2014-05-20 at 20:08 +0200, Paolo Bonzini wrote:
>> Is there anything about the window that we would like to configure?  If
>> so, should this be something like
>>
>> 	-object window,id=window.2 \
>> 	-device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \
>> 	-device secondary-vga,bus=head.2,addr=02.0,window=window.2 \
>> 	-device nec-usb-xhci,bus=head.2,addr=0f.0,id=usb.2 \
>> 	-device usb-kbd,bus=usb.2.0,port=1,window=window.2 \
>> 	-device usb-tablet,bus=usb.2.0,port=2,window=window.2
>>
>> ?
>
> The "window" is a QemuConsole.  Which is a object already, visible
> in /backend/console[nr].  Has a device link pointing to the display
> device it is bound to.
>
> QemuConsoles are automatically created by display devices and don't have
> ids, so we lookup them using the display device id.  See
> qemu_input_handler_bind in patch #3.
>
> If there is anything to configure then it most likely will be ui
> specific, i.e. we could possibly allow something like this ...
>
>    -display gtk,display=video.1 \
>    -vnc :0,display=video.2
>
> ... to have one head show up on gtk and the other on vnc (needs '-vga
> none -device VGA,id=video.1' instead of '-vga std').

How would you configure the case where one input goes to multiple heads 
(e.g. 2 seats, 4 monitors)?

Paolo
Gerd Hoffmann May 21, 2014, 9:51 a.m. UTC | #4
Hi,

> > If there is anything to configure then it most likely will be ui
> > specific, i.e. we could possibly allow something like this ...
> >
> >    -display gtk,display=video.1 \
> >    -vnc :0,display=video.2
> >
> > ... to have one head show up on gtk and the other on vnc (needs '-vga
> > none -device VGA,id=video.1' instead of '-vga std').
> 
> How would you configure the case where one input goes to multiple heads 
> (e.g. 2 seats, 4 monitors)?

You need one keyboard per head (i.e. 2) and one tablet per display (i.e.
4).  The usb tablet has a additional head property, so you can specify
which tablet belongs to which monitor.  You also need a vga card which
supports multiple heads (non-upstream virtio-gpu will do).

Not figured yet how to do guest configuration (teach X server which
tablet belongs to which monitor) for the multihead case.

Note: qxl supports multi-head already, but can't be used for this as it
goes spice-specific side ways to get the job done.  Fixing that is on my
todo list, but it isn't trivial, especially the backward compatibility.
Probably also needs spice-server changes.

cheers,
  Gerd
diff mbox

Patch

diff --git a/docs/multiseat.txt b/docs/multiseat.txt
new file mode 100644
index 0000000..a6c71dd
--- /dev/null
+++ b/docs/multiseat.txt
@@ -0,0 +1,76 @@ 
+
+multiseat howto (with some multihead coverage)
+==============================================
+
+host side
+---------
+
+First you must compile qemu with a user interface supporting
+multihead/multiseat and input event routing.  Right now this list is
+pretty short: sdl2.
+
+  ./configure --enable-sdl --with-sdlabi=2.0
+
+
+Next put together the qemu command line:
+
+qemu	-enable-kvm -usb $memory $disk $whatever \
+	-display sdl \
+	-vga std \
+	-device usb-tablet
+
+That is it for the first head, which will use the standard vga, the
+standard ps/2 keyboard (implicitly there) and the usb-tablet.  Now the
+additional switches for the second head:
+
+	-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.
+
+
+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.  By default
+all devices belong to seat0.  You can use "loginctl seat-status seat0"
+to list them all (and to get the sysfs paths for cut+paste).  Now
+we'll go assign all pci devices connected the pci bridge in slot 12 to
+a new head:
+
+loginctl attach seat-qemu \
+	 /sys/devices/pci0000:00/0000:00:12.0/0000:01:02.0/drm/card1
+loginctl attach seat-qemu \
+	 /sys/devices/pci0000:00/0000:00:12.0/0000:01:02.0/graphics/fb1
+loginctl attach seat-qemu \
+	 /sys/devices/pci0000:00/0000:00:12.0/0000:01:0f.0/usb2
+
+Use "loginctl seat-status seat-qemu" to check the result.  It isn't
+needed to assign the usb devices to the head individually, assigning a
+usb (root) hub will automatically assign all usb devices connected to
+it too.
+
+BTW: loginctl writes udev rules to /etc/udev/rules.d to make these
+device assignments permanent, so you need to do this only once.
+
+Now simply restart gdm (rebooting will do too), and a login screen
+should show up on the second head.
+
+Enjoy!
+
+--
+Gerd Hoffmann <kraxel@redhat.com>