Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I'm trying to use multiseat with Ubuntu, but I can't make this work.

I've read a lot of "how to", and the most of them are about doing a multiseat with some distro with GDM2, or KDM. But, I'm using the lightdm of Ubuntu.

So now I'm trying to make this multiseat with Xephyr, which I've already used to make a multiseat with the Debian 4 version. But I don't know how to call Xephyr in lightdm.conf.

share|improve this question
    
Ok, its seen that xephyr will not help-me this time, i'm trying now to do this multiseat editing lightdm.conf. I've found this answer, but that not work in my case, I have done the same configuration, and the system crash. –  Jnts Mar 26 '12 at 13:36
1  
Ok guys, I've give up. It's seems that Xephyr will always crash the system, even in kubuntu. Multiple X-servers do not work with 2 outputs of the video adapter. but it WORK with multiple x-servers, one seat for every video adapter. –  Jnts Apr 2 '12 at 20:02
    
    
@fossfreedom i said with xephyr, this question is about multiples X servers. Anyway i did this multiseat work with Debian 6, after instaling gdm2. –  Jnts Apr 17 '12 at 18:50
    
hmmm - I presume what you did should also work with 10.04 Ubuntu since this is closer to debian 6 than 11.10? If so, may be you can either create an answer, or add to your question what you did to get it to work? Maybe this will give others some hints to help further with 11.10 and lightdm etc. –  fossfreedom Apr 17 '12 at 19:03

3 Answers 3

try xrdp it will be the easiest solution. I installed vnc4server and then installed xrdp. and then I used rdesktop / tsclient / remmina to connect xrdp machine using IP Address.

share|improve this answer
    
i think i get it, but how i will separate this sessions? one session for each monitor? i will call a "layout" in xorg.conf? with keybords and mice conf? i never had seen this xrdp multiseat way. –  Jnts Mar 23 '12 at 17:33

There is a sample of LightDM setup for multiseat using Xephyr. It looks like Andrzej Pietrasiewicz (the author of the blog copied/referenced below) created a PPA with all the code displayed below. By installing that PPA, you should be able to get a lightdm installation to work "magically".

Note: As I have been trying to get that to work, I have not succeeded yet. However, I can tell you that there are a certain number of contradictory parameters in what follows.

Some important parts:

  1. The [Seat:0] entry which defines the "hardware server". That starts the X server. It represents Display :0
  2. The xserver-command entries that define exactly what needs to be started to get seats. Xephyr is started with Display :1 and Display :2. So in effect the users will log in Display :1 and :2, but not in :0.

Some like that:

+------------------------------- Display :0 -----------------------------+
|  X server                                                              |
|                                                                        |
|  +--------- Display :1 ----------+  +--------- Display :2 ----------+  |
|  |  Xephyr 1                     |  |  Xephyr 2                     |  |
|  |  User A                       |  |  User B                       |  |
|  |                               |  |                               |  |
|  |                               |  |                               |  |
|  |                               |  |                               |  |
|  +-------------------------------+  +-------------------------------+  |
|                                                                        |
+------------------------------------------------------------------------+

The xorg.conf file:

# File: /etc/X11/xorg.conf

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 0
    Option         "Xinerama" "0"
EndSection

Section "Files"
EndSection

Section "Module"
    Load           "dbe"
    Load           "extmod"
    Load           "type1"
    Load           "freetype"
    Load           "glx"
EndSection

Section "ServerFlags"
    # start even without the mouse
    Option "AllowMouseOpenFail" "yes"
    # disable VT switching
    #Option "DontVTSwitch" "yes"
    # Ctrl+Alt+Backspace disable
    #Option "DontZap" "yes"
EndSection

Section "Monitor"
    # HorizSync source: edid, VertRefresh source: edid
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Philips 170B4"
    HorizSync       30.0 - 82.0
    VertRefresh     56.0 - 76.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce 8400 GS"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "TwinView" "1"
    Option         "TwinViewXineramaInfoOrder" "DFP-0"
    Option         "metamodes" "CRT: nvidia-auto-select +0+1080, DFP: nvidia-auto-select +0+0"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

Source: http://beforeafterx.blogspot.com/2011/02/multiseat-setup-xorgconf.html

The script in lightdm.conf:

