Wie kann ich mit Xephyr einen Multiseat erstellen?

Wie kann ich mit Xephyr einen Multiseat erstellen?

Ich versuche, Multiseat mit Ubuntu zu verwenden, aber es funktioniert nicht.

Ich habe viele Anleitungen gelesen und die meisten davon handeln davon, wie man mit einer Distribution mit GDM2 oder KDM ein Multiseat erstellt. Ich verwende jedoch das LightDM von Ubuntu.

Also versuche ich jetzt, dieses Multiseat mit Xephyr zu erstellen, das ich bereits verwendet habe, um ein Multiseat mit der Debian 4-Version zu erstellen. Aber ich weiß nicht, wie ich Xephyr in lightdm.conf aufrufen kann.

Antwort1

Es gibt ein Beispiel für ein LightDM-Setup für Multiseat mit Xephyr. Es sieht so aus, als hätte Andrzej Pietrasiewicz (der Autor des unten kopierten/referenzierten Blogs) einPPAmit dem gesamten unten angezeigten Code. Durch die Installation dieses PPA sollte eine Lightdm-Installation „wie von Zauberhand“ funktionieren.

Notiz:Ich habe versucht, das zum Laufen zu bringen, aber bisher ist es mir nicht gelungen. Ich kann Ihnen jedoch sagen, dass das Folgende eine Reihe widersprüchlicher Parameter enthält.

Einige wichtige Teile:

  1. Der Eintrag [Seat:0], der den „Hardware-Server“ definiert. Damit wird der X-Server gestartet. Er repräsentiert Display :0
  2. Die xserver-Befehlseinträge, die genau definieren, was gestartet werden muss, um Sitze zu erhalten. Xephyr wird mit Display :1 und Display :2 gestartet. Die Benutzer melden sich also tatsächlich bei Display :1 und :2 an, aber nicht bei :0.

So ähnlich:

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

Die Datei xorg.conf:

# 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

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

Das Skript 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

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

Die Multiseat-Skripte starten Xephyr mit Parametern, die die für diesen Sitz zu verwendende Maus und Tastatur beschreiben. Ich werde mein Bestes tun, um diese Informationen herauszufinden und sie auch hier bereitzustellen.

#!/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

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

Der in lightdm referenzierte größere Wert ist auch ein separates Shell-Skript. Beachten Sie, dass ich Ihnen empfehlen würde, /bin/shanstelle von zu verweisen /bin/bash. Ich habe nichts gesehen, was Bash erfordern würde. Beachten Sie, dass es am Ende auf den Standard-Lightdm-GTK-Greeter verweist.

#!/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

Einige der Funktionen können im folgenden Skript definiert werden. Irgendwie enthält es noch ein weiteres Multiseat-Skript, das ich noch nicht gesehen habe ...

# 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
}

Das Fake-Greeter-Skript ist ein Sleeper. Es schläft einfach, bis es durch ein vollständiges Herunterfahren beendet wird. Anscheinend ist das nicht erforderlich. Laut einem Kommentar -noresetreicht die Option aus, um solche Wartezeiten zu vermeiden. Ich werde später berichten, sobald ich es selbst getestet habe.

#!/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

Im selben Blog heißt es, er habe Probleme mit udev und müsse es neu einrichten, damit Multi-Seat richtig funktioniert. Das war im August 2012, daher weiß ich nicht, ob das 2014 noch gilt.

#!/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

Um dieses Skript ordnungsgemäß auf Ihrem System einzurichten, führen Sie den folgenden Befehl aus:

sudo update-rc.d multiseat defaults

Auch hier weiß ich nicht, ob dieses Skript an dieser Stelle erforderlich ist. Ich organisiere einfach die vonVorher Nachher X.

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

Antwort2

Versuchen Sie es mit xrdp, das ist die einfachste Lösung. Ich habe vnc4server und dann xrdp installiert. und dann habe ich rdesktop / tsclient / remmina verwendet, um die xrdp-Maschine über die IP-Adresse zu verbinden.

Antwort3

Da ist einwunderbarer BlogEr beschreibt detailliert den Prozess der Einrichtung eines Xephyr-basierten Multiseat-Systems. Er verwendet auch Lightdm. Hoffe, das hilft.

verwandte Informationen