ENGLISH VERSION

ОБСУДИТЬ НА ФОРУМЕ


Вы можете закачать файлы которые описаны в статье:

СВЯЗАТЬСЯ С АВТОРОМ :

Jabber :
darion@sibnsk.net

email: darion76@gmail.com



СИСТЕМА В РАБОТЕ :

Скриншот с 1 рабочего места.
Скриншот со 2-ого рабочего места.

НОВЫЙ ПОДХОД В ОРГАНИЗАЦИИ ДОМАШНЕГО ПК

15.06.2008

Создание 3D Multiseat на основе debian

Внимание ! Файлы для новой стабильной ветки Debian GNU/Linux 5.0 "Lenny" можно скачать здесь

Multiseat - система с одним системным блоком и несколькими видеокартами, мониторами, клавиатурами и мышками. Позволяет работать нескольким пользователям одновременно с одного компьютера.
В описанной конфигурации 2 пользователя могут играть в 3D игры DirectX9 используя wine-1.0, например Heroes of Might and Magic 5 (HMM5), WarHammer 40k (WH40k), Serious Sam 2 и другие не мешая друг другу. Система легко расширяется до 4-ех рабочих мест.

Существует мнение что wine недостаточно хорош чтобы достойно заменить Windows в области игр. Однако здесь тоже есть тонкости. Если сравнивать wine с Windows XP, то наверное он отстанет на 10-20%. Но не стоит забывать о существовании Vista, которая тоже отстает от Windows XP. Вот, например статья в которой тестер жалуется что новая версия драйвера под линукс 173.14.05 уступает виндоуз драйверу 175.16. Опять же Windows XP. Также в статье отмечено что со старым драйвером производительность в линуксе была выше (169.12). Да, wine отстает от Windows в 3D Mark тестах, но при этом его патчат, ставят DirectX от Microsoft. Сравнивать нужно только реальные игры.

Статью можно обусудить на форуме Операционная система Линукс нашла достойное применение не только на мощных и производительных серверах, не только во встраиваемых системах, не только в телефонах и комуникаторах и т.д., но и на домашних компьютерах многих пользователей.

Настройка Линукса традиционно считается непростой задачей для пользователя. Однако следует учесть те дополнительные возможности, которые можно получить используя преимущества этой операционной системы.
Достоинства Линукс известны большинству пользователей, даже тех кто никогда не сталкивался с opensource. Наиболее важные из них:

- стабильность;
- надежность;
- открытость;
- масштабируемость.

Поскольку современный персональный компьютер способен обеспечить одновременную работу нескольких пользователей, необходимо использовать свойство системы Линукс чтобы усадить несколько членов семьи за один компьютер. Это и есть идея которая называется multiseat. Сама по себе она не нова. Уже достаточно давно люди используют Линукс для организации нескольких рабочих мест с одним системным блоком. Отличие описываемой системы состоит в максимальном использовании современных компьютерных аппаратных средств и системы Линукс.
Теперь немного поподробнее. Когда появились материнские платы с поддержкой многоядерных процессоров и 4 разъемами PCI Ex 16x, вполне естественной моей мыслью было использовать это оборудование для получения нескольких рабочих мест без ограничения функциональных возможностей.
Четыре PCI Ex 16x вполне обеспечат работу четырех пользователей, которые не будут обделены в смысле 3D игр и мощности системы при условии использования 4-ех ядерного процессора.

В моем примере используется следующее аппаратное обеспечение :
Материнская плата MSI K9A2 Platinum V2; Socket АМ2/AM2+; AMD 790FX+SB600; 4DDRII; PCI Express 2.0; HyperTransport 3.0; 4xP-Ex16 ; 1xP-Ex1; 2xP; Sound 8-ch; 1x1394a; Gigabit Lan; 4хSATAII; 1xATA133; SATAII RAID(0,1, 0+1); ATX
Процессор Athlon 64 x2 4800+ Socket AM2; BOX; AMD; Dual-Core; 2500Mhz; 2x512KB; Brisbane; 0.065m; 65W; Revision G2; Dual-Channel DDRII
Память 1024Mb DDR-II; PC-6400; Kingston
Видеокарта1 8600GT Asus Silent
Видеокарта2 6200TC Asus Silent