# File: /etc/lightdm/lightdm.conf
[LightDM]
greeter-user=root
user-authority-in-system-dir=false
common-vt=true

[SeatDefaults]
xserver-allow-tcp=false
greeter-hide-users=true
user-session=lightdm-xsession
session-wrapper=/etc/X11/Xsession

[Seat:0]
xserver-command=X -br -dpms -s 0 -novtswitch
greeter-session=xinerama

[Seat:1]
xserver-command=/etc/multiseat/scripts/Xephyr-seat-1
greeter-session=multiseat-greeter-1

[Seat:2]
xserver-command=/etc/multiseat/scripts/Xephyr-seat-2
greeter-session=multiseat-greeter-2

Source: http://beforeafterx.blogspot.com/2012/08/multiseat-setup-lightdmconf.html

The multiseat scripts start Xephyr with parameters describing the mouse and keyboard to use for that seat. I will do my best to find out that information and provide it here too.

#!/bin/bash
# File: /etc/multiseat/scripts/Xephyr-seat1, Xephyr-seat2, ..., Xephyr-seatN
#
# $1 - display number of this Xephyr

. /etc/multiseat/scripts/helper-functions

trap "" usr1

XEPHYR=/root/Xephyr-new
export DISPLAY=:0
export XAUTHORITY=/var/run/lightdm/root/:0

SEAT=1

SIZE=`get_conf $SEAT SIZE`
KEYBOARD=`get_conf $SEAT KEYBOARD`
LAYOUT=`get_conf $SEAT LAYOUT`
MOUSE=`get_conf $SEAT MOUSE`
DPI=`get_conf $SEAT DPI`

exec $XEPHYR -retro -screen ${SIZE} -keybd evdev,,device=/dev/input/${KEYBOARD},xkbrules=evdev,xkbmodel=evdev,xkblayout=${LAYOUT} -mouse evdev,,device=/dev/input/${MOUSE} -dpi ${DPI} $1

Source: http://beforeafterx.blogspot.com/2012/08/multiseat-configuration-xephyr-seat-1.html

The greater referenced in the lightdm is also a separate shell script. Note that I would recommend you reference /bin/sh instead of /bin/bash. I did not see anything that would require bash. Note that it references the default lightdm-gtk-greeter at the end.

#!/bin/bash
# File: /etc/multiseat/scripts/multiseat-greeter-1, ..., multiseat-greeter-n
#
# multiseat wrapper around ligthdm greeter in order to position a Xephyr instance
#
. /etc/multiseat/scripts/helper-functions

PRIMARY=`get_conf 0 PRIMARY`
SEAT=1

if [ $SEAT != $PRIMARY ]; then
    XEP=`XAUTHORITY=/var/run/lightdm/root/:0 xwininfo -root -children -display :0 | grep "Xephyr on :$SEAT" --max-count=1`;
    XEPHYR_WIN_ID=`echo ${XEP} | cut -d' ' -f1`;
    DISPLACEMENT=`get_conf $SEAT DISPLACEMENT`
    DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 wmctrl 2>&1 -v -i -r ${XEPHYR_WIN_ID} -e 0,0,${DISPLACEMENT},-1,-1;
fi

XAUTHORITY=/var/run/lightdm/root/:$SEAT
DISPLAY=:$SEAT
exec /usr/sbin/lightdm-gtk-greeter

Some of the functions may be defined in the following script. Somehow, it includes yet another multiseat script that I haven't seen yet...

# File: /etc/multiscript/scripts/helper-functions

. /etc/default/multiseat

#
# private implementation of get_sect
#
# get given section's contents from the given config file
#
# $1 filename
# $2 section number
#
__get_sect()
{
    cat $1 | awk -v sect=$2 '
    BEGIN {
        SECT="^\\[" sect "\\]"
        NEXT_SECT="^\\[" (sect + 1) "\\]"
    }
    $0 ~ SECT, $0 ~ NEXT_SECT {
        if ($0 ~ SECT)
            next;
        if ($0 ~ NEXT_SECT)
            next;
        if (substr($1, 1, 1) == "#")
            next;
        print
    }
    '
}

