Как я могу сделать Multiseat с Xephyr?
Я пытаюсь использовать Multiseat с Ubuntu, но я не могу заставить это работать.
Я прочитал много "как", и большинство из них о создании мультисайтов с некоторыми дистрибутивами с GDM2 или KDM. Но я использую Lightdm Ubuntu.
Итак, теперь я пытаюсь сделать этот мультисайт с Xephyr, который я уже использовал для создания мультисайтов с версией Debian 4. Но я не знаю, как позвонить Xephyr в lightdm.conf.
3 ответа
Существует пример настройки LightDM для нескольких мест с использованием Xephyr. Похоже, что Анджей Пьетрасевич (автор блога скопировал / ссылается ниже) создал PPA со всем кодом, показанным ниже. Установив этот PPA, вы сможете заставить установку lightdm работать "магически".
Примечание: поскольку я пытался заставить это работать, я еще не преуспел. Тем не менее, я могу вам сказать, что в дальнейшем есть определенное количество противоречивых параметров.
Некоторые важные части:
- Запись [Seat:0], которая определяет "аппаратный сервер". Это запускает X-сервер. Представляет: 0
- Записи команды xserver, которые точно определяют, что нужно запустить, чтобы получить места. Xephyr запускается с дисплея:1 и дисплея:2. Таким образом, по сути, пользователи будут входить в систему: Display:1 и:2, но не в:0.
Что-то вроде того:
+------------------------------- Display :0 -----------------------------+
| X server |
| |
| +--------- Display :1 ----------+ +--------- Display :2 ----------+ |
| | Xephyr 1 | | Xephyr 2 | |
| | User A | | User B | |
| | | | | |
| | | | | |
| | | | | |
| +-------------------------------+ +-------------------------------+ |
| |
+------------------------------------------------------------------------+
Файл 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
Источник: http://beforeafterx.blogspot.com/2011/02/multiseat-setup-xorgconf.html
Скрипт в 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
Источник: http://beforeafterx.blogspot.com/2012/08/multiseat-setup-lightdmconf.html
Многосетевые скрипты запускают Xephyr с параметрами, описывающими мышь и клавиатуру для использования в этом месте. Я сделаю все возможное, чтобы узнать эту информацию и предоставить ее здесь.
#!/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
Источник: http://beforeafterx.blogspot.com/2012/08/multiseat-configuration-xephyr-seat-1.html
Большая ссылка в lightdm также является отдельным сценарием оболочки. Обратите внимание, что я бы порекомендовал вам ссылку /bin/sh
вместо /bin/bash
, Я не видел ничего, что потребовало бы bash. Обратите внимание, что в конце он ссылается на стандартный lightdm-gtk-greeter.
#!/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
Некоторые функции могут быть определены в следующем сценарии. Каким-то образом он включает еще один сценарий для нескольких мест, который я еще не видел...
# 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
}
Поддельный сценарий - спящий. Он просто спит, пока его не убьет полное отключение. Видимо, это не обязательно. Согласно комментарию, -noreset
Варианта достаточно, чтобы избежать необходимости ждать, как это. Я сообщу позже, когда я проверю на себя.
#!/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
В том же блоге говорится, что у него проблемы с udev, и он должен перенастроить его, чтобы мульти-место работало правильно. Это было в августе 2012 года, поэтому я не знаю, будет ли это применяться в 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
Чтобы правильно настроить этот скрипт в вашей системе, выполните следующую команду:
sudo update-rc.d multiseat defaults
Опять же, я не знаю, нужен ли этот сценарий в данный момент. Просто организовать сценарии, предлагаемые До после X.
Источник: http://beforeafterx.blogspot.com/2012/08/multiseat-setup-initdmultiseat.html
Попробуй xrdp это будет самое простое решение. Я установил vnc4server, а затем установил xrdp. и затем я использовал rdesktop / tsclient / remmina для подключения к машине xrdp с использованием IP-адреса.
Есть замечательный блог, подробно описывающий процесс установки мультисета на основе Xephyr. Он также использует Lightdm. Надеюсь, поможет.