123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- 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
- 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>
|