[HOWTO] Multiseat with Ubuntu 16.04 + systemd + gdm + proprietary drivers

I have seen some posts and some old information about multiseat configurations. I have successfully configured everything with google-fu and some luck. I wanted to give back to the community, just in case somebody is in my position. If this is not the good place to post this, or I should follow some other style, please tell me so. I have been a lurker and maybe I have a lot to learn.

My current hardware setup:

  • 2x NVIDIA GTX 750 Ti LP (Low Power was a plus for my build, and low budget too)
  • Intel i7 6700

On the software point of view:

  • Ubuntu Gnome 16.04
  • NVIDIA drivers 361.42 (installed through Additional drivers Ubuntu utility)
  • Xorg > 1.16. It is already included in 16.04, but this seems important because some features regarding multiseat where added in that version.

Note that Ubuntu Gnome uses gdm (instead of lightdm, as in Ubuntu). This should not affect, as both are quite automagical in they behaviour, or so I am told. I do not mess with any desktop manager settings. If you want to achieve, say, different auto-login in the different seats, then you will be forced to play around the config files.

First step: Master of Seat

This step is required for the 361.42 driver, but I am told that version 364 does this automatically. To check that, call loginctl seat-status and see if the NVIDIA card has already the MASTER qualifier, which means that is a Master of Seat. If it already is, jump to the next step.

Otherwise:

First we need to assign some “master-of-seat” tag to the graphical devices. The easiest way for NVIDIA cards is to create /etc/udev/rules.d/99-seats.rules and put the following:

SUBSYSTEM=="drm", KERNEL=="card[0-9]*", ATTRS{vendor}=="0x10de", DRIVERS=="nvidia", TAG+="master-of-seat"

This will ensure that the card* device will qualify as a seat-forming configuration.

Seat devices

[Not sure if a reboot, or an equivalent udevadm trigger command, are needed before going on. It does no harm…]

Use loginctl tool to assign the card and also additional devices (keyboard, mouse, usb, soundcards…) to the seats according to your desired setup:

$ # Basic command:
$ loginctl attach seat-1 /sys/devices/pci...
$ # Rinse and repeat, for all your devices (should start for the master-of-seat card)
$ # ...
$ # Check that everything is as expected:
$ loginctl seat-status seat0
$ loginctl seat-status seat-1

Instead of using the loginctl command you can manually add rules to the folder /etc/udev/rules.d/. Do whatever you are most comfortable with. It should be equivalent, as loginctl command ends up creating some files named /etc/udev/rules.d/72*.conf. If you do it by hand, you will be able to add comments change the setup more cleanly.

Remember that you can add individual devices or full USB hubs. This may be interesting to allow a small “hotplug pool of [non-attached] devices”, by connecting them to previously attached hubs, in addition to cherry-picked “persistent/static” devices like keyboard and mouses which are likely to not be moved around. At least, that is my plan for my multi-seat.

Enabling Xorg

If you are comfortable using the nouveau drivers, you can jump to the “Reboot and profit” step. Otherwise, the seat-1 will not start the desktop manager at all. I have not (extensively) looked at logs to see the problem. However, I solved the issue.

The minimal(?) configuration that works with the proprietary drivers can be achieved through the following configuration in /etc/X11/xorg.conf.d/. Create the folder if it is not present. You can put everything in one single file, multiple files, or arrange them in another fashion:

01-gpu_separation.conf

# 01-gpu_separation.conf
Section "ServerFlags"
        Option "AutoAddGPU" "off"
EndSection

10-gpu-seat0.conf

# 10-gpu-seat0.conf 
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option         "GLXVBlank" "true"
    BoardName      "GeForce GTX 750Ti"
    Option         "NoLogo" "1"
    BusId          "PCI:1:0:0"
    Option         "ProbeAllGpus" "false"
    MatchSeat      "seat0"
EndSection

10-gpu-seat-1.conf

# 10-gpu-seat-1.conf 
Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option         "GLXVBlank" "true"
    BoardName      "GeForce GTX 750Ti"
    Option         "NoLogo" "1"
    BusId          "PCI:2:0:0"
    Option         "ProbeAllGpus" "false"
    MatchSeat      "seat-1"
EndSection

Note that you may want to change the seat names or the PCI according to your specific configuration. Also change the BoardName --vanity only, I think.

Reboot and profit

Seriously, if you reboot, it should work.

Afterthoughts