Программное обеспечение :
Debian 4.0 Etch
wine 1.0

Цель : обеспечить независимую работу 2 пользователей на указанном оборудовании без ограничения в использовании 3D ускорения.


Далее следует пошаговая инструкция для тех кто захочет повторить 3D Multiseat.
Я попытаюсь сделать её максимально доступной и понятной, но как всегда в подобных случаях вы должны понимать что действуете на свой страх и риск. Никакой ответственности за то что кто-то неправильно что-то сделал или не так понял мои рекомендации, если что-то вышло из строя или были потеряны важные данные я не несу.
Особо лишь отмечу что в инструкции не отражены элементарные с точки зрения компьютерной техники вещи. Например, если указано что нужно установить видеокарту в системный блок, значит нужно сначала завершить работу компьютера и только после выключения устанавливать видеокарту. Также не рассматривается установка системы debian, если эта задача вам не под силу попробуйте обратиться к соответствующим сведениям, которые можно найти на установочном диске, либо в интернете.

1.Установка системы

Сначала необходимо установить и настроить обычную конфигурацию с одной видеокартой.
Установите в компьютер сначала только одну видеокарту, одну мышку и одну клавиатуру.
Поместите в DVD установочный диск с debian. Установите и настройте систему с opensource драйвером nv.

ВНИМАНИЕ ! Текущая версия nv драйвера не поддерживает видеокарты GeForce 8600. Поэтому при установе используйте драйвер vesa (в файле xorg.conf в секции описания видеоадаптера вместо Driver "nv" укажите Driver "vesa") и избегайте разрешений больше 1024x768 при первоначальной настройке системы.

Скачайте проприетарный драйвер от NVidia (с официального сайта nvidia.com). Я использовал NVIDIA-Linux-x86-173.14.05-pkg1.run, но возможно к моменту когда вы будете читать эту статью уже появятся версии новее. Для установки перезагрузите систему в режиме одиночного пользователя. Установите драйвер (потребуются привелегии root) следуя инструкциям указанным на сайте: sh ./NVIDIA-Linux-x86-173.14.05-pkg1.run. Не забудьте включить пользователей которые будут пользоваться ускорителем и настройками звуковой карты добавить в соответствующие группы audio и video.
Перезагрузите компьютер в многопользовательском режиме. Проверьте что всё прошло успешно :
darion@darion-debian:~$ lsmod | grep nvidia
nvidia               7096260  70
agpgart                30216  2 nvidia
i2c_core               20096  5 nvidia,it87,i2c_isa,i2c_nforce2,i2c_piix4
Убедитесь что ускоритель работает:
darion@darion-debian:~$ glxinfo | grep direct
direct rendering: Yes
Проверьте что действительно используется проприетарный драйвер от NVidia:
darion@darion-debian:~$ glxinfo | grep vendor
server glx vendor string: NVIDIA Corporation
client glx vendor string: NVIDIA Corporation
OpenGL vendor string: NVIDIA Corporation

2.Определение оборудования

После этого установите вторую видеокарту, подключите второй монитор, вторую клавиатуру, вторую мышь.
Включите компьютер, загрузите систему.
Запустите терминал. На данном этапе следует создать список оборудования в том виде как его определила система.
1. Определение видеокарт:
darion@darion-debian:~$ lspci | grep VGA
01:00.0 VGA compatible controller: nVidia Corporation Unknown device 0402 (rev a 1)
03:00.0 VGA compatible controller: nVidia Corporation NV44 [GeForce 6200 TurboCa che(TM)] (rev a1)
Из полученного списка видно что установлены 2 видеокарты. Первая GeForce 8600, вторая - GeForce 6200.
2. Определяем мышки и клавиатуры:
darion@darion-debian:~$ cat /proc/bus/input/devices
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/class/input/input0
H: Handlers=kbd event0
B: EV=120013
B: KEY=4 2000000 3802078 f840d001 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7

