вторник, 11 января 2011 г.

Multiseat для двух пользователей на двухголовой видеокарте с помощью Xephyr

Multiseat linux - один компьютер на двоих. Одна видеокарта. С помощью Xephyr
0. Моя конфигурация:

lspci | grep VGA
01:00.0 VGA compatible controller: nVidia Corporation G92 [GeForce 9800 GT] (rev a2)
#Двухголовая видеокарта.

xserver-xephyr
2:1.7.7-10
#Версия Xephyr

gdm --version
GDM 2.20.11
#Display manager

cat /etc/debian_version
squeeze/sid

Из оборудования я использую два монитора, две клавиатуры:(USB и PS/2), две мышки:(USB и PS/2)
0. Подключил все это оборудование к сист. блоку и загрузил linux.

1. Установил проприетарные дрова для видеокарты с nvidia.com
(ЕМНИП, говорят, со свободными multiseat не работает как надо)
(При установке соглашаемся на вопрос об автоматической генерации xorg'a)
После установки дров перезагружаем linux.

2. Настраиваем /etc/X11/xorg.conf
Открываем на редактирование:
например nano /etc/X11/xorg.conf

Потребуется сформировать секции таким образом:
-------------------------------
Секции Monitor:

Section "Monitor"
Identifier "My Monitor0"
HorizSync 28.0 - 33.0
VertRefresh 43.0 - 72.0
EndSection

Section "Monitor"
Identifier "My Monitor1"
EndSection
-------------------------------
Секции Device: (BusID в обоих секциях меняем своим, который берем из вывода lspci | grep VGA
(У меня этот вывод выглядит таким образом:)
01:00.0 VGA compatible controller: nVidia Corporation G92 [GeForce 9800 GT] (rev a2)
------------------------------
Section "Device"
Identifier "nvidia0"
Driver "nvidia"
BusID "PCI:01:00:0"
Screen 0
Option "UseDisplayDevice" "CRT-0"
Option "RenderAccel" "true"
EndSection

Section "Device"
Identifier "nvidia1"
Driver "nvidia"
BusID "PCI:01:00:0"
Screen 1
Option "UseDisplayDevice" "CRT-1"
Option "RenderAccel" "true"
EndSection
--------------------------------
Секции Screen:

Section "Screen"
Identifier "Screen0"
Device "nvidia0"
Monitor "My Monitor0"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1600x900"
ViewPort 0 0
EndSubSection
EndSection

Section "Screen"
Identifier "Screen1"
Device "nvidia1"
Monitor "My Monitor1"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1024x768"
ViewPort 0 0
EndSubSection
EndSection
----------------------------
Секции InputDevice: ( у меня эти секции сгенерировались автоматом при установке дров. Я их не трогал. А так как у меня usb мышь с доп. кнопками, то в первом InputDevice'e вам возможно придется удалить все Option'ы, оставив только
Identifier "Mouse0"
Driver "mouse")

Section "InputDevice"
# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
# generated from default
Identifier "Keyboard0"
Driver "kbd"
EndSection
--------------------------------------
И самая главная секция - ServerLayout:

Section "ServerLayout"
Identifier "Layout1"
Screen 0 "Screen0"
Screen 1 "Screen1" rightof "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection
-----------------------------------
Затем лучше дописать секции:

Section "Module"
Load "glx"
EndSection

Section "ServerFlags"
Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
EndSection

После этого если перезагрузить иксы, то на втором мониторе должна появиться копия первого рабочего стола или просто черный экран по которому может бегать указатель курсора (зависит от windows manager'a)
Прилагаю полный xorg.conf

2. Устанавливаем доп. софт.

sudo aptitude install xserver-xephyr xserver-xorg-input-evdev gdm

3. Создаем скрипт запуска xephyr'a - Xephyr.sh

#!/bin/bash

trap "" usr1

XEPHYR=/usr/bin/Xephyr

args=()

while [ ! -z "$1" ]; do
if [[ "$1" == "-xauthority" ]]; then
shift
if [ ! -z "$1" ]; then
export XAUTHORITY="$1"
fi
elif [[ "$1" == "-display" ]]; then
shift
if [ ! -z "$1" ]; then
export DISPLAY="$1"
fi
elif [[ "$1" == "-keyboard" ]]; then
shift
if [ ! -z "$1" ]; then
args=("${args[@]}" "-keybd")
args=("${args[@]}" "evdev,,device=/dev/input/by-path/$1,xkbrules=xorg,xkbmodel=evdev,xkblayout=us")
fi
elif [[ "$1" == "-mouse" ]]; then
shift
if [ ! -z "$1" ]; then
args=("${args[@]}" "-mouse")
args=("${args[@]}" "evdev,,device=/dev/input/by-path/$1")
fi
else
if ! expr match $1 'vt[0-9][0-9]*' >/dev/null; then
args=("${args[@]}" "$1")
fi
fi
shift
done

echo $XEPHYR "${args[@]}" >> /tmp/logXephyr
exec $XEPHYR "${args[@]}"


1) Сохраняем его под именем Xephyr.sh
2) Копируем его в /usr/sbin/
cp ./Xephyr.sh /usr/sbin/
3) Назначаем права
chmod 755 /usr/sbin/Xephyr.sh

