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"
Руководства:
Здесь
И здесь
вторник, 11 января 2011 г.
xorg.conf multiseat
Xorg.conf multiseat
# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig: version 260.19.29 (buildmeister@swio-display-x86-rhel47-08.nvidia.com) Wed Dec 8 12:28:55 PST 2010
Section "ServerLayout"
Identifier "Layout1"
Screen 0 "Screen0"
Screen 1 "Screen1" above "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection
Section "Monitor"
Identifier "My Monitor0"
HorizSync 28.0 - 33.0
VertRefresh 43.0 - 72.0
# Option "DPMS" "false"
EndSection
Section "Monitor"
Identifier "My Monitor1"
# Option "DPMS" "false"
EndSection
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
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
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
Section "Module"
Load "glx"
EndSection
Section "ServerFlags"
Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
EndSection
# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig: version 260.19.29 (buildmeister@swio-display-x86-rhel47-08.nvidia.com) Wed Dec 8 12:28:55 PST 2010
Section "ServerLayout"
Identifier "Layout1"
Screen 0 "Screen0"
Screen 1 "Screen1" above "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection
Section "Monitor"
Identifier "My Monitor0"
HorizSync 28.0 - 33.0
VertRefresh 43.0 - 72.0
# Option "DPMS" "false"
EndSection
Section "Monitor"
Identifier "My Monitor1"
# Option "DPMS" "false"
EndSection
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
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
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
Section "Module"
Load "glx"
EndSection
Section "ServerFlags"
Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
EndSection
Подписаться на:
Сообщения (Atom)