![Como posso fazer um Multiseat com Xephyr?](https://rvso.com/image/1108659/Como%20posso%20fazer%20um%20Multiseat%20com%20Xephyr%3F.png)
Estou tentando usar multiseat com Ubuntu, mas não consigo fazer isso funcionar.
Eu li muitos "como fazer", e a maioria deles é sobre como fazer um multiseat com alguma distro com GDM2, ou KDM. Mas estou usando o lightdm do Ubuntu.
Então agora estou tentando fazer esse multiseat com o Xephyr, que já usei para fazer um multiseat com a versão Debian 4. Mas não sei como chamar o Xephyr no lightdm.conf.
Responder1
Há um exemplo de configuração LightDM para multiterminal usando Xephyr. Parece que Andrzej Pietrasiewicz (o autor do blog copiado/referenciado abaixo) criou umPPAcom todo o código exibido abaixo. Ao instalar esse PPA, você poderá fazer com que a instalação do lightdm funcione "magicamente".
Observação: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:
- A entrada [Seat:0] que define o "servidor de hardware". Isso inicia o servidor X. Representa a exibição: 0
- 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, na verdade, os usuários farão login em Display :1 e :2, mas não em :0.
Algo parecido:
+------------------------------- 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:http://beforeafterx.blogspot.com/2011/02/multiseat-setup-xorgconf.html
O script em 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:http://beforeafterx.blogspot.com/2012/08/multiseat-setup-lightdmconf.html
Os scripts multiseat iniciam o Xephyr com parâmetros que descrevem o mouse e o teclado a serem usados para esse assento. Farei o meu melhor para descobrir essas informações e fornecê-las 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:http://beforeafterx.blogspot.com/2012/08/multiseat-configuration-xephyr-seat-1.html
O maior referenciado no lightdm também é um script de shell separado. Observe que eu recomendo que você faça referência /bin/sh
em vez de /bin/bash
. Não vi nada que exigisse bash. Observe que ele faz referência ao lightdm-gtk-greeter padrão 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 mais um script multiterminal 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 script de saudação falsa é um dorminhoco. Ele apenas dorme até ser morto por um desligamento completo. Aparentemente, isso não é obrigatório. Segundo comentário, a -noreset
opção é suficiente para evitar ter que esperar assim. Reportarei mais tarde, assim que fizer o teste 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 precisa redefini-lo para que o multi-seat funcione corretamente. Isto foi em agosto de 2012, por isso 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 em seu sistema, execute o seguinte comando:
sudo update-rc.d multiseat defaults
Novamente, não sei se este script é necessário neste momento. Apenas organizando os scripts oferecidos porAntes depois X.
Fonte:http://beforeafterx.blogspot.com/2012/08/multiseat-setup-initdmultiseat.html
Responder2
tente o xrdp, será a solução mais fácil. Instalei o vnc4server e depois instalei o xrdp. e então usei rdesktop/tsclient/remmina para conectar a máquina xrdp usando endereço IP.
Responder3
Existe umblog maravilhosodetalhando o processo de configuração de uma configuração multiterminal baseada em Xephyr. Ele também está usando Lightdm. Espero que ajude.