I: Bus=0003 Vendor=09da Product=000a Version=0002
N: Name="A4Tech PS/2+USB Mouse"
P: Phys=usb-0000:00:13.1-2/input0
S: Sysfs=/class/input/input3
H: Handlers=mouse0 event2 ts0
B: EV=7
B: KEY=ff0000 0 0 0 0 0 0 0 0
B: REL=303

I: Bus=0010 Vendor=001f Product=0001 Version=0100
N: Name="PC Speaker"
P: Phys=isa0061/input0
S: Sysfs=/class/input/input4
H: Handlers=kbd event3
B: EV=40001
B: SND=6

I: Bus=0011 Vendor=0002 Product=0006 Version=0000
N: Name="ImExPS/2 Generic Explorer Mouse"
P: Phys=isa0060/serio1/input0
S: Sysfs=/class/input/input5
H: Handlers=mouse1 event4 ts1
B: EV=7
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: REL=143

I: Bus=0003 Vendor=046d Product=c312 Version=0100
N: Name="LITEON Technology USB Multimedia Keyboard"
P: Phys=usb-0000:00:13.4-1/input0
S: Sysfs=/class/input/input6
H: Handlers=kbd event1
B: EV=120003
B: KEY=10000 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: LED=7

3. Настройка X сервера

Используя сведения из предыдущего раздела настраиваем сервер (важные значения выделены красным цветом). Обратите внимание что клавиатуры нужно настраивать с использованием evdev. Для мышек это необязательно, хотя привязка к подключению имеет значение когда в системе появиться 4 или 10 мышек. Пока их 2, а к тому же одна PS/2, можно оставить как есть. В моем случае настройки приняли следующий вид (реальная рабочая конфигурация):

darion@darion-debian:~$ cat /etc/X11/xorg.conf
Section "ServerLayout"
    Identifier     "Seat0"
    Screen         "Screen0" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "ServerLayout"
    Identifier     "Seat1"
    Screen         "Screen1"
    Screen         "TV" RightOf "Screen1"
    InputDevice    "Keyboard1" "CoreKeyboard"
    InputDevice    "Mouse1" "CorePointer"
EndSection

Section "Files"

        # path to defoma fonts
    FontPath        "/usr/share/fonts/X11/misc"
    FontPath        "/usr/X11R6/lib/X11/fonts/misc"
    FontPath        "/usr/share/fonts/X11/cyrillic"
    FontPath        "/usr/X11R6/lib/X11/fonts/cyrillic"
    FontPath        "/usr/share/fonts/X11/100dpi/:unscaled"
    FontPath        "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
    FontPath        "/usr/share/fonts/X11/75dpi/:unscaled"
    FontPath        "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
    FontPath        "/usr/share/fonts/X11/Type1"
    FontPath        "/usr/X11R6/lib/X11/fonts/Type1"
    FontPath        "/usr/share/fonts/X11/100dpi"
    FontPath        "/usr/X11R6/lib/X11/fonts/100dpi"
    FontPath        "/usr/share/fonts/X11/75dpi"
    FontPath        "/usr/X11R6/lib/X11/fonts/75dpi"
    FontPath        "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection

Section "Module"
    Load           "i2c"
    Load           "bitmap"
    Load           "ddc"
    Load           "extmod"
    Load           "freetype"
    Load           "glx"
#    Load           "int10"
    Load           "vbe"
EndSection

Section "InputDevice"

    Driver "evdev"
    Option "Phys" "isa0060/serio0/input0"
    Identifier     "Keyboard1"
    Option         "XkbModel" "evdev"
    Option         "XkbLayout" "us,ru(winkeys)"
    Option         "CoreKeyboard"
