qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

multiseat.txt (5147B)


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