multiseat.txt 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. multiseat howto (with some multihead coverage)
  2. ==============================================
  3. host devices
  4. ------------
  5. First you must compile qemu with a user interface supporting
  6. multihead/multiseat and input event routing. Right now this
  7. list includes sdl2, gtk (both 2+3) and vnc:
  8. ./configure --enable-sdl
  9. or
  10. ./configure --enable-gtk
  11. Next put together the qemu command line (sdk/gtk):
  12. qemu -accel kvm -usb $memory $disk $whatever \
  13. -display [ sdl | gtk ] \
  14. -vga std \
  15. -device usb-tablet
  16. That is it for the first seat, which will use the standard vga, the
  17. standard ps/2 keyboard (implicitly there) and the usb-tablet. Now the
  18. additional switches for the second seat:
  19. -device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \
  20. -device secondary-vga,bus=head.2,addr=02.0,id=video.2 \
  21. -device nec-usb-xhci,bus=head.2,addr=0f.0,id=usb.2 \
  22. -device usb-kbd,bus=usb.2.0,port=1,display=video.2 \
  23. -device usb-tablet,bus=usb.2.0,port=2,display=video.2
  24. This places a pci bridge in slot 12, connects a display adapter and
  25. xhci (usb) controller to the bridge. Then it adds a usb keyboard and
  26. usb mouse, both connected to the xhci and linked to the display.
  27. The "display=video2" sets up the input routing. Any input coming from
  28. the window which belongs to the video.2 display adapter will be routed
  29. to these input devices.
  30. Starting with qemu 2.4 and linux kernel 4.1 you can also use virtio
  31. for the input devices, using this ...
  32. -device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \
  33. -device secondary-vga,bus=head.2,addr=02.0,id=video.2 \
  34. -device virtio-keyboard-pci,bus=head.2,addr=03.0,display=video.2 \
  35. -device virtio-tablet-pci,bus=head.2,addr=03.0,display=video.2
  36. ... instead of xhci and usb hid devices.
  37. host ui
  38. -------
  39. The sdl2 ui will start up with two windows, one for each display
  40. device. The gtk ui will start with a single window and each display
  41. in a separate tab. You can either simply switch tabs to switch heads,
  42. or use the "View / Detach tab" menu item to move one of the displays
  43. to its own window so you can see both display devices side-by-side.
  44. For vnc some additional configuration on the command line is needed.
  45. We'll create two vnc server instances, and bind the second one to the
  46. second seat, similar to input devices:
  47. -display vnc=:1,id=primary \
  48. -display vnc=:2,id=secondary,display=video.2
  49. Connecting to vnc display :1 gives you access to the first seat, and
  50. likewise connecting to vnc display :2 shows the second seat.
  51. Note on spice: Spice handles multihead just fine. But it can't do
  52. multiseat. For tablet events the event source is sent to the spice
  53. agent. But qemu can't figure it, so it can't do input routing.
  54. Fixing this needs a new or extended input interface between
  55. libspice-server and qemu. For keyboard events it is even worse: The
  56. event source isn't included in the spice protocol, so the wire
  57. protocol must be extended to support this.
  58. guest side
  59. ----------
  60. You need a pretty recent linux guest. systemd with loginctl. kernel
  61. 3.14+ with CONFIG_DRM_BOCHS enabled. Fedora 20 will do. Must be
  62. fully updated for the new kernel though, i.e. the live iso doesn't cut
  63. it.
  64. Now we'll have to configure the guest. Boot and login. "lspci -vt"
  65. should list the pci bridge with the display adapter and usb controller:
  66. [root@fedora ~]# lspci -vt
  67. -[0000:00]-+-00.0 Intel Corporation 440FX - 82441FX PMC [Natoma]
  68. [ ... ]
  69. \-12.0-[01]--+-02.0 Device 1234:1111
  70. \-0f.0 NEC Corporation USB 3.0 Host Controller
  71. Good. Now lets tell the system that the pci bridge and all devices
  72. below it belong to a separate seat by dropping a file into
  73. /etc/udev/rules.d:
  74. [root@fedora ~]# cat /etc/udev/rules.d/70-qemu-autoseat.rules
  75. SUBSYSTEMS=="pci", DEVPATH=="*/0000:00:12.0", TAG+="seat", ENV{ID_AUTOSEAT}="1"
  76. Reboot. System should come up with two seats. With loginctl you can
  77. check the configuration:
  78. [root@fedora ~]# loginctl list-seats
  79. SEAT
  80. seat0
  81. seat-pci-pci-0000_00_12_0
  82. 2 seats listed.
  83. You can use "loginctl seat-status seat-pci-pci-0000_00_12_0" to list
  84. the devices attached to the seat.
  85. Background info is here:
  86. http://www.freedesktop.org/wiki/Software/systemd/multiseat/
  87. guest side with pci-bridge-seat
  88. -------------------------------
  89. QEMU version 2.4 and newer has a new pci-bridge-seat device which
  90. can be used instead of pci-bridge. Just swap the device name in the
  91. qemu command line above. The only difference between the two devices
  92. is the pci id. We can match the pci id instead of the device path
  93. with a nice generic rule now, which simplifies the guest
  94. configuration:
  95. [root@fedora ~]# cat /etc/udev/rules.d/70-qemu-pci-bridge-seat.rules
  96. SUBSYSTEM=="pci", ATTR{vendor}=="0x1b36", ATTR{device}=="0x000a", \
  97. TAG+="seat", ENV{ID_AUTOSEAT}="1"
  98. Patch with this rule has been submitted to upstream udev/systemd, was
  99. accepted and should be included in the next systemd release (222).
  100. So, if your guest has this or a newer version, multiseat will work just
  101. fine without any manual guest configuration.
  102. Enjoy!
  103. --
  104. Gerd Hoffmann <kraxel@redhat.com>