As you may have seen, I have tried to reduce to a minimum the configuration for Xorg (instead of, say, adding two full xorg.conf files and setting there every input / device / monitor / etc.). I like to keep a basic low-level setup (bare minimum as possible), and the graphical display tools are enough for me. I plan to do some more testing to reduce the settings even more, I am not sure what are the completely essential ones, or if those problems between nouveau and nvidia drivers will disappear in newer versions.

Also, I really like the systemd way of doing things. I am sure that some similar stuff can be achieved through carefully assignment of input devices in the xorg.conf, but some more nice behaviour like the sound card assignment, the USB-hub-per-seat features, etc. seems to be a pain to set up without systemd. Maybe I am wrong, feel free to share your experience!

If you are trying something similar, good luck and have patience :)

Thanks you for this mini-How-To. I have just two small comments:

  1. With the new 364 version the “master-of-seat” tags are added automatically
  2. Instead of 3 files in xorg.conf.d you can combine them to one file

Thanks,

Floris

This version is not available through the standard packages. Good to know! I added a comment into the howto for that.

I thought that it was quite obvious, but now that you say it… maybe some readers will definetely prefer that info. Added that! I am too used to settings in *.conf.d folders, and I personally prefer multiple files for better organization, but this is definetely a personal preference.

Thanks for your feedback!

Any one there to guide me to create multiseat in Ubuntu

Use Marius’ manual and read
[url]http://code.lexarcana.com/posts/simple-multiseat-setup-on-fedora-17.html[/url] for more information

and tell us which part you don’t understand.

success,

Floris

Hello,

  1. Requeriment PPA: Index of /ubuntu-multiseat/ppa/ubuntu ?

  2. This procedure needs to install some package? xorg-server-source-lts-xenial?

  3. I use a GeForce 8400 GS. Current and 340.96 Drive would have a problem?

  4. This tutorial only works with Gnome? Or you can do using Unity?

Thanks a lot!

Hi phoenix!

  1. No idea what is that PPA. I assume it may be required for previous versions, but with 16.04 is is NOT needed. If you intend to use older versions, then maybe look at another source (not my post) entirely. If you intend to use 16.04, use the already-included versions (and do not add the PPA).

  2. I don’t recall installing any packages. Again, I am using vanilla 16.04 Ubuntu Gnome. If you think that some package is missing, tell me so and I will update the howto.

  3. No idea. I put the specific hardware and driver versions because that is what I had and that is what I still have. Using an older driver version than the one I am using seems a red flag, though. The actual model of the card should not matter, as long as the two cards are the same. Mixing cards may arise some driver/device problem.

  4. As I said in the original post:

Note that Ubuntu Gnome uses gdm (instead of lightdm, as in Ubuntu). This should not affect, as both are quite automagical in they behaviour, or so I am told. I do not mess with any desktop manager settings

So… please, try! I will be very pleased to update the post with your feedback / experience on that.

Good luck!

MariusSiuram, thank you.

I have two ‘USB HUB’.
I have difficulty in identifying the ‘USB HUB’ in ‘loginctl seat-status’ it is connected mouse, keyboard. I’m using it to divide the peripheral.

seat0
        Sessions: *c2
         Devices:
                  ├─/sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input2
                  │ input:input2 "Power Button"
                  ├─/sys/device...XSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
                  │ input:input1 "Power Button"
                  ├─/sys/device...XSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input0
                  │ input:input0 "Sleep Button"
                  ├─/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card0
                  │ [MASTER] drm:card0
                  ├─/sys/device...0000:00/0000:00:01.0/0000:01:00.1/sound/card1
                  │ sound:card1 "NVidia"
                  │ ├─/sys/device...00:00:01.0/0000:01:00.1/sound/card1/input12
                  │ │ input:input12 "HDA NVidia HDMI/DP,pcm=3"
                  │ ├─/sys/device...00:00:01.0/0000:01:00.1/sound/card1/input13
                  │ │ input:input13 "HDA NVidia HDMI/DP,pcm=7"
                  │ ├─/sys/device...00:00:01.0/0000:01:00.1/sound/card1/input14
                  │ │ input:input14 "HDA NVidia HDMI/DP,pcm=8"
                  │ └─/sys/device...00:00:01.0/0000:01:00.1/sound/card1/input15
                  │   input:input15 "HDA NVidia HDMI/DP,pcm=9"
                  ├─/sys/devices/pci0000:00/0000:00:1b.0/sound/card0
                  │ sound:card0 "Intel"
