Message ID | 1400594447-16637-7-git-send-email-kraxel@redhat.com |
---|---|
State | New |
Headers | show |
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
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
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
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 --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>
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