Como posso fazer um Multiseat com Xephyr?

3

Estou tentando usar multiterminal com o Ubuntu, mas não consigo fazer isso funcionar.

Eu li muito como e a maioria deles é sobre fazer um multi-campo com alguma distro com GDM2 ou KDM. Mas estou usando o lightdm do Ubuntu.

Então agora eu estou tentando fazer isso multiterminal com o Xephyr, que eu já usei para fazer vários jogos com a versão Debian 4. Mas eu não sei como chamar o Xephyr no lightdm.conf.

    
por Jnts 23.03.2012 / 16:27

3 respostas

2

Existe um exemplo de configuração do LightDM para multiseatos usando o Xephyr. Parece que Andrzej Pietrasiewicz (o autor do blog copiado / referenciado abaixo) criou um PPA com todo o código exibido abaixo. Ao instalar o PPA, você deve conseguir que uma instalação lightdm funcione "magicamente".

Nota: Como tenho tentado fazer isso funcionar, ainda não consegui. No entanto, posso dizer-lhe que há um certo número de parâmetros contraditórios no que se segue.

Algumas partes importantes:

  1. A entrada [Lugar: 0] que define o "servidor de hardware". Isso inicia o servidor X. Representa Display: 0
  2. As entradas do comando xserver que definem exatamente o que precisa ser iniciado para obter assentos. O Xephyr é iniciado com Display: 1 e Display: 2. Então, com efeito, os usuários entrarão em Display: 1 e: 2, mas não em: 0.

Algo assim:

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

O arquivo 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

Fonte: link

O script no 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

Fonte: link

Os scripts multiterminal iniciam o Xephyr com parâmetros que descrevem o mouse e o teclado a serem usados para esse assento. Eu farei o meu melhor para descobrir essa informação e fornecê-la aqui também.

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

Fonte: link

O maior referenciado no lightdm também é um script de shell separado. Observe que eu recomendo que você faça referência a /bin/sh em vez de /bin/bash . Eu não vi nada que exigiria bash. Observe que ele faz referência ao padrão lightdm-gtk-greeter no final.

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

Algumas das funções podem ser definidas no script a seguir. De alguma forma, inclui ainda outro script multiseat que ainda não vi ...

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

O roteiro falso-cumpridor é um dorminhoco. Ele só dorme até ser morto por um desligamento completo. Aparentemente, isso não é necessário. De acordo com um comentário, a opção -noreset é suficiente para evitar ter que esperar assim. Vou relatar mais tarde, uma vez que eu testei por mim mesmo.

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

O mesmo blog diz que ele está tendo problemas com o udev e ele precisa reinicializá-lo para que o multi-seat funcione corretamente. Isso foi em agosto de 2012, então não sei se isso ainda se aplicaria em 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

Para configurar corretamente este script no seu sistema, execute o seguinte comando:

sudo update-rc.d multiseat defaults

Novamente, não sei se esse script é necessário neste momento. Apenas organizando os scripts oferecidos por Antes após o X .

Fonte: link

    
por Alexis Wilke 28.11.2014 / 04:46
0

experimente o xrdp, será a solução mais fácil. Eu instalei o vnc4server e, em seguida, instalei o xrdp. e então eu usei o rdesktop / tsclient / remmina para conectar a máquina xrdp usando o endereço IP.

    
por Chaitanya 23.03.2012 / 17:43
-1

Existe um blog maravilhoso detalhando o processo de configuração de multiseatos baseada em Xephyr. Ele também está usando o Lightdm. Espero que ajude.

    
por Anthony 24.09.2012 / 19:07