4. Настраиваем Display Manager - GDM на вход пользователей
Общий план таков:
Сначала запускается основной X - сервер, а поверх него стартуют два сеанса вложенного икс-сервера Xephyr.
Также на этом этапе мы должны указать в настройках gdm на каких местах (seat) будут использоваться конкретные клавиатуры и мыши используя их адреса.

Конфигурационный файл gdm - это /etc/gdm/gdm.conf

А так он выглядит у меня:

[servers]

0=Standard device=/dev/console
1=Seat1
2=Seat2

[server-Standard]
name=Standard server
command=/usr/bin/X -br -audit 0
handled=false
flexible=false

[server-Seat1]
name=Seat1
command=/usr/sbin/Xephyr.sh -display :0.0 -xauthority /var/lib/gdm/:0.Xauth -fullscreen -keyboard platform-i8042-serio-0-event-kbd -mouse pci-0000:00:12.1-usb-0:1:1.0-event-mouse
handled=true
flexible=false

[server-Seat2]
name=Seat2
command=/usr/sbin/Xephyr.sh -display :0.1 -xauthority /var/lib/gdm/:0.Xauth -fullscreen -keyboard pci-0000:00:13.1-usb-0:3:1.0-event-kbd -mouse platform-i8042-serio-1-event-mouse
handled=true
flexible=false

Здесь вам придется отредактировать строки command у [server-Seat1] и у [server-Seat2] , а именно адреса клавиатур и мышей на шинах для обоих рабочих мест.
-----------------------------------------
Адреса берутся из каталога /dev/input/by-path/
Список моих устройств:
ls /dev/input/by-path
pci-0000:00:12.1-usb-0:1:1.0-event-mouse pci-0000:00:13.1-usb-0:3:1.1-event platform-i8042-serio-1-mouse
pci-0000:00:12.1-usb-0:1:1.0-mouse platform-i8042-serio-0-event-kbd platform-pcspkr-event-spkr
pci-0000:00:13.1-usb-0:3:1.0-event-kbd platform-i8042-serio-1-event-mouse

Нам нужны только те устройства, которые содержат своем имени фразы event-kbd и event-mouse, поэтому

ls /dev/input/by-path/ | grep -P "event-mouse|event-kbd"

pci-0000:00:12.1-usb-0:1:1.0-event-mouse
pci-0000:00:13.1-usb-0:3:1.0-event-kbd
platform-i8042-serio-0-event-kbd
platform-i8042-serio-1-event-mouse

устройства начинающиеся с pci - это USB устройства
с platform - это PS/2

которые оканчиваются на mouse - мыши
на kbd - клавиатуры

убедиться, что мы не ошиблись с адресами устройств, можно пустив на вывод какое нибудь устройство. Например, проверим нашу USB мышь:
sudo cat /dev/input/by-path/pci-0000:00:12.1-usb-0:1:1.0-event-mouse
и подвигаем мышь: если в терминал выводятся непонятные символы, значит мы убедились, что pci-0000:00:12.1-usb-0:1:1.0-event-mouse - действительный адрес нашей USB мыши. Советую проверить таким образом и клавиатуры (в этом случае непонятные символы будут выводиться в терминал при нажатии на клавиши правильной клавиатуры)

Также, можно проверить адреса устройств так:
cat /proc/bus/input/devices
Используя поля Sysfs (заменяя слэши тире)
--------------------------------------
После того, как мы узнаем адреса двух клавиатур и мышей и определимся на какое место будем их цеплять- отредактируем gdm.conf:

sudo nano /etc/gdm/gdm.conf

изменяя в вышележащем конфиге в строках command для двух seat'ов адреса. Т.е. потребуется заменить
platform-i8042-serio-0-event-kbd
pci-0000:00:12.1-usb-0:1:1.0-event-mouse
pci-0000:00:13.1-usb-0:3:1.0-event-kbd
platform-i8042-serio-1-event-mouse
на свои.
-----------------------------------
После чего перезагружаем gdm

sudo /etc/init.d/gdm restart
sudo /etc/init.d/gdm restart


5. Если все произведено правильно то, на двух экранах появится приглашение входа

Войти под одним пользователем одновременно нельзя, поэтому используем вторую учетку.

Теперь настраиваем:
Автоповтор нажатий клавиш клавиатуры
Добавляем в автозапуск (к примеру wm'a) команду
xset r rate 200 25

Переключение расскладок клавиатуры:
Добавляем в автозапуск команду
setxkbmap -layout "us,ru" -option "grp:caps_toggle,grp_led:scroll"


Руководства:
Здесь
И здесь

2 комментария:

  1. Толково. А под обычным Хсервером такой xorg.conf не запахал?

    ОтветитьУдалить
  2. darkshvein, под обычным Xсервером такой xorg.conf работает тоже.
    Хотя, я наверное не до конца понял вопрос.
    Суть, наверное, в следующем: Если сформировать такой xorg.conf под обычным Xсервером, то получится, что на обоих мониторах будут "копии рабочих столов" между которыми можно перемещать указатель курсора мышкой. Но, это ведь не multiseat. ( Настройка xorg.conf это лишь промежуточный шаг )

    ОтветитьУдалить