EndSection


Section "InputDevice"
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Device" "/dev/input/mouse1"
    Option         "Protocol" "ExplorerPS/2"
EndSection

Section "InputDevice"
    Driver "evdev"
    Option "Phys"       "usb-0000:00:13.4-1/input0"
    Identifier     "Keyboard0"
    Option         "XkbModel" "evdev"
    Option         "XkbLayout" "us,ru(winkeys)"
    Option         "CoreKeyboard"
EndSection


Section "InputDevice"
    Identifier     "Mouse1"
    Driver         "mouse"
    Option         "Device" "/dev/input/mouse0"
    Option         "Protocol" "ExplorerPS/2"
EndSection

Section "Monitor"
    Identifier     "S/T 77/76DFX"
    # 800x600 @ 75.00 Hz (GTF) hsync: 47.02 kHz; pclk: 48.91 MHz
    Modeline "800x600_75.00"  48.91  800 840 920 1040  600 601 604 627  -HSync +Vsync
    Option         "DPMS"
EndSection

Section "Monitor"
    Identifier     "LG L1953S"
    Option         "DPMS"
EndSection

Section "Monitor"
    Identifier     "TV-Out"
    VendorName     "Samsung"
    ModelName      "Plano"
    HorizSync       30.0 - 50.0
    VertRefresh     50.0 - 50.0
EndSection

Section "Device"
    Identifier     "nVidia 8600GT"
    Driver         "nvidia"
    BusID          "PCI:1:0:0"
    Screen         0
EndSection

Section "Device"
    Identifier     "nVidia 6200TC"
    Driver         "nvidia"
    BusID          "PCI:3:0:0"
    Screen         0
EndSection

Section "Device"
    Identifier     "nvidia-TVOut0"
    Driver         "nvidia"
    VendorName     "nVidia Corp."
    BoardName      "NVIDIA GeForce 6200"
    Option         "DPMS"
    BusID          "PCI:3:0:0"
    Screen          1
EndSection


Section "Screen"
    Identifier     "Screen0"
    Device         "nVidia 8600GT"
    Monitor        "S/T 77/76DFX"
    DefaultDepth    24
    SubSection     "Display"
        Depth       1
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       4
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       8
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       15
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       16
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       24
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "nVidia 6200TC"
    Monitor        "LG L1953S"
    DefaultDepth    24
    SubSection     "Display"
        Depth       1
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       4
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       8
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       15
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       16
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       24
        Modes      "1280x1024" "1024x768" "832x624" "800x600" "720x400" "640x480"
    EndSubSection
EndSection

Section "Screen"
    Identifier     "TV"
    Device         "nvidia-TVOut0"
    Monitor        "TV-Out"
    DefaultDepth    24
    Option         "TVStandard" "HD576i"
    Option         "TVOutFormat" "COMPOSITE"
    Option         "ConnectedMonitor" "TV,CRT"
    SubSection     "Display"

    Modes      "800x600" "640x480"
    Depth       16
    EndSubSection
    SubSection     "Display"

    Depth       24
    Modes      "800x600" "640x480"
    EndSubSection
    SubSection     "Display"
        Depth       32
        Modes      "800x600" "640x480"
    EndSubSection
EndSection

4. Настройка gdm

Для входа в систему я использовал gdm. Его необходимо перенастроить на несколько рабочих мест. Инициализация нескольких карт требует некоторых ухищрений, поскольку драйвер от NVidia закрыт и декомпилировать/изменять его не позволяет лицензионное соглашение. Но мне удалось с помощью экспериментов обойти проблему инициализации.
Перемещаем файл /usr/share/gdm/defaults.conf в /usr/share/gdm/defaults.conf.orig:

darion-debian:~# cd /usr/share/gdm
darion-debian:/usr/share/gdm# mv defaults.conf defaults.conf.orig