...skipping...
                  │ usb:usb3
                  ├─/sys/devices/pci0000:00/0000:00:1d.2/usb4
                  │ usb:usb4
                  ├─/sys/devices/pci0000:00/0000:00:1d.3/usb5
                  │ usb:usb5
                  ├─/sys/devices/pci0000:00/0000:00:1d.7/usb1
                  │ usb:usb1
                  │ └─/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-1
                  │   usb:1-1
                  │   ├─/sys/device...-1.1:1.0/0003:2188:0AE1.0001/input/input6
                  │   │ input:input6 "USB OPTICAL MOUSE "
                  │   ├─/sys/device...-1.4:1.0/0003:1A2C:0C23.0002/input/input7
                  │   │ input:input7 "USB USB Keyboard"
                  │   └─/sys/device...-1.4:1.1/0003:1A2C:0C23.0003/input/input8
                  │     input:input8 "USB USB Keyboard"
                  ├─/sys/device...1f.2/ata4/host3/target3:0:1/3:0:1:0/block/sr0
                  │ block:sr0
                  ├─/sys/device...a4/host3/target3:0:1/3:0:1:0/scsi_generic/sg2
                  │ scsi_generic:sg2
                  ├─/sys/devices/virtual/misc/kvm
                  │ misc:kvm
                  └─/sys/devices/virtual/misc/rfkill
                    misc:rfkill

‘seat-1’ = empty. Why?

bethe@bethe-desktop:~$ loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2/1-2.2:1.0/0003:1BCF:0005.0008/input/input20

bethe@bethe-desktop:~$ loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.3/1-2.3:1.0/0003:1C4F:0002.0006/input/input18

bethe@bethe-desktop:~$ loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.3/1-2.3:1.1/0003:1C4F:0002.0007/input/input19

bethe@bethe-desktop:~$ loginctl seat-status seat-1
Failed to get seat: No seat ‘seat-1’ known

bethe@bethe-desktop:~$ loginctl seat-status seat1
Failed to get seat: No seat ‘seat1’ known

bethe@bethe-desktop:~$

Have you first configured the tag “master-of-seat”?

I suspect that until a device with that tag is assigned to a seat, the seat is not “valid” and thus, assignments are ignored. (Or maybe technically they are assigned, the seat is created, but immediately discarded because there is no master and this triggers a clean-up, somebody more knowledgeable should correct me).

I could do a ‘multiseat’ if my motherboard has 3 outputs video?

MariusSiuram,

I’Brazilian.
My English is horrible.

How do I set the master-of-seat?
Thanks!

Hi,
I have a working multiseat systemd configuration using nouveau driver.
I have two cards (Quadro 600) on debian stretch, nvidia driver version 367.44.
I added the xorg settings you suggest but I’m unable to obtain a working configuration.
With “AutoAddGPU” set to “off” works only the first seat; when it is set to “on” only the second one.
I cannot find anything useful in the log files.

Any suggest to solve or investigate better?

Regards

A

With nouveau drivers: 0 experience. I fear that things will be different or broken. I haven’t checked them at all (bad previous experiences while trying to game with nouveau drivers). So I skipped to proprietary drivers.

I would suggest to double check the nouveau documentation referring the Xorg.conf stuff, and prior to that be sure that the seats are correctly set up before moving on to the X.

Hi MariusSiuram,
the “nouveau” configuration doesn’t have any xorg conf file. I just used loginctl to attach devices to seats. Therefore I was expecting it worked also with the nvidia driver, but it was not true.
Hence I found this page and I tried to configure xorg but without success.

The setup worked fine for two monitors. Thanks.

However I would like my HDTV to be one of the monitors. For some reason it does not auto-negotiate the proper screen resolution. Is there any way of forcing the resolution.

@Blazex69 Are you using gnome? If you are using Gnome, the “display settings” allow you to change which resolutions?

If you cannot change the resolution from the desktop environment, I may consider changing manually the Xorg.conf. Good luck (bad experiences, so I try to keep it as “default” as possible).

Also “take a look” with xrandr.

All those comments are quite general and totally independent to the “Multiseat” configuration, so it may be better to start another thread. The only multi-seat specific setting is the Xorg.conf placement, and that seems to be quite straightforward.

Any one there to guide me to create multiseat in Ubuntu

Hi there:

Is there any easy way to configure a multiseat setup with a single nvidia card using multi-head? I have a uatx board with only one pcie slot and would like to configure a multiseat setup.

Thank you

At the moment you need two video cards. Maybe when NVIDIA creates the framebuffer it will be possible.