#
# private implementation of get_conf
#
# get given key's contents from the given section
# from the given config file
#
# does not work for tables in the config file
#
# $1 filename
# $2 section name
# $3 key name
#
__get_conf()
{
    __get_sect $1 $2 | awk -F"=" -v key=$3 '
    BEGIN {
        KEY=key
    }
    $1==KEY {
        print substr($0, index($0, "=") + 1)
    }
    '
}

#
# private implementation of get_num_seats
#
# get number of seats from the default config file
#
# $1 filename
#
__get_num_seats()
{
    cat $1 | awk '
    BEGIN {
        count=0
    }
    /^\[[0-9]*\]/ {count++}
    END {
        print count - 1
    }
    '
}

#
# get given section's contents from the default config file
#
# $1 section name
#
get_sect()
{
    __get_sect $CONFIG $1
}

#
# private implementation of get_table
#
# $1 filename
# $2 section number
# $3 table name
# $4 size/entry switch [-size => size, <number> for entry]
#
__get_table()
{
    SIZE=0;
    ENTRY=-1

    if [ $4 == "-size" ];
    then
        SIZE=1;
    else
        ENTRY=$4
    fi

    RESULT=`__get_sect $1 $2 | awk -v table=$3 -v get_size=$SIZE -v entry=$ENTRY '
    BEGIN {
        print BEGIn
        TABLE=table "\\\=" "\\\("
        GET_SIZE=get_size
        ENTRY=entry
        size=0
    }
    $0 ~ TABLE, /^\)/ {
        if ($0 ~ TABLE)
            next;
        if ($0 ~ /^\)/)
            next;
        if (substr($1, 1, 1) == "#")
            next;
        if (get_size == 0 && size == entry){
                print
                exit
        }
        size++;
    }
    END {
        if (get_size)
            print size;
    }
    '`
    RESULT=`echo $RESULT | sed 's/^[ \t]*//g'`

    echo $RESULT
}

#
# get given key's contents from the given section
# from the default config file
#
# does not work for tables in the config file
#
# $1 section name
# $2 key name
#
get_conf()
{
    __get_conf $CONFIG $1 $2
}

#
# get number of seats from the default config file
#
get_num_seats()
{
    __get_num_seats $CONFIG
}

#
# get size of a given table in the given section of the config file or
# get specified entry of the table
#
# $1 section number
# $2 table name
# $3 size/entry switch [-size => size, <number> for entry]
#
get_table()
{
    __get_table $CONFIG $1 $2 $3
}

The fake-greeter script is a sleeper. It just sleeps until it gets killed by a full shutdown. Apparently, this is not required. According to a comment, the -noreset option is enough to avoid having to wait like this. I will report later once I tested for myself.

#!/bin/bash
# File: /etc/multiseat/scripts/fake-greeter

pid_set=0

kill_sleep()
{
    if [ $pid_set -ne 0 ];
    then
        kill -15 $pid
    fi
    exit 0
}

trap 'kill_sleep' TERM

while true;
do
    sleep 1000 &

    pid=$!
    pid_set=1

    wait $pid
done

The same blog says that he is having problems with udev and he has to re-reset it so multi-seat works properly. This was in August 2012 so I do not know whether that would still apply in 2014.

#!/bin/sh
# File: /etc/init.d/multiseat
### BEGIN INIT INFO
# Provides:          multiseat
# Required-Start:    bootlogs
# Required-Stop:
# Default-Start:     1 2 3 4 5
# Default-Stop:
# Short-Description: Trigger udev rules
# Description:       For some reason the rules for multiseat config need to be
#                    fired once more and later than at the very beginning.
### END INIT INFO

/sbin/udevadm trigger

To properly setup this script on your system, run the following command:

sudo update-rc.d multiseat defaults

Again, I do not know whether this script is required at this point. Just organizing the scripts offered by Before after X.

Source: http://beforeafterx.blogspot.com/2012/08/multiseat-setup-initdmultiseat.html

share|improve this answer

There is a wonderful blog detailing the process of getting an Xephyr based multiseat set up. He also is using Lightdm. Hope it helps.

share|improve this answer
2  
While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. –  Peachy Sep 26 '12 at 13:41
    
The link points to the top of the blog in question with many posts that have nothing to do with installing Xephyr! –  Alexis Wilke Nov 28 at 1:31

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.