создаем символьную ссылку на этот файл:
darion-debian:/usr/share/gdm# ln -s defaults.conf.orig defaults.conf
Внимание ! defaults.conf.orig не просто бекап файла, он необходим для работы скрипта инициализации и поэтому должен присутствовать именно в /usr/share/gdm.

Создаем файл конфигурации gdm для мультисита. Для этого копируем оригинальный файл:

darion-debian:/usr/share/gdm# cp defaults.conf.orig defaults.conf.multiseat
Теперь необходимо отредактировать defaults.conf.multiseat для запуска нескольких X сессий:
В файле defaults.conf.multiseat в секции [servers] нужно добавить еще один сервер :
[servers]
# These are the standard servers.  You can add as many you want here and they
# will always be started.  Each line must start with a unique number and that
# will be the display number of that server.  Usually just the 0 server is
# used.
0=Standard0
1=Standard1

[server-Standard0]
name=Standard server
command=/usr/bin/X -sharevts -isolateDevice PCI:3:0:0 -layout seat1 :0
flexible=false

[server-Standard1]
name=Standard server
command=/usr/bin/X -sharevts -isolateDevice PCI:1:0:0 -layout seat0 :1
flexible=false
Остальные секции оставляем без изменения.

5. Скрипт инициализации и запуска gdm

Для инициализации я написал следующий скрипт. Его необходимо поместить под именем gdm-multiseat в каталог /etc/init.d.
darion-debian:/etc/init.d# cat ./gdm-multiseat
#! /bin/sh
### BEGIN INIT INFO
# Provides:          fake Xorg initialization
# Should-Start:      console-screen acpid
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: fake Xorg preinit script for multiseat system
# Description:       Debian preinit script for the multiseat system
### END INIT INFO
#
# Author:       Andrey Zhornyak 
#
set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin
GDM_SCRIPT=/etc/init.d/gdm
MULTISEAT_FILE=/usr/share/gdm/defaults.conf.multiseat
ORIG_FILE=/usr/share/gdm/defaults.conf.orig
SYMLINK_FILE=/usr/share/gdm/defaults.conf

test -x $GDM_SCRIPT || exit 0

case "$1" in
   start)
          rm -f $SYMLINK_FILE
          ln -s $ORIG_FILE $SYMLINK_FILE
          echo "Starting temporary single X server"
        /usr/bin/X -dpi 96 -audit 0 &
        sleep 5
        /usr/bin/killall Xorg
        rm -f $SYMLINK_FILE
        ln -s $MULTISEAT_FILE $SYMLINK_FILE
        exec /etc/init.d/gdm start
  ;;
  stop)
        exec /etc/init.d/gdm stop
  ;;
  reload)
  ;;
  restart|force-reload)
        $0 stop
        $0 start
  ;;
  *)
        echo "Usage: /etc/init.d/fakex {start|stop|restart|reload|force-reload}"        exit 1
  ;;
esac

exit 0
Затем необходимо удалить символьную ссылку на скрипт gdm из уровня 2 (на остальных уровнях можно оставить gdm):
darion-debian:~# cd /etc/rc2.d
darion-debian:/etc/rc2.d# rm /etc/rc2.d/*gdm
darion-debian:/etc/rc2.d# ln -s ../init.d/gdm-multiseat S21gdm-multiseat

После перезагрузки если, все прошло успешно, вы получите 3D Multiseat систему. Если необходимо добавить еще пару рабочих мест, необходимо повторить шаги со 2-го по 5-й. Возможно скрипт инициализации придется подредактировать. И не забывайте простое правило - по 1-ому ядру на пользователя.
Если по прошествии некоторого времени вы решите заменить одну или несколько из видеокарт на более производительную, например 6200 на 8800GT, ничего менять в настройках не придется, драйвер менять не придется (в нем уже есть поддержка серий 8xxx, 9xxx). Просто замените видеокарту в системнике и наслаждайтесь повышенной производительностью.


При использовании материалов статьи прямая гиперссылка на 3D Multiseat обязательна.