MSE-electronics
Библиотека
Компьютер
  

Инструкция по установке Multiseat на Ubuntu

Проектирование и строительство лесосушильных камер. Автоматика для сушильных камер     Безпроводные температурные сенсоры RFID
Камеры для сушки дерева Как сделать 8 компьютеров из 1 ? RFID Датчики температуры

Поддубный Виталий

ООО «Манускрипт Солюшн»

г.Тула

e-mail: linuxtula@rambler.ru

27.12.2008г.

Обновлено: 24.12.2009г.

Содержание

Введение

       Multiseat с применением XGL+Xevdevserver

Стадия 1: настройка Xorg

Стадия 2: установка программ

Стадия 3: конфигурирование GDM

Стадия 4: "допиливаем" систему

       Другие варианты настройки Multiseat

Использование Xephyr/Xnest+Xevdevserver

Использование Xephyr+Evdev

Использование X/Xorg+Xevdevserver

Использование X/Xorg+Evdev

Использование Userful Desktop Multiplier

       Заключение

Приложение 1: установка драйверов видеокарт GeForce и Radeon

Приложение 2: вариант файла xorg.conf для применения с XGL

Приложение 3: патч GDM для автоматического входа каждого пользователя

Приложение 4: разделение USB-портов между пользователями

Приложение 5: компиляция XGL из исходников

 

Введение

В данной статье рассматриваются различные варианты реализации мультимониторной конфигу­рации, которая в простонародии получила название "мультисит". Основной упор сделан на вариант с использованием одной видеокарты серии GeForce, у которой два видеовыхода. Всего я нашёл в интернете четыре способа реализации такой конфигурации: при помощи Xnest-сервера, Xephyr-сер­вера и с помощью Xgl-сервера.

Четвёртый вариант – использование платной программы Desktop Multiplier от компании Userful. Кстати, она есть в репозиториях Ubuntu и для домашних дел её можно бесплатно использовать на два места, правда, программа в любом случае требует регистрацию. Но поскольку эта программа в настройках особо не нуждается (главное условие – установить проприетарные драйвера на видео­карту), то мы её рассмотрим очень кратко в самом конце статьи.

Есть также проект OpenUserful с открытыми исходниками, но он уже более 3 лет не развивается. Суть его сводится к накладыванию патчей на исходники некоторых элементов системы. Если кому будет интересно покопаться, вот ссылки:

http://openuserful.sourceforge.net/wiki/index.php/Main_Page

http://sourceforge.net/project/showfiles.php?group_id=153260

А рассмотрим мы более популярные методы реализации Multiseat. Общие принципы конфигури­рования системы во всех случаях практически одинаковы.

Мультисит на Xephyr-сервере получил наибольшую популярность, поскольку он отличается меньшим потреблением ресурсов, но у него есть некоторые недостатки, например, 3D-эффекты ра­бочего стола не работают (хотя в последних версиях появилась поддержка OpenGL). Но работы над этим проектом до сих пор продолжаются,  появляются новые возможности, устраняются ста­рые ошибки. Главным плюсом Xephyr'а является его наличие в репозиториях практически любого линукса, поэтому скачивать и собирать его из исходников не обязательно.

Xnest-сервер не пользуется популярностью, да и использовать не рекомендую, у него довольно много недостатков.

В Xgl-сервере многих недостатков нет, но и он тоже не «безгрешен». Например, не будет рабо­тать Direct Rendering, из-за этого про игры можно забыть. Также он не поддерживает по умолчанию драйвер evdev, драйвера видеокарты GeForce, некоторые программы не поддерживают Xgl, но все эти проблемы решаемы. Но зато в Xgl работают эффекты Compiz и Beryl. К сожалению, проект XGL заброшен и был удалён из исходных кодов Xorg,  и к тому же, начиная с Ubuntu 8.10, пакет xserver-xgl был исключён из репозиториев, применять Xgl на практике не рекомендую: компилиро­вать его из исходников под новейшие системы очень тяжело, а готовые пакеты из других систем ра­ботают некорректно. Это описание изначально было заточено под Xgl, главной задачей было доне­сти до всех принципы настройки мультисита, поэтому переделывать статью не буду, дело это дол­гое и нудное. Поняв тонкости процесса настройки, вы сможете сделать мультисит на любой основе, будь то Xephyr, Xgl, или даже Xorg.

Систему "мультисит" без особых недостатков можно настроить только по принципу «одно место – одна видеокарта – один монитор – одно ядро процессора». Только в этом случае вы получите полноценную систему на несколько пользователей. Пример настройки такой системы на внешней видеокарте и стандартной офисной материнской плате mATX со встроенным видео приведен в конце статьи в разделе "Использование X/Xorg".

Ещё один прекрасный пример такой конфигурации — 3D Multiseat (кстати, из этой статьи я сам использовал много полезной информации):

http://www.automation.dn.ua/linux/3d-multiseat.html

Очень оригинальна идея с использованием MPX (использование двух клавиатур и двух мышек на одном рабочем столе), это не Multiseat, но попробовать стоит:

http://wearables.unisa.edu.au/mpx/?q=main_ru

Самое главное условие при построении мультисита: привязать каждую пару "клавиатура/мышь" к конкретному рабочему месту. Это делается при помощи драйверов evdev. Но XGL изначально не поддерживает этот драйвер по умолчанию (в отличии от него в последних версиях Xephyr этот не­достаток был устранён), поэтому без накладывания патчей на исходники не обойтись. Есть также ещё несколько "подводных" камней, о которых будет сказано в конце статьи в главе "Использова­ние EVDEV".

Описанный мною способ позволяет обойтись без патчей, всё начинает работать сразу. Достигает­ся это благодаря программе Xevdevserver, которая написана бельгийским программистом Jori Lie­senborgs. Также хочу поблагодарить Артёма Мороза за решение некоторых проблем и дополнения. Кстати, Артём сам программист, и в фирме, где он работает, была написана программа Friendly­Seats для системы windows. Эта программа позволяет легко и быстро настроить мультисит в win­dows xp. Официальный сайт программы:

http://www.friendlyseats.com/

В процессе конфигурирования системы я использовал также следующую литературу:

Оригинал статьи по XGL, а также необходимые файлы, можно найти на сайте:

http://research.edm.uhasselt.be/~jori/page/index.php?n=Misc.DualSeatX

Вариант конфигурирования "мультисит-на-лету" под Ubuntu:

http://ubuntuforums.org/showthread.php?t=707796

В конце статьи будут приведены процессы конфигурирования системы на базе Xephyr/Xnest с применением утилиты Xevdevserver и без неё, стандартного мультисита с применением Xevdevser­ver'а и без него.

 

MULTISEAT С ПРИМЕНЕНИЕМ XGL+XEVDEVSERVER

Стадия 1: настройка Xorg

Для мультимониторных конфигураций с одной видеокартой желательно использовать видеокар­ты серии GeForce. Я в своих опытах использовал видеокарту GeForce E6600GT PCI-E фирмы Asus, поэтому всё моё описание сделано именно для неё.

Самое главное условие для настройки: ваша видеокарта должна поддерживать в системе Linux расширение рабочего стола на второй монитор. К сожалению не все видеокарты на это способны, в частности, некоторые бюджетные карты серии Radeon не позволяют это сделать.

Приступим к настройкам. Сначала нужно установить и полностью настроить систему Ubuntu обычным способом: с одной клавиатурой, одной мышкой и одним монитором (хотя можно сразу подключить второй комплект монитора/клавиатуры/мыши, хуже не будет), стандартными открыты­ми драйверами оборудования (в частности видеокарт) и т.д. На этой же стадии создаём других пользователей, в том числе и root'а, присваиваем им пароли, необходимые права. Обязательно нуж­но войти в систему под профилем каждого пользователя и отключить эффекты рабочего стола Compiz. Также желательно именно на этой стадии конфигурирования выполнить действия, описан­ные в главе "Стадия 4: "допиливаем" систему". Дело в том, что после стадии 2 выполнить большинство этих настроек будет гораздо проблематичнее.

Затем подключаем второй монитор, клавиатуру и мышь (если вы этого еще не сделали), и уста­навливаем проприетарные драйвера для своей видеокарты; до кучи можно установить программу управления драйверами (для видеокарт GeForce это пакет nvidia-settings, для видеокарт Radeon — fglrx-control).

Эти программы управления позволят быстро получить нужный файл /etc/X11/xorg.conf. Но по­сле установки XGL-сервера эти программы перестают работать. Можно воспользоваться и про­граммой displayconfig-gtk: работает она правда с некоторыми глюками, но зато будет запускаться нормально даже после установки XGL.

Ну а самые продвинутые могут использовать командную строку и текстовый редактор vi. Но по­сле конфигурирования файл xorg.conf нужно проверить, что все номера устройств правильные, с помощью команды:

sort /etc/X11/xorg.conf | uniq

Перезагружаем компьютер, чтобы установленные драйвера начали работать. Проверяем, что всё прошло успешно.

Сначала посмотрим, что драйвера установились нормально:

lsmod | grep nvidia

Результат должен быть такой:

nvidia                      7096260 70

agpgart                   30216 2 nvidia

i2c_core                 20096 5 nvidia,it87,i2c_isa,i2c_nforce2,i2c_piix4

Второй шаг: проверяем, что ускорение работает:

glxinfo | grep direct

Результат:

direct rendering: Yes

Далее проверяем, что система использует именно проприетарные драйвера видеокарты:

glxinfo | grep vendor

Результат:

server glx vendor string: NVIDIA Corporation

client glx vendor string: NVIDIA Corporation

OpenGL vendor string: NVIDIA Corporation

Второе условие наиболее важно, поскольку без него ничего работать не будет.

Теперь наша задача – получить на двух мониторах два независимых рабочих стола для одного пользователя. Рекомендуется для обоих дисплеев делать разрешение одинаковым и не выходить сначала за предел 1024×768 (если диагональ мониторов больше 15", то можно выставить разреше­ние и побольше). Для этих целей можно воспользоваться либо пакетами управления драйверами (которые нужно запускать обязательно от имени root или через sudo), но лучше всего воспользо­ваться утилитой displayconfig-gtk, которая будет работать с любыми видеокартами. Если у вас эта утилита отсутствует, то ее можно установить из репозиториев из одноименного пакета.

Если вы решили воспользоваться этой утилитой, то нужно сделать так: грохнуть файл /etc/X11/xorg.conf, перед этим сделав его резервную копию, затем запустить конфигуратор

sudo displayconfig-gtk

и выставить все необходимые параметры для видеокарты и нажать ОК; снова запустить этот кон­фигуратор, выставить все параметры для мониторов и расширить рабочий стол на второй монитор со сдвигом вправо; отредактировать вновь созданный xorg.conf: поскольку первый монитор у меня был 17", второй попался на 15", то в одной из секций "Screen" субсекции "Display" строку Virtual 1792 1344 нужно изменить на Virtual 1024 768максимальное разрешение 15-тидюймового дисплея (это разрешение и будет использоваться в дальнейшем). Если же у вас два одинаковых дисплея, например, на 17", то можно использовать и более высокое разрешение, которое вам будет удобно, например, Virtual 1280 1024.

Далее редактируем секцию "ServerFlags", отключаем Xinerama – расширение на второй экран, за­комментировав строку

#Option "Xinerama" "true"

И не забудьте проконтролировать параметры клавиатуры в секции "Input Device" "Generic Keyboard", последние строки должны быть такие:

Option "XkbLayout" "us,ru"

Option "XkbVariant" ",winkeys"

Option "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll"

(если раскладки переключаются стандартно клавишами Ctrl+Shift)

Перезагружаем систему и проверяем, что всё работает нормально, а на каждом мониторе у нас свой рабочий стол.

Примечание1: утилита displayconfig-gtk была исключена из репозиториев Ubuntu, начиная с вер­сии Ubuntu 8.10.  Поэтому для упрощения задачи можно поискать другие утилиты конфигурирова­ния, например, в проекте Fedora есть несколько таких утилит: system-config-display, Xconfigurator, xvidtune и т.д. 

Можно создать файл xorg.conf автоматически, использовав конфигуратор X-сервера:

а) нажимаем Ctrl+Alt+F2, чтобы перейти в другой терминал, затем логинимся под root'ом или поль­зователем с правами администратора;

б) останавливаем графическую оболочку:

/etc/init.d/gdm stop

в) даём команду X-серверу на автоматическое создание файла xorg.conf:

X -configure

Новый файл сохранится в каталоге /root под именем xorg.conf.new;

г) протестируем вновь созданный файл:

X -config /root/xorg.conf.new

д) если всё прошло успешно, то копируем файл /root/xorg.conf.new в каталог /etc/X11 и переимено­вываем. Теперь правим этот файл дальше ручками.

Примечание2: мне однажды попалась довольно "кривая" видеокарта GeForce 7300GT фирмы Palit, которая при использовании утилиты nvidia-settings не могла определить монитор на одном из видеовыходов, выдавала сообщение Unknown, а в стандартном наборе программы displayconfig-gtk этого монитора не оказалось, соответственно правильно параметры для него выставить было очень сложно. Я поступил следующим образом: сначала сделал файл xorg.conf при помощи утилиты nvidia-settings как есть, сделал бэкап этого файла, а затем поменял мониторы местами создал xorg.conf еще раз. Оставалось только делом техники перебросить конфиг для "неизвестного" мони­тора из одного файла xorg.conf в другой, чтобы этот монитор начал корректно работать.

 

Стадия 2: установка программ

Устанавливаем Xgl-сервер, а также пакеты для компиляции необходимых программ и настройки системы. Устанавливаем XGL:

sudo apt-get install xserver-xgl dbus-x11 xserver-xorg-input-evdev

Для компиляции Xevdev-сервера нужно установить следующие пакеты:

sudo apt-get install libx11-dev libxtst-dev gizmod libncurses5-dev build-essential

Как было сказано выше, после установки Xgl-сервера уже нельзя будет управлять разрешением экрана и драйверами видеокарт через центры управления, а результатом выполнения команды glx­info | grep direct будет direct rendering: No, некоторые другие функции также работать не будут. Не беспокойтесь, это вполне нормальное явление.

Итак, установка прошла успешно, теперь нужно удалить файл /etc/X11/Xsession.d/98xserver-xgl_start-server, чтобы нам XGL не мешался, когда он не нужен. Также можно создать файл с именем ~/.config/xserver-xgl/disable.

Примечание: в репозиториях новых версий Ubuntu 8.10 и 9.04 отсутствуют некоторые пакеты, например, xserver-xgl. Я пробовал в Ubuntu 9.04 установить пакет 8.04, и вроде всё заработало, но возникли досадные проблемы с клавиатурой: индикатор раскладок напрочь отказался работать, а некоторые клавиши оказались перепутаны, и увы, никакие пляски с бубном не помогли. Но наряду с DEB-пакетами в репозиториях есть исходники, поэтому если кому интересно, можно собрать Xgl конкретно под свой дистрибутив:

http://mirror.yandex.ru/ubuntu/pool/universe/x/xserver-xgl/

Необходимо скачивать версию 1.1.99.1 (более старая, которая обозначена как 7.0.0, с мультиси­том не работает). Обязательно вместе с исходником *.orig.tar.gz скачайте файлы *.diff.gz и *.dsc, в них содержатся все необходимые данные для компиляции.

Эти же файлы можно скачать с сайта: https://launchpad.net/xserver-xgl и здесь же можно следить за выходом новых версий XGL.

 В крайнем случае можно скачать с официальных CVS-репозиториев и собрать. Вот некоторые  инструкции по установке XGL из CVS:

http://freedesktop.org/wiki/Software/Xgl

http://www.xakep.ru/magazine/xa/091/108/1.asp

Также исходники всегда доступны здесь:

http://webcvs.freedesktop.org/xorg/xserver/xorg/hw/xgl/

Теперь скачиваем необходимые файлы:

http://research.edm.uhasselt.be/~jori/page/uploads/Misc/XglScript.sh

http://research.edm.uhasselt.be/~jori/page/uploads/Misc/XevdevScript.sh

http://research.edm.uhasselt.be/~jori/page/uploads/Misc/startsched.c

http://research.edm.uhasselt.be/jori/errut/errut-1.0.0.tar.gz

http://research.edm.uhasselt.be/~jori/page/uploads/Misc/xevdevserver-2.0.0.tar.gz

Редактируем скачанные скрипты. Сначала редактируем XglScript.sh: в 14-й строке XGLCOMMAND вместо пути /opt/Xgl/bin/Xgl прописываем истинный путь к исполняемому файлу Xgl-сервера: /usr/bin/Xgl

Обязательно проверьте наличие остальных файлов в путях, которые прописаны в других стро­ках, и в случае необходимости измените их. Например, у меня после установки проприетарного драйвера GeForce пришлось немного подправить строку XGLPRELOAD=/usr/lib/libGL.so, поскольку по указанному пути вместо файла libGL.so у меня появился файл libGL.so.1, который в свою оче­редь является симлинком на libGL.so.169.12 (у меня были установлены драйверы версии 169.12)

Также нужно подправить XevdevScript.sh, заменив в строке XCOMMAND параметр /usr/X11R6/bin/Xorg на /usr/bin/X -br -audit 0. Но если вы решите использовать  сервер Xorg (как это было сделано в оригинальной статье), то в этом скрипте ничего исправлять не надо.

Копируем XglScript.sh и XevdevScript.sh в папку /usr/local/sbin, затем компилируем startsched.c командой:

gcc -o startsched startsched.c

и копируем получившийся файл startsched в ту же папку.

Теперь нужно дать необходимые права всем этим скриптам: владелец – root с правами r-w-x, группа – root с правами r-x, для остальных права r-x. Сделать это можно в mc через меню «Файл → Расширенные права».

Далее распаковываем архивы errut-1.0.0.tar.gz и xevdevserver-2.0.0.tar.gz и компилируем: сначала обязательно errut, и только потом xevdevserver. Компиляция в обоих случаях проводится обычным способом, при помощи команд:

./configure

make

sudo make install

В системах Ubuntu 8.10 и 9.04 Xevdevserver может не скомпилироваться; если у вас такое проис­ходит, то нужно внести изменения в файл /src/eventdevice.h, дописав в него строчки #include <cstring> и #include <cstdlib> после #include <inttypes.h>. А если и после этого процесс компиляции будет выдавать ошибку в файле xserverconnection.cpp, то в файл xserverconnection.h  добавляем строку #include <inttypes.h> после #include <X11/Xlib.h>. Более подробно компиляцию Xevdevserver обсуждают здесь: http://ubuntuforums.org/showthread.php?t=707796&page=3

Небольшое замечание: все указанные выше скрипты и программы можно использовать и при кон­фигурировании системы на Xnest- и Xephyr-сервере, но для этого нужно будет внести соответству­ющие исправления и вместо xserver-xgl установить требуемый пакет. Более подробное описание этого момента сделано в самом конце статьи в главе "Использование Xephyr/Xnest+Xevdevserver"

 

Стадия 3: конфигурирование GDM

Есть два пути конфигурирования: редактировать файл /etc/gdm/gdm.conf, либо файл /etc/gdm/gdm.conf-custom

Во втором случае конфигурирование можно частично выполнить через графическую оболочку, войдя в меню "Администрирование → Окно входа в систему". При этом на всякий случай нужно включить запись логов событий, прописав в секцию [daemon] строку LogDir=/var/log/gdm

В первом же случае все логи будут прописываться в каталоге /var/log/gdm, но мы лишаемся воз­можности конфигурирования через графическую оболочку, все выполняется только ручками с ис­пользованием текстового редактора.

Если вы решили выбрать первый путь (редактировать файл gdm.conf), то для начала нужно из ка­талога /etc/gdm/ убрать файлы gdm.conf-custom и gdm.conf-orig. Их можно переименовать, перене­сти в другое место, наконец просто грохнуть (если не жалко). Также нужно раскомментировать строку Greeter=/usr/lib/gdm/gdmgreeter в секции [daemon]

Но я всё-таки рекомендую редактировать файл gdm.conf-custom, так как при этом основной файл gdm.conf остаётся нетронутым, что очень важно в случае "падения" иксов.

Перед тем, как делать какие-либо исправления, надо сначала определить идентификаторы наших клавиатур и мышей. Для этого смотрим содержимое нужного файла:

cat /proc/bus/input/devices

и определяем, на каких шинах подключены именно наши клавиатуры и мыши, посмотрев их иденти­фикаторы eventX (где X — идентификатор, который можно узнать в строках H:Handlers). В моём случае клавиатуры имели идентификаторы event1 и event3, мыши – event2 и event5. Поэтому в обоих листингах ниже приведены именно мои параметры, у вас эти параметры могут быть абсолютно другими.

Но идентификаторы eventX при каждой перезагрузке могут изменяться без "оглядки" на преды­дущие конфиграции. Поэтому вместо этих идентификаторов желательно использовать любые дру­гие, которые прописаны в файле /proc/bus/input/devices в секции для ваших устройств. Например, вы можете из строки использовать идентификатор usb-0000:00:03.0-1/input0 из строки P:Phys, или "Microsoft 3-Button Mouse with IntelliEye(TM)" из строки N:Name и даже идентификатор inputX из строки S:Sysfs и т.д. Если у вас используются одинаковые мыши и клавиатуры, то имена в качестве идентификаторов лучше не использовать. В примерах ниже были использованы идентификаторы eventX, но я все-таки рекомендую использовать идентификатор порта из строки P:Phys, либо иден­тификаторы из каталога /dev/input/by-path/, которые в свою очередь являются симлинками на eventX и будут оставаться всегда постоянными.

Итак, открываем редактируемый файл и в секции [daemon] прописываем (либо ищем эту строку и раскомментируем её):

AlwaysRestartServer=true

Теперь есть два варианта конфигурирования.

Вариант1: сначала стартует основной X-сервер, а поверх него – два сеанса Xgl и Xevdev-сервер.

Важное замечание: в приведённом ниже конфиге в обоих секциях server-Xgl строка com­mand=… и следующая строка – это одна команда, которая должна быть написана в одну строку че­рез пробел. Поскольку команда очень длинная, она не вместилась в данном описании в одну строку целиком, пришлось разбить на две.

Также для видеокарт Radeon в секциях Xgl вместо параметра -accel glx:pbuffer -accel xv:fbo для большей совместимости желательно указать другой параметр: -accel glx:pbuffer -accel xv:pbuffer. То же самое относится и ко второму варианту конфигурации.

И ещё одно дополнение: вы вместо сервера X можете также использовать сервер Xorg, как это было сделано в оригинале, в этом случае в секции [servers] строке 0=Standard нужно удалить пара­метр device=/dev/console, а в секции [server-Standard] в строке command прописать путь /usr/X11R6/bin/Xorg. Как было сказано выше, в этом случае скрипт XevdevScript.sh в редактировании не нуждается. Более того: в приведенном ниже варианте этот скрипт не задействован, так что в данном случае его можно вообще удалить, но я рекомендую все-таки его оставить.

[servers]

0=Standard device=/dev/console

1=Xgl1

2=Xgl2

 

[server-Standard]

name=Standard server

command=/usr/bin/X -br -audit 0

handled=false

flexible=false

 

[server-Xgl1]

name=Xgl1

command=/usr/local/sbin/XglScript.sh -display :0.1 -keyboard /dev/input/event3 -mouse /dev/input/event2 -dpi 86 -fullscreen -ac -accel glx:pbuffer -accel xv:fbo -xkbmap us -softcursor

handled=true

flexible=false

 

[server-Xgl2]

name=Xgl2

command=/usr/local/sbin/XglScript.sh -display :0.0 -keyboard /dev/input/event1 -mouse /dev/input/event5 -dpi 86 -fullscreen -ac -accel glx:pbuffer -accel xv:fbo -xkbmap us

handled=true

flexible=false

Вариант 2: Xevdev-сервер и Xgl-сеансы стартуют перед основным X-сервером, таким образом они получат управление устройствами сразу.

Важное замечание: в этом конфиге не желательно использовать данные из строк N:Name в качестве идентификаторов клавиатур и мышек.

Также заметьте, что в отличии от предыдущего в этом варианте уже задействован скрипт  XevdevScript.sh.

[servers]

0=Standard

1=Xgl1

2=Xgl2

 

[server-Standard]

name=Standard server

command=/usr/local/sbin/XevdevScript.sh -xevdev ":1,/dev/input/event3,/dev/input/event2" -xevdev ":2,/dev/input/event1,/dev/input/event5"

handled=false

flexible=false

 

[server-Xgl1]

name=Xgl1

command=/usr/local/sbin/XglScript.sh -display :0.1 -dpi 86 -fullscreen -ac -accel glx:pbuffer -accel xv:fbo -xkbmap us -softcursor

handled=true

flexible=false

 

[server-Xgl2]

name=Xgl2

command=/usr/local/sbin/XglScript.sh -display :0.0 -dpi 86 -fullscreen -ac -accel glx:pbuffer -accel xv:fbo -xkbmap us

handled=true

flexible=false

Запись -xevdev ":1,/dev/input/event3,/dev/input/event2" в секции [server-Standard] означает, что все сигналы, поступающие с клавиатуры с идентификатором event3 и мыши event2 будут переадресова­ны на дисплей :1.

 

Стадия 4: «допиливаем» систему

1) Если после полной настройки системы на рабочих местах не работает автоповтор с клавиатуры, то каждому пользователю в ~/.bashrc надо добавить строку: xset r on

2) Под профилем каждого пользователя в меню  Система → Параметры → Управление питанием (программа gnome-power-preferences) во вкладках "При питании от сети" и "От батареи" в параметрах "Приостанавливать компьютер через" и "Отключать дисплей через"  ползунки поставить в максимальное положение "Никогда".

3) Некоторые программы windows не запускаются в Wine, поскольку при их запуске меняется раз­решение экрана, а в данной конфигурации это невозможно. Но решение есть: для этого войти в кон­фигуратор Wine (команда winecfg) и во вкладке «Графика» установить флажок «Эмулировать виртуальный рабочий стол», и затем выставить нужное разрешение для этого стола.

4) К сожалению при старте системы программа-приглашение gdmgreeter не запускается, выдаётся ошибка. Причина этого: gdmgreeter собран без поддержки XGL. Можно конечно же перекомпили­ровать gdmgreeter из исходников, включив поддержку XGL, но есть более простой способ: вместо gdmgreeter можно использовать другую программу-приглашение — gdmlogin. Заходим в меню Си­стема → Администрирование → Окно входа в систему → вкладка «Локальный вход» → в пунк­те «Стиль» выставляем «Простой» (пользователь будет вводить и имя, и пароль) или «Простой с выбором изображений» (пользователь будет выбирать своё имя из списка, затем вводить только пароль), и далее в этой же вкладке настраиваем его под свои требования. Можно также настроить и другие параметры в остальных вкладках.

Вариант ручного редактирования: в файл gdm.conf-custom в секцию [daemon] прописать строку:

Greeter=/usr/lib/gdm/gdmlogin

5) Пока у нас открыто нужное окно, сделаем другие настройки. Не рекомендуется включать пара­метр «Включить автоматический вход в систему» во вкладке «Безопасность», иначе пользова­тель, для которого включен этот параметр, рискует увидеть свой рабочий стол на мониторе другого пользователя.

6) А вот параметр «Запретить несколько параллельных сеансов для одного пользователя» во вкладке «Общие» нужно обязательно отключить, иначе при попытке пользователя дважды войти в систему графическая оболочка выпадет в чёрный экран. А в данном случае при попытке дважды войти под одним и тем же логином система выдаст предупреждение, что такой сеанс уже существу­ет. Хотя, если нажать «Вернуться к текущему сеансу», графическая оболочка всё равно выпадает в черный экран.

7) Некоторые программы используют аппаратный курсор вместо программного, и только один пользователь в этом случае может использовать такие программы. У второго пользователя исполь­зование аппаратного курсора отключается параметром -softcursor в строке command секции [server-Xgl1]. Если планируется делать 3 и более рабочих мест, то этот параметр нужно прописать и для остальных пользователей, кроме одного; у того пользователя, которым будет сидеть за основным монитором, этот параметр прописывать не нужно, для всех остальных — обязательно прописать; какой монитор является основным, можно определить либо через утилиты управления видеокарта­ми, либо в файле xorg.conf.

8) В процессе эксплуатации системы вскрылась ещё одна неприятная особенность: если пользова­тель, у которого разрешен аппаратный курсор, не работает в течение 10 минут, то оба монитора гаснут, ещё через 10 минут они отключаются совсем; решить проблему помог совет из ссылки ниже: для отключения скринсейвера нужно отредактировать файл /etc/X11/xorg.conf, добавив  в секцию "ServerFlags" следующие строки:

Option "BlankTime" "0"

Option "StandbyTime" "0"

Option "SuspendTime" "0"

Option "OffTime" "0"

Совет подсмотрен здесь: http://beopen.gr/blog/?p=11

9) При подключении флэшки, дискеты, CD-диска или другого носителя на втором рабочем столе появляется сообщение «не могу смонтировать том». Это является следствием того, что система пытается 2 раза смонтировать носитель. А в результате производить запись на носитель сможет только первый пользователь. Для того, чтобы устройство стало доступно для записи второму поль­зователю, первый должен у себя устройство отмонтировать, а второй — присоединить, что не очень удобно.

Чтобы отключить автомонтирование, нужно под профилем каждого пользователя запустить Ре­дактор конфигурации gconf-editor, пройти в ветку /apps/nautilus/preferences/ и снять галочки с параметров media_automount и media_automount_open; затем открыть ветку /apps/nautilus/desktop/ и снять галочку volumes_visible. В этом случае все носители монтируются только в случае обращения к ним; пользователь может начать работать с ними, выбрав в меню «Переход» нужный диск.

Это действие нужно выполнить под профилем каждого пользователя.

11) после настройки системы с многомониторной конфигурацией пропадают некоторые права; выражается это в том, что в некоторых программах (таких как «Пользователи и группы», «Дата и время», «Службы» и т.д.) залочена кнопка «Разблокировать», запуск через sudo тоже не даёт ре­зультатов, и только при запуске от имени root всё нормально; также не работает автомонтирование флэшек или других USB-носителей.

Решается проблема следующим образом:

а) сначала нужно разрешить входить в систему в качестве root'а: Система → Администрирова­ние → Окно входа в систему → вкладка «Безопасность» → в пункте «Безопасность» ставим га­лочку «Разрешить локальный вход администратора системы»;

Если у вас нет root'а, то открываем консоль, даём команду sudo passwd root, придумываем пароль и вводим его два раза;

б) входим в систему в качестве root'а и запускаем утилиту, которая разруливает права: Система → Администрирование → Полномочия или в консоли вводим команду polkit-gnome-authorization

в) предоставляем необходимые привилегии. Например, чтобы разрешить пользователям монти­ровать флэшки, идем в ветку org → freedesktop → hal → storage и в необходимых действиях даём формальные привилегии выбранным пользователям.

Самое главное: после проделанных действий обязательно снимите галочку «Разрешить локаль­ный вход администратора системы»!

12) у многих может возникнуть вопрос: а как же администрировать такую систему с использовани­ем удалённого рабочего стола? И даже на этот вопрос есть решение.

Сначала каждый пользователь должен зайти в программу удаленного рабочего стола:  Система → Параметры → Удалённый рабочий стол (команда vino-preferences) и поставить следую­щие галочки:

а) во вкладке "Общие": ставим все галочки, кроме "Требовать от пользователя ввести пароль" (если установить эту галочку, то почему-то потом происходит сбой авторизации при соединении);

б) во вкладке "Дополнительно": ставим галочку "Использовать альтернативный порт", и вот уже здесь каждый пользователь должен прописать для себя свой порт; например, user1 будет ис­пользовать порт 5901, user25902, user35903 и т.д.; остальные галочки выставляются по же­ланию.

Теперь, когда администратор будет обслуживать систему при помощи программы "Просмотр удалённых рабочих столов" (команда vinagre %U), он в параметрах соединения должен указать порт для того пользователя, к которому желает "подцепиться"; например, для user2 администратор должен указать порт не 5900, а уже 5902.

13) как разрулить звук на несколько пользователей:

вариант №1: если в системном блоке несколько звуковых карт (например, две: одна встроенная и одна PCI), то звук можно настроить за счёт самой системы, для этого под профилем каждого поль­зователя через меню настроек звука достаточно выбрать свою звуковую карту; также это необходи­мо сделать в апплете управления громкостью, который находится рядом с часами, иначе получится ситуация, когда будет регулироваться общий звук;

до кучи нужно сделать настройки, чтобы звук от игр, которые запускаются через Wine, также шёл на разные аудиокарты, для этого достаточно в переменных окружения установить
AUDIODEV и MIXERDEV на устройства, которые вам захочется. Например один игрок будет пользоваться картой №1, второй №2. Узнаем, какие аудиоустройства у нас имеются:

ls /dev/dsp*

/dev/dsp  /dev/dsp1

ls /dev/mixer*

/dev/mixer  /dev/mixer1

Теперь, чтобы привязать каждому пользователю свою аудиокарту, достаточно в ~/.bashrc доба­вить следующие строки:

export MIXERDEV=/dev/mixer
export AUDIODEV=/dev/dsp

Для второго пользователя параметры будут mixer1 и dsp1, для третьего — mixer2 и dsp2 и т.д.

Более подробно можно прочитать здесь:

http://linux.automation.dn.ua/forum/viewtopic.php?f=3&t=41

вариант №2: использование одной аудиокарты 7.1 на нескольких пользователей:

необходимо создать файл .asoundrc в домашнем каталоге каждого пользователя; в него включа­ем следующие данные:

pcm.alc883 {

    type dmix

    ipc_key 2048

    slave {

        pcm "hw:0"

        rate 44100

        period_time 0

        period_size 1024

        channels 8

    }

    bindings {

        0 0

        1 1

        2 2

        3 3

        4 4

        5 5

        6 6

        7 7

    }

}

# green - "Front" in Alsa mixer

pcm.green {

    type plug

    slave {

        pcm "alc883"

        channels 8

    }

    ttable.0.0 1

    ttable.1.1 1

}

# gray - "Surround" in Alsa mixer

pcm.gray {

    type plug

    slave {

        pcm "alc883"

        channels 8

    }

    ttable.0.2 1

    ttable.1.3 1

}

# yelow - "Center" in Alsa mixer (mono?)

pcm.yelow {

    type plug

    slave {

        pcm "alc883"

        channels 8

    }

    ttable.0.4 1

    ttable.1.5 1

}

# black - Side in alsa mixer

pcm.black {

    type plug

    slave {

        pcm "alc883"

        channels 8

    }

    ttable.0.6 1

    ttable.1.7 1

}

 

pcm.!default {

    type plug

    slave {

        pcm "gray"

        channels 8

    }

}

Теперь внизу увидите секцию с названием default — какой цвет пропишите, к такому выходу подключайте, в микшере указанные ползунки перемещайте и будет у вас звук.

Нужно сделать генерацию этого файла при логине пользователя (с помощью .bashrc). Это дела­ется очень просто с использованием регулярных выражений: скрипт должен учитывать содержимое переменной окружения DISPLAY и согласно расположения ваших мест генерировать каждому пользователю свой вывод. Не забудьте скопировать файл, генерирущий .asoundrc, в /etc/skel, иначе придется каждый раз его копировать при добавлении нового пользователя.

Если при этом в Wine будет выдаваться такая ошибка:

err:dsound:DSOUND_MixOne Fatal error. Under/Overflow? primary_done=12160, mixpos=172032/172716 (85678/86018), primary_mixpos=1584, writepos=1712, mixlen=8192

то в скрипте параметр period_size = 1024 надо уменьшить до 512 или 256.

Совет взят отсюда: http://linux.automation.dn.ua/forum/viewtopic.php?f=1&t=68

14) можно пропатчить GDM, чтобы автовход в систему работал на каждом рабочем месте; за этот патч огромная благодарность Артёму Морозу; итак, создаем текстовый файл gdm.patch; содержимое этого файла можно посмотреть в самом конце в Приложении 3.

Последние строчки создают также файл myconf.sh в котором указаны правильные ключи для конфигурирования GDM.

Скачиваем исходники GDM 2.20, копируем в них созданный файл и патчим:

apt-get source gdm

apt-get build-dep gdm

cd gdm

patch -p0 < gdm.patch

Если патч не накладывается, можно вручную отредактировать строки в некоторых файлах, более подробно всё можно посмотреть в самом патче.

Затем всё компилируем и устанавливаем, только в данном случае вместо команды ./configure запускаем скрипт ./myconf.sh, дальше всё стандартно.

Для автоматического входа создаем файлы с именами /etc/gdm/gdm.conf.custom:Х,

где Х - номер экрана 0,1,2,....., например /etc/gdm/gdm.conf.custom:0. Теперь записываем в них сле­дующее содержимое:

[daemon]

AutomaticLoginEnable=true

#здесь указываем логин юзера

AutomaticLogin=userXXXX

 

ДРУГИЕ ВАРИАНТЫ НАСТРОЙКИ MULTISEAT

Использование Xephyr/Xnest+Xevdevserver

Как уже было сказано выше, вместо XGL-сервера вы можете использовать Xephyr или Xnest (но лучше всё-таки первый вариант), но с некоторыми потерями. Но зато скорость работы будет выше, а также можно использовать стандартное окно приглашения gdmgreeter, которое не запускалось в случае с XGL (см. стадию 4 п.3)

Итак, вместо пакета xserver-xgl устанавливаем xserver-xephyr (или xnest). Редактируем XglScript.sh: в 14-й строке XGLCOMMAND вместо пути /opt/Xgl/bin/Xgl прописываем путь к исполняе­мому файлу: /usr/bin/Xephyr или /usr/bin/Xnest.

Также можно закомментировать строку XGLPRELOAD=/usr/lib/libGL.so и другие строки, свя­занные с этой переменной (они расположены в самом конце скрипта), поскольку они нужны только для XGL, который "не особо дружит" с драйверами GeForce:

# if [ "x$XGLPRELOAD" != "x" ] ; then

#              export LD_PRELOAD="$XGLPRELOAD"

# fi

Чтобы было понятнее,  можно переименовать скрипт XglScript.sh на XephyrScript.sh (или XnestScript.sh)

Строки command для серверов Xephyr в файле gdm.conf-custom станут покороче, и выглядеть будут примерно так:

command=/usr/local/sbin/XephyrScript.sh -display :0.1 -keyboard isa0060/serio0/input0 -mouse isa0060/serio1/input0 -fullscreen -ac -dpi 86 -xkbmap us

В случае с Xnest-сервером строка будет выглядеть так:

command=/usr/local/sbin/XnestScript.sh -display :0.1 -keyboard isa0060/serio0/input0 -mouse isa0060/serio1/input0 -geometry 1024x768+0+0 -dpi 92 -xkbmap us

Xephyr-сервер в отличие от XGL "понимает" только 3 идентификатора: eventX (или симлинки на него из каталога /dev/input/by-path/), S:Sysfs и P:Phys. С последним идентификатором Xephyr из­начально "не знаком", в других конфигурациях для этого нужен отдельный скрипт, который преоб­разует eventX в P:Phys и затем привязывает один к другому. В нашем случае благодаря Xevdev-server таких манипуляций не требуется.

Обратите внимание: параметров -accel glx:pbuffer -accel xv:pbuffer -softcursor не будет! Их прописывать не надо, иначе Xephyr-сервер ругнется, что не знает таких параметров, и в результате у вас ничего не запустится. Также можно убрать параметр -xkbmap us.

Также было замечено, что нажатие клавиш Ctrl+Alt+BackSpace на одной клавиатуре приводит к полной перезагрузке X-сервера (в случае с XGL выполнялась перезагрузка только одного места). Чтобы такого не происходило, нужно подправить xorg.conf, добавив в секцию "ServerFlags" следующие строки:

# Запрещаем рестарт X-сервера по Ctrl+Alt+BackSpace

Option "DontZap" "yes"

# Разрешаем старт иксов, даже если мышка не обнаружена

Option "AllowMouseOpenFail" "yes"

# Запрещаем VT switching (не знаю, что это такое, но раз просят...)

Option "DontVTSwitch" "yes"

Также в секции Section "Module" можно закомментировать некоторые строки, тем самым отключив загрузку лишних модулей, например Load "glx" (все равно он в Xephyr не будет использоваться).

Ну а все остальные настройки нужно делать согласно описания.

 

Использование Xephyr+Evdev

Процесс настройки Xephyr-сервера с использованием драйвера evdev практически ничем не от­личается от описанного выше способа. Разница будет заключаться только в том, что не нужно будет компилировать пакет xevdevserver и использовать XglScript.sh. Вместо всего этого будет использо­ван скрипт, который позволяет разрулить клавиатуры и мыши. Начиная с версии Ubuntu 8.04, Xephyr-сервер поддерживает драйвер evdev по умолчанию, в более ранних версиях придётся накла­дывать на исходники специальный патч, который включает эту поддержку.

Данный раздел сделан по мотивам этого описания:

http://netpatia.blogspot.com/2006/09/multiseat-computer-with-ubuntu.html

Я решил применить скрипт из описания для Ubuntu 6.06, поскольку в описаниях для систем 8.04 и 9.04 мультисит настраивается только на 2 монитора и при помощи двух скриптов (для большего количества мониторов придётся редактировать эти скрипты, что не каждому под силу); в данном случае вся настройка строится на одном скрипте, который позволяет разделить систему на любое количество мониторов без дополнительных плясок с бубном. Скрипт был немного модифицирован с учётом особенностей систем Ubuntu 8.04 и выше.

Итак, cоздаём файл xorg.conf нужной конфигурации, прописываем дополнительные строки, как описано в предыдущем разделе.

Теперь в каталоге /usr/sbin/ создаём скрипт с именем Xephyr.sh и делаем его исполняемым:

sudo gedit /usr/sbin/Xephyr.sh

sudo chmod 755 /usr/sbin/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[@]}"

В Ubuntu 6.06 этот скрипт преобразовывал идентификаторы eventX в физический идентификатор порта Phys, в данном скрипте сделано проще: используются идентификаторы из каталога /dev/input/by-path/, которые являются симлинками на eventX и при каждой перезагрузке меняться не будут. Поэтому в качестве идентификаторов в  секции [Servers] файла gdm.conf-custom следует применять именно их. Строки command для серверов Xephyr в этом файле будут примерно такими:

command=/usr/sbin/Xephyr.sh -display :0.0 -xauthority /var/lib/gdm/:0.Xauth -fullscreen -keyboard platform-i8042-serio-0-event-kbd -mouse platform-i8042-serio-1-event-mouse

ДОПОЛНИТЕЛЬНЫЕ МАТЕРИАЛЫ:

http://en.wikibooks.org/wiki/Multiterminal_with_Xephyr

http://en.wikibooks.org/wiki/Multiterminal_with_Xnest

Самый популярный вариант настройки двухмониторной конфигурации на Xephyr-сервере:

http://netpatia.blogspot.com/2008/02/multiseat-computer-with-ubuntu-804.html

http://netpatia.blogspot.com/2009/06/multiseat-in-ubuntu-904.html

Описания на русском языке:

http://vd.net.ru/Linux/Multiseat

http://www.altlinux.org/Multistation

http://freesource.info/wiki/AltLinux/Dokumentacija/Multistation

Также в конфигурировании мультисита на базе Xephyr'а с драйвером evdev поможет утилита MDM, которую можно найти здесь: http://wiki.c3sl.ufpr.br/multiseat/index.php/Mdm

 

Использование X/Xorg+Xevdevserver

Сначала немного предыстории. Наша компания купила компьютер с офисной материнской пла­той фирмы Gigabyte, в которой была встроена видеокарта Intel G33, а также была установлена внешняя видеокарта GeForce 9500GT. Компьютер был предназначен для установки системы "муль­тисит" с использованием XGL. Но позже выяснилось, что в БИОСе есть очень полезная опция, ко­торая позволяет держать встроенную видеокарту включенной даже тогда, когда установлена внеш­няя. Соответственно возникла идея сделать стандартный мультисит (1 видеокарта = 1 монитор).

Делать эту систему лучше всего по описанию, ссылка на которое была приведена в самом начале статьи во "Введении", но поскольку уже было всё установлено, а глобально переделывать систему было просто влом, мы решили использовать уже скомпилированный и установленный Xevdevserver. Главным плюсом такого решения будет полное ускорение на каждом рабочем месте и никаких ог­раничений, а цена будет примерно такой же или не намного выше.

Для начала небольшие рекомендации:

а) если вы хотите делать стандартный мультисит, то для этих целей рекомендую приобретать мате­ринские платы фирм Gigabyte или MSI; некоторые материнские платы фирмы Asus для этого дела не подойдут, поскольку у них встроенная видеокарта отключается при подключении внешней, по­этому будьте внимательнее;

б) также рекомендую брать материнские платы на базе процессора AMD и встроенными видеокар­тами GeForce или AMD (Radeon), внешние видеокарты тоже брать GeForce или Radeon, в этом слу­чае у вас не возникнет проблем с драйверами, а все настройки вы сможете разруливать через еди­ный центр управления (утилита nvidia-settings для GeForce или fglrx-control для AMD/Radeon);

в) делать такой мультисит рекомендую без использования Xevdevserver'а, а клавиатуры/мыши разруливать при помощи стандартного драйвера evdev, поскольку в процессе эксплуатации были выявлены некоторые не очень приятные нюансы, и только в том случае, если драйвер evdev работает некорректно (бывает и такое), можно попробовать применить Xevdevserver.

Принцип действия стандартного мультисита немного отличается от XGL и Xephyr, в частности на каждой видеокарте стартует отдельный сеанс Xorg/X, поэтому и настройки тоже будут отли­чаться:

1) в нашем случае в БИОСе необходимо было выставить опцию, чтобы первой обнаруживалась встроенная видеокарта (Onboard), и она же должна быть ведущей, потому что в процессе настройки выяснилось, что эта видеокарта не включалась, когда ведущей была внешняя (PEG);

2) пакеты xserver-xgl и xserver-xephyr устанавливать ни к чему; также  нет особой необходимости выполнять условие по расширению рабочего стола на второй монитор; более того: для видеокарт можно использовать драйвер "vesa";

3) редактируем xorg.conf: отличие от файла для XGL/Xephyr будет заключаться в том, что в нем бу­дет несколько секций [ServerLayout], одна секция на одно рабочее место, и в каждой секции будет прописан только один экран; параметров расширения на другой экран (типа screen 1 "screen2" rightof "screen1") также не будет.

В нашем случае для двух рабочих мест этот участок файла будет выглядеть так:

Section "ServerLayout"

                Identifier  "Layout1"

#              Inputdevice "Keyboard1" "CoreKeyboard"

#              Inputdevice "Mouse1" "CorePointer"

  screen 0 "screen1" 0 0

EndSection

 

Section "ServerLayout"

                Identifier  "Layout2"

#              Inputdevice "Keyboard1" "CoreKeyboard"

#              Inputdevice "Mouse1" "CorePointer"

  screen 0 "screen2" 0 0

EndSection

Как видите, к каждой секции [ServerLayout] нужно привязать свой экран "screenX", к которому в свою очередь привязаны свои монитор и видеокарта. Поскольку каждую пару "клавиатура/мышь" мы будет привязывать к своему рабочему месту при помощи Xevdevserver'а, то строки, где прописа­ны их параметры, можно закомментировать.

4) редактируем XglScript.sh: 14-я строка примет такой вид:

XGLCOMMAND="/usr/bin/nice -n -20 /usr/bin/X -br -audit 0"

Если вы будете использовать сервер Xorg, то вместо  X -br -audit 0  пропишите его. Помимо этого можно закомментировать строки, связанные с переменной XGLPRELOAD (как это было описано в предыдущей главе про Xephyr-сервер). Можно переименовать скрипт XglScript.sh на XScript.sh, чтобы название более точно отражало его предназначение.

Необходимость в скрипте  XevdevScript.sh отпадает, поскольку мы в данной конфигурации не сможем его применить.

5) последнее отличие: настройка gdm.conf. Как уже было сказано в пункте "Стадия 3", сам файл gdm.conf трогать не рекомендую, а все изменения вносить в gdm.conf-custom. В конечном итоге тот участок файла, где прописываются X-серверы, будет выглядеть так:

[servers]

0=Standard1

1=Standard2

 

[server-Standard1]

name=Standard1

command=/usr/local/sbin/XScript.sh -layout Layout1 -display :0 -keyboard usb-0000:00:1d.2-2/input0 -mouse usb-0000:00:1d.2-1/input0 -isolateDevice PCI:0:2:0 -sharevts -nolisten tcp -novtswitch -xkbmap us

handled=true

flexible=false

 

[server-Standard2]

name=Standard2

command=/usr/local/sbin/XScript.sh -layout Layout2 -display :1 -keyboard isa0060/serio0/input0 -mouse isa0060/serio1/input0 -isolateDevice PCI:1:0:0 -sharevts -nolisten tcp -novtswitch -xkbmap us

handled=true

flexible=false

Объяснения:

а) в параметре -layout нужно прописать идентификатор нашего X-сервера, который берётся из фай­ла xorg.conf секции [ServerLayout];

б) в параметре -isolateDevice прописываем идентификатор шины PCI, на которой "сидит" каждая видеокарта; посмотреть этот параметр можно либо в файле xorg.conf в секции [Device], либо в кон­соли набрав команду lspci | grep VGA; обратите внимание, как прописан идентификатор шины: правильный вариант прописан в файле xorg.conf; если этого нет, то смотрите, в каком виде выдаёт его консоль, и подгоните под нужный;

в) также очень важен параметр -sharevts, если его не указать, то система не заработает;

г) как правильно прописать параметры -display, -keyboard и -mouse, было сказано в пункте "Стадия 3: конфигурирование GDM".

д) параметры -nolisten tcp и -novtswitch можно не указывать (лично у меня и без них всё прекрасно работало), но в других системах они могут потребоваться, так что лишним не будет.

е) после первого запуска системы у меня получилось так, что одно из двух рабочих мест имело раз­решение больше положенного, из-за чего при перемещении курсора мышки в крайнее правое или нижнее положение экрана картинка как бы прыгала; в этом случае в файле xorg.conf  в каждую сек­цию "Screen" субсекцию "Display" добавить строку Virtual 1280 1024; в данном примере указано мак­симально возможное разрешение для стандартного 17-дюймового монитора; если у вас мониторы другие, то имеет смысл указать максимальное разрешение именно для ваших моделей (заметьте: в варианте мультисита на XGL нужно прописать этот параметр только в одной из двух секций Screen, поскольку используется только одна видеокарта).

Все остальные настройки нужно проводить согласно основного описания.

 

Использование X/Xorg+Evdev

В этом разделе будут даны некоторые рекомендации по применению драйвера evdev в системе Ubuntu, на случай, если вы вдруг решите сделать мультисит без применения программы Xevdevser­ver. Например, без неё можно обойтись при построении стандартного мультисита либо мультисита на Xephyr-сервере.

Разделить клавиатуры и мыши можно при помощи файла xorg.conf, прописав в нём необходимые параметры для каждого устройства и привязав его к конкретному сеансу. Вся сложность заключа­ется в том, что в качестве идентификатора каждого устройства ввода вы можете указать только /dev/input/eventX (для мышек можно также использовать /dev/input/mouseX), который при каждой перезагрузке может меняться, поэтому в один прекрасный момент клавиатуры и мышки  будут пе­репутаны.

 Для решения этой проблемы можно попробовать следующие варианты:

а) использование скрипта, который преобразует физический идентификатор Phys и приводит его к определённому идентификатору event; это скрипт можно найти в статьях, посвящённых мультиси­там на Xephyr-сервере, но если вы делаете стандартный мультисит, то этот скрипт нужно будет слегка подредактировать (ссылки на статьи можно посмотреть в главах "Введение" и "Заклю­чение");

б) привязать каждый идентификатор event к конкретному устройству через udev: я в интернете на­шел, как привязать имя устройства к идентификатору event, но это способ нежелателен, поскольку в системе могут использоваться одинаковые клавиатуры и мыши; как привязать каждый физичес­кий идентификатор Phys к event, я не нашёл;

в) использование идентификаторов из каталога /dev/input/by-path, которые в свою очередь являют­ся симлинками на eventX; в результате получится: даже если eventX изменится, симлинк всё равно будет привязан к идентификатору с нужным номером (если вы считаете, что симлинки имеют слишком длинные имена, вы их можете изменить в файле /etc/udev/rules.d/60-persistent-input.rules, поправив строки в секции by-path).

В итоге я выбрал третий способ. Если вы решите его повторить, то вам надо будет подредакти­ровать файл xorg.conf. Вот как выглядят секции для клавиатуры и мыши, подключенных к разъёму PS/2, в моём варианте файла:

Section "InputDevice"
    Identifier "Mouse1"
    Driver "evdev"
                Option "Device" "/dev/input/by-path/platform-i8042-serio-1-event-mouse"
                Option "Protocol" "ImPS/2"
                Option "Emulate3Buttons" "no"
                Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    Identifier "Keyboard1"
    Driver "evdev"
                Option "Device" "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
                Option "XkbRules" "xorg"
                Option "XkbModel" "evdev"
                Option "XkbLayout" "us,ru"
                Option "XkbVariant" ",winkeys"
                Option "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll"
EndSection

У клавиатур с драйвером evdev могут быть перепутаны клавиши (в частности у меня не работали клавиши стрелок); в GNOME эта проблема решается просто: надо в параметрах клавиатуры в строке "Модель" указать "Evdev-managed keyboard" (или "Клавиатура, управляемая драйвером evdev").

В файле /etc/gdm/gdm.conf-custom строки command примут такой вид:

command=/usr/bin/X :0 -br audit 0 -layout Layout1 -isolateDevice PCI:0:2:0 -sharevts -nolisten tcp -novtswitch

Т.е. здесь уже не надо прописывать клавиатуры и мыши, поскольку это уже сделано в xorg.conf, некоторые ключи тоже уйдут, а вот для указания монитора вместо ключа  -display :0 указываем просто номер монитора, как показано в примере.

Чтобы не сильно запариваться с настройками в Ubuntu 8.04, можно воспользоваться скриптами конфигурирования мультисита, которые можно установить из основного репозитория:

sudo apt-get install multiseat

После этого в каталоге /etc создать файл multiseat.conf и запустить утилиту конфигурирования:

sudo multiseat-configurator.

Иногда могут встречаться проблемы, например, всё настроено правильно, однако клавиатуры и мыши не работают или работают неправильно; в этих случаях нужно отредактировать файл /etc/X11/xorg.conf, дополнительно добавив в секцию "ServerFlags" следующие строки:

Option         "DefaultServerLayout" "seat0"

Option         "AllowMouseOpenFail"  "true"

Option         "AutoAddDevices"      "false"

Option         "AutoEnableDevices"   "false"

Совет взят отсюда: https://help.ubuntu.com/community/MultiseatX

ДОПОЛНИТЕЛЬНЫЕ МАТЕРИАЛЫ:

http://en.wikibooks.org/wiki/Multiterminal_with_evdev

http://cambuca.ldhs.cetuc.puc-rio.br/multiuser/

http://linuxgazette.net/124/smith.html

http://wpkg.org/Configuring_multiseat_X_workstation

Описания на русском языке:

http://www.altlinux.org/X11/DualSeat

http://www.klv.lg.ua/~vadim/multihead.html

 

Использование Userful Desktop Multiplier

Эта утилита является платной, её стоимость составляет 99$ за каждое рабочее место (для учеб­ных учреждений - 69$). Вы также получите USB-хаб для подключения клавиатуры, мыши и науш­ников. Однако на 2 рабочих места программу можно использовать бесплатно в домашних условиях, но её всё равно необходимо регистрировать через интернет для получения ключа. Если вы её не за­регистрируете, то программа через произвольные промежутки времени будет отключать все мони­торы на 20 секунд и показывать окно с предупреждением.

Принцип действия программы заключается в следующем: запускается пропатченный Xorg, кото­рый затем запускает эмуляцию виртуального рабочего стола для каждого пользователя, а модифи­цированный HAL привязывает  к каждому пользователю нужное оборудование с нужными правами. В итоге получается выигрыш в быстродействии, но про 3D-эффекты можно забыть, поскольку раз­работчики их выключают. Естественно, все патчи являются закрытыми.

Но как выяснилось, даже в платной программе есть проблемы с установкой, и в данной главе бу­дет рассказано, как их избежать.

Итак, сначала необходимо установить проприетраные драйвера на вашу видеокарту (GeForce или Radeon), затем установить программу из репозиториев или с официального сайта. После пе­резагрузки, когда программа попросит нажать клавиши на клавиатурах и мышках, нужно нажимать клавиши: F1 - для первого места, F2 - для второго и т.д. и щёлкнуть мышками. Если проделанных действий программа не загрузится корректно, то нужно перезагрузить систему в безопасный режим и подредактировать файл /etc/X11/userful.Mxorg.conf: в секции [Device] необходимо прописать для всех мониторов вместо "CRT, CRT" параметр "CRT, DFP", чтобы активировать выход DVI. Для некоторых видеокарт (в частности класса LE - Lite Edition) также необходимо отключить турбо-кэш.

За разъяснения отдельная благодарность LuckAs'у из города Хмельницкий.

 

ЗАКЛЮЧЕНИЕ:

В данной статье я попытался рассмотреть все возможные варианты реализации технологии Multi­seat в системе Linux и собрать все накопленные материалы воедино, чтобы вам, уважаемые "муль­тиситчики", не пришлось бы шарить по всему интернету в поисках ответов на свои вопросы. Но на всякий случай в качестве дополнительных материалов даны ссылки на другие статьи, посвящённые мультиситу. Вполне возможно, вы сможете найти в них что-нибудь полезное для себя. И хотя опи­сание "заточено" конкретно под Ubuntu, его можно применить и к другим дистрибутивам Linux.

Если вы нашли ошибку в описании, либо можете дополнить какой-либо ценной информацией, пишите на мой электронный адрес, который указан в самом начале.

Вот ещё два варианта реализации Multiseat, которые нынче уже не актуальны, но для общего раз­вития стоит посмотреть:

http://en.wikibooks.org/wiki/Multiterminal_with_faketty

http://pt.wikibooks.org/wiki/Multiterminais/Multiterminal_com_Ruby

 

ПРИЛОЖЕНИЕ 1

Установка драйверов NVIDIA GeForce

Источник: http://forum.ubuntu.ru/index.php?topic=3031.0

                        http://forum.ubuntu.ru/index.php?topic=15968

Недавно возникла необходимость установки официальных драйверов на видеокарту GeForce 9500GT, поскольку в репозиториях Ubuntu 8.04 драйверов на неё нет. А с "родными" драйверами придется немного поплясать с бубном. Поэтому, чтобы танцы особо долго не затягивались, я опишу процесс установки этих драйверов.

Итак, скачиваем последнюю версию драйверов для своей видеокарты с официальных сайтов www.nvidia.ru или www.nvidia.com в домашний каталог. Файл будет называться NVIDIA-Linux-x86-<version>-pkg1.run. Затем делаем скачанный файл исполняемым.

Проверяем, чтобы были установлены нужные пакеты и удалены ненужные. Обязательно просле­дите, чтобы для вашей версии ядра были установлены пакеты linux-headers, ну и соответственно пакеты для компиляции: build-essential (вместе с ним должны установиться пакеты gcc, g++, make и libc6-dev), pkg-config, binutils, xserver-xorg-dev:

sudo apt-get install linux-headers-`uname -r` binutils pkg-config build-essential xserver-xorg-dev

 А все пакеты nvidia-glx, nvidia-glx-new и т.д., если они установлены, обязательно необходимо удалить полностью.

Открываем файл /etc/default/linux-restricted-modules-common, в строке DISABLED_MODULES вносим следующие изменения: DISABLED_MODULES="nv nvidia nvidia_legacy nvidia_new". Если этого не сделать, то при перезагрузке система попытается восстановить некоторые библиотеки из пакета linux-restricted-modules, и в итоге у нас графическая оболочка не запустится.

Теперь еще одна тонкость: драйвер должен устанавливаться только при выключенной графиче­ской оболочке. Поэтому переходим в другой терминал при помощи Ctrl+Alt+F1, залогиниваемся под пользователем с привилегиями администратора или под root'ом.  Останавливаем графическую оболочку командой sudo /etc/init.d/gdm stop. Теперь переходим в домашний каталог и от имени root'а запускаем установку драйвера. Программу установки рекомендую запустить с параметром -e, который будет показывать ход установки:

sh ./NVIDIA-Linux-x86-<version>-pkg1.run

Если у программы установки никаких "претензий" к системе не будет, то сразу появится текст лицензионного соглашения, которое мы будем обязаны принять. Если же будет что-то не так, то обязательно посмотрите сообщение об ошибке и устраните её.

На следующем шаге программа установки спросит, где находятся готовые модули драйвера. По­скольку у нас их нет, то можно не проверять предложенный путь, а сразу нажать OK.  Далее про­грамма соответственно выдаст, что в указанном каталоге модули не найдены, и предложит скачать их с официального FTP. Здесь обязательно нужно ответить отказом. Затем программа спросит, же­лаем ли мы собрать эти модули самостоятельно. Ну и на все последующие вопросы нужно отвечать OK.

В конце процесса установки программа спросит, желаем ли мы перезаписать файл xorg.conf. От­вечаем OK. Откроем вновь созданный xorg.conf и проверяем: в секции [Section "Device"] строка Driver должна выглядеть так: Driver "nvidia". Если там прописан какой-либо другой модуль (например, "nv"), исправьте его. Можно так же добавить в эту же секцию строку Option "NoLogo" "TRUE", чтобы при загрузке X-сервера не появлялся логотип nVidia (некоторых это раздражает). В секции [Section "Module"] закомментировать (или удалить) строки: Load "dri" и Load "GLCore", и добавить в этот же раздел строку Load "glx", если она отсутствует.

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

Для удаления драйвера нужно также остановить работу GDM и перейти в каталог с инсталлято­ром, а затем набрать команду

sh ./NVIDIA-Linux-x86-<version>-pkg1.run --uninstall

 

Установка драйверов ATI Radeon

 Драйвера для этих видеокарт устанавливаются несколько проще. Сначала скачиваем драйвер с официального сайта www.radeon.ru. В отличии от GeForce драйвер для Radeon имеет гораздо больший размер (более 90 МБ) и расчитан сразу на все видеокарты и на платформы 32 и 64 бита. Драйвер будет иметь название ati-driver-installer-<version>-x86.x86_64.run.

Итак, открываем консоль, залогиниваемся под root или через sudo запускаем установку драйве­ра: sh ./ati-driver-installer-<version>-x86.x86_64.run и далее просто соглашаемся с лицензией и делаем то, о чем скажет программа установки.

Сразу после установки запускаем в консоли /usr/bin/aticonfig --initial для конфигу­рирования драйвера.

После всех проделанных действий перезагружаем компьютер.

Чтобы удалить драйвер, нужно в консоли  выполнить команду:

sudo sh /usr/share/ati/fglrx-uninstall.sh

и затем перезагрузиться.

 

ПРИЛОЖЕНИЕ 2

Вот мой вариант файла xorg.conf для мультисита на XGL, который был получен при помощи утилиты displayconfig-gtk и слегка подредактирован:

# Fallback X.org config file

# FIXME: include the wacom devices (would only add noise at the current

#        development stage)

 

Section "InputDevice"

                Identifier  "Generic Keyboard"

                Driver                     "kbd"

                Option                     "CoreKeyboard"

                Option                     "XkbRules"             "xorg"

                Option                     "XkbModel"             "pc105"

                Option                     "XkbLayout"           "us,ru"

                Option                     "XkbVariant"           ",winkeys"

                Option                     "XkbOptions"          "grp:ctrl_shift_toggle,grp_led:scroll"

EndSection

 

Section "InputDevice"

                Identifier  "Configured Mouse"

                Driver                     "mouse"

                Option                     "CorePointer"

                Option                     "Device"  "/dev/input/mice"

                Option                     "Protocol"               "ImPS/2"

                Option                     "ZAxisMapping"      "4 5"

                Option                     "Emulate3Buttons" "true"

EndSection

 

Section "ServerLayout"

                Identifier  "Default Layout"

                Inputdevice             "Generic Keyboard"

                Inputdevice             "Configured Mouse"

  screen 0 "screen1" 0 0

  screen 1 "screen2" rightof "screen1"

EndSection

Section "Module"

                Load                       "glx"        # 3D layer

                Load                       "v4l"        # Video for Linux

                Load                       "dbe"       # Double-Buffering Extension

                Load                       "extmod"

                Load                       "freetype"

EndSection

Section "device" # 

                Identifier  "device1"

                Boardname             "NVIDIA GeForce 6 Series"

                Busid                      "PCI:1:0:0"

                Driver                     "nvidia"

                Screen    0

                Vendorname           "NVIDIA"

EndSection

Section "screen" # 

                Identifier  "screen1"

                Device                    "device1"

                Defaultdepth           24

                Monitor                   "monitor1"

                SubSection "Display"

                               Depth      24

                               Virtual      1024        768

                               Modes                    "1024x768@75"     "832x624@75"       "1024x768@60"     "800x600@60"       "1152x864@75"     "800x600@75"                "1280x1024@75"   "800x600@72"       "1280x960@60"     "800x600@56"       "1280x1024@60"   "640x480@75"       "1280x960@75"                "640x480@72"       "1400x1050@60"   "640x480@60"       "1400x1050@75"   "1600x1200@65"   "1600x1200@60"   "1792x1344@60"

                EndSubSection

EndSection

Section "monitor" # 

                Identifier  "monitor1"

                Vendorname           "NEC"

                Modelname             "NEC MultiSync LCD1701"

                Horizsync               31.0-83.0

                Vertrefresh             56.0-75.0

  modeline  "640x480@60" 25.2 640 656 752 800 480 490 492 525 -vsync -hsync

  modeline  "640x480@72" 31.5 640 664 704 832 480 489 491 520 -vsync -hsync

  modeline  "640x480@75" 31.5 640 656 720 840 480 481 484 500 -vsync -hsync

  modeline  "800x600@56" 36.0 800 824 896 1024 600 601 603 625 +hsync +vsync

  modeline  "800x600@72" 50.0 800 856 976 1040 600 637 643 666 +hsync +vsync

  modeline  "800x600@75" 49.5 800 816 896 1056 600 601 604 625 +hsync +vsync

  modeline  "800x600@60" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync

  modeline  "832x624@75" 57.284 832 864 928 1152 624 625 628 667 -vsync -hsync

  modeline  "1024x768@75" 78.8 1024 1040 1136 1312 768 769 772 800 +hsync +vsync

  modeline  "1024x768@70" 75.0 1024 1048 1184 1328 768 771 777 806 -vsync -hsync

  modeline  "1024x768@60" 65.0 1024 1048 1184 1344 768 771 777 806 -vsync -hsync

  modeline  "1152x864@75" 108.0 1152 1216 1344 1600 864 865 868 900 +hsync +vsync

  modeline  "1280x1024@75" 135.0 1280 1296 1440 1688 1024 1025 1028 1066 +hsync +vsync

  modeline  "1280x960@60" 102.1 1280 1360 1496 1712 960 961 964 994 -hsync +vsync

  modeline  "1280x1024@60" 108.0 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync

  modeline  "1280x960@75" 129.86 1280 1368 1504 1728 960 961 964 1002 -hsync +vsync

  modeline  "1400x1050@60" 122.61 1400 1488 1640 1880 1050 1051 1054 1087 -hsync +vsync

  modeline  "1400x1050@75" 155.85 1400 1496 1648 1896 1050 1051 1054 1096 -hsync +vsync

  modeline  "1600x1200@65" 175.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync

  modeline  "1600x1200@60" 162.0 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync

  modeline  "1792x1344@60" 204.8 1792 1920 2120 2448 1344 1345 1348 1394 -hsync +vsync

                Gamma   1.0

EndSection

Section "ServerFlags"

#              Option                     "Xinerama"             "true"

Option "BlankTime" "0"

Option "StandbyTime" "0"

Option "SuspendTime" "0"

Option "OffTime" "0"

EndSection

Section "device" #

                Identifier  "device2"

                Boardname             "NVIDIA GeForce 6 Series"

                Busid                      "PCI:1:0:0"

                Driver                     "nvidia"

                Screen    1

                Vendorname           "NVIDIA"

EndSection

Section "screen" #

                Identifier  "screen2"

                Device                    "device2"

                Defaultdepth           24

                Monitor                   "monitor2"

                SubSection "Display"

                               Depth      24

                               Modes                    "1024x768@75"     "832x624@75"       "1024x768@60"     "800x600@60"       "1280x960@60"     "800x600@75"                "800x600@72"       "800x600@56"       "640x480@75"       "640x480@72"       "640x480@60"

                EndSubSection

EndSection

Section "monitor" #

                Identifier  "monitor2"

                Vendorname           "NEC"

                Modelname             "NEC MultiSync LCD1550M"

                Horizsync               31.0-60.0

                Vertrefresh             55.0-75.0

  modeline  "640x480@60" 25.2 640 656 752 800 480 490 492 525 -vsync -hsync

  modeline  "640x480@72" 31.5 640 664 704 832 480 489 491 520 -vsync -hsync

  modeline  "640x480@75" 31.5 640 656 720 840 480 481 484 500 -vsync -hsync

  modeline  "800x600@56" 36.0 800 824 896 1024 600 601 603 625 +hsync +vsync

  modeline  "800x600@72" 50.0 800 856 976 1040 600 637 643 666 +hsync +vsync

  modeline  "800x600@75" 49.5 800 816 896 1056 600 601 604 625 +hsync +vsync

  modeline  "800x600@60" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync

  modeline  "832x624@75" 57.284 832 864 928 1152 624 625 628 667 -vsync -hsync

  modeline  "1024x768@75" 78.8 1024 1040 1136 1312 768 769 772 800 +hsync +vsync

  modeline  "1024x768@70" 75.0 1024 1048 1184 1328 768 771 777 806 -vsync -hsync

  modeline  "1024x768@60" 65.0 1024 1048 1184 1344 768 771 777 806 -vsync -hsync

  modeline  "1280x960@60" 102.1 1280 1360 1496 1712 960 961 964 994 -hsync +vsync

                Gamma   1.0

EndSection

 

ПРИЛОЖЕНИЕ 3

Листинг патча, который нужно наложить на исходники GDM 2.20.8, чтобы работал автоматиче­ский вход для каждого пользователя:

diff -Nau gdm-2.20.8/daemon/display.h gdm-2.20.8_new/daemon/display.h

--- gdm-2.20.8/daemon/display.h   2008-09-03 19:36:08.000000000 +0100

+++ gdm-2.20.8_new/daemon/display.h   2009-02-01 00:34:32.000000000 +0000

@@ -92,6 +92,7 @@

   int priority;

 

   gboolean timed_login_ok;

+   gboolean gdm_first_login;

 

   gboolean try_different_greeter;

   char *theme_name;

diff -Nau gdm-2.20.8/daemon/gdm.c gdm-2.20.8_new/daemon/gdm.c

--- gdm-2.20.8/daemon/gdm.c   2008-09-03 19:36:08.000000000 +0100

+++ gdm-2.20.8_new/daemon/gdm.c   2009-02-01 00:45:31.000000000 +0000

@@ -134,7 +134,7 @@

unsigned char *gdm_global_bcookie = NULL;

char *gdm_system_locale = NULL;

 

-gboolean gdm_first_login = TRUE;

+//gboolean gdm_first_login = TRUE;

 

static GdmLogoutAction safe_logout_action = GDM_LOGOUT_ACTION_NONE;

 

@@ -255,11 +255,12 @@

         /* well sleep at least 'delay' seconds

          * before starting */

         d->sleep_before_run = delay;

+         d->gdm_first_login = TRUE;

 

         /* only the first static display has

          * timed login going on */

-         if (gdm_first_login)

-            d->timed_login_ok = TRUE;

+         //if (d->gdm_first_login)

+         d->timed_login_ok = TRUE;

 

         svr = gdm_server_resolve (d);

 

@@ -271,7 +272,7 @@

            if (svr != NULL &&

                svr->handled &&

                ! svr->chooser)

-               gdm_first_login = FALSE;

+               d->gdm_first_login = FALSE;

         } else {

            /* only the first static display where

               we actually log in gets

@@ -279,7 +280,7 @@

            if (svr != NULL &&

                svr->handled &&

                ! svr->chooser)

-               gdm_first_login = FALSE;

+               d->gdm_first_login = FALSE;

            break;

         }

      }

diff -Nau gdm-2.20.8/daemon/gdm-daemon-config.c gdm-2.20.8_new/daemon/gdm-daemon-config.c

--- gdm-2.20.8/daemon/gdm-daemon-config.c   2008-09-03 19:36:08.000000000 +0100

+++ gdm-2.20.8_new/daemon/gdm-daemon-config.c   2009-01-31 23:50:21.000000000 +0000

@@ -553,7 +553,9 @@

 

   if (strcmp (group, "greeter") == 0 ||

       strcmp (group, "gui") == 0 ||

-       is_key (keystring, GDM_KEY_PAM_STACK)) {

+       is_key (keystring, GDM_KEY_PAM_STACK) ||

+       is_key (keystring, GDM_KEY_AUTOMATIC_LOGIN_ENABLE) ||

+       is_key (keystring, GDM_KEY_AUTOMATIC_LOGIN)) {

      ret = gdm_daemon_config_key_to_string (file, keystring, retval);

   }

 

diff -Nau gdm-2.20.8/daemon/slave.c gdm-2.20.8_new/daemon/slave.c

--- gdm-2.20.8/daemon/slave.c   2008-09-03 19:36:08.000000000 +0100

+++ gdm-2.20.8_new/daemon/slave.c   2009-02-01 00:37:02.000000000 +0000

@@ -192,7 +192,7 @@

static int slave_waitpid_w             = -1;

static GSList *slave_waitpids          = NULL;

 

-extern gboolean gdm_first_login;

+//extern gboolean gdm_first_login;

 

/* The slavepipe (like fifo) connection, this is the write end */

extern int slave_fifo_pipe_fd;

@@ -1465,10 +1465,10 @@

   if (d->handled) {

      /* Now the display name and hostname is final */

 

-      const char *automaticlogin = gdm_daemon_config_get_value_string (GDM_KEY_AUTOMATIC_LOGIN);

+      const char *automaticlogin = gdm_daemon_config_get_value_string_per_display (GDM_KEY_AUTOMATIC_LOGIN, (char *)d->name);

      const char *timedlogin     = gdm_daemon_config_get_value_string (GDM_KEY_TIMED_LOGIN);

 

-      if (gdm_daemon_config_get_value_bool (GDM_KEY_AUTOMATIC_LOGIN_ENABLE) &&

+      if (gdm_daemon_config_get_value_bool_per_display (GDM_KEY_AUTOMATIC_LOGIN_ENABLE, (char *)d->name) &&

          ! ve_string_empty (automaticlogin)) {

         g_free (ParsedAutomaticLogin);

         ParsedAutomaticLogin = gdm_slave_parse_enriched_login (display,

@@ -1605,10 +1605,10 @@

      gdm_slave_chooser ();  /* Run the chooser */

      return;

   } else if (d->type == TYPE_STATIC &&

-         gdm_first_login &&

+         d->gdm_first_login &&

         ! ve_string_empty (ParsedAutomaticLogin) &&

         strcmp (ParsedAutomaticLogin, gdm_root_user ()) != 0) {

-      gdm_first_login = FALSE;

+      d->gdm_first_login = FALSE;

 

      d->logged_in = TRUE;

      gdm_slave_send_num (GDM_SOP_LOGGED_IN, TRUE);

@@ -1635,8 +1635,8 @@

      return;

   }

 

-   if (gdm_first_login)

-      gdm_first_login = FALSE;

+   if (d->gdm_first_login)

+      d->gdm_first_login = FALSE;

 

   do {

      check_notifies_now ();

diff -Nau gdm-2.20.8/myconf.sh gdm-2.20.8_new/myconf.sh

--- gdm-2.20.8/myconf.sh   1970-01-01 01:00:00.000000000 +0100

+++ gdm-2.20.8_new/myconf.sh   2009-01-31 23:35:26.000000000 +0000

@@ -0,0 +1,4 @@

+#/bin/bash

+

+./configure --with-defaults-conf=/etc/gdm/gdm.conf --with-custom-conf=/etc/gdm/gdm.conf-custom

+

 

ПРИЛОЖЕНИЕ 4

Решение, которое позволяет разрулить USB-флэшки между пользователями. Решение взято отсюда: http://forum.lafox.net/index.php?showtopic=19511

За это отдельное спасибо Артуру с форума forum.lafox.net

Решение базируется на Ivman + Pmount.

В /usr/etc/ivman/IvmConfigActions.xml добавить правила для /dev/sd[c-i][1-4], где sda и sdb — жесткие диски SATA. Поскольку USB-устройств великое множество (например мо­бильники, где два устройства на шнур). Поэтому лучше написать правила с двухкратным запасом.

<ivm:Match name="hal.block.device" value="/dev/sdc">

<ivm:Option name="mount" value="false" />

<ivm:Match name="hal.block.is_volume" value="true">

<ivm:Option name="exec" value="/usr/bin/sudo /usr/sbin/f2p.sh \

$hal.block.device$ " />

<ivm:Option name="execun" value="/usr/bin/sudo /usr/sbin/uf.sh \

$hal.block.device$ " />

</ivm:Match>

</ivm:Match>

и так для каждого /dev/sd[c-i] и /dev/sd[c-i][1-4]

При подключении флэшки запускается скрипт f2p.sh:

#!/bin/bash

 

export USB_PORT=$(ls -l /sys/block/$(echo $@ | sed s@/dev/@@ | sed \

s/[1234567890]$//)/device | awk -F' -> ' '{ print $2}' | awk -F'/' '{ print \

$8}' | awk -F'.' '{ print $2}')

if [ "$USB_PORT" == "1" ]; then

sudo -u venus0 sh -c "pmount -s -u 077 -c koi8-r $@"

echo "file://$(mount | grep $@ | awk '{ print $3 }') flash" \

>> /home/venus0/.gtk-bookmarks

elif [ "$USB_PORT" == "2" ]; then

sudo -u venus1 sh -c "pmount -s -u 077 -c koi8-r $@"

echo "file://$(mount | grep $@ | awk '{ print $3 }') flash" \

>> /home/venus1/.gtk-bookmarks

elif [ "$USB_PORT" == "3" ]; then

sudo -u venus2 sh -c "pmount -s -u 077 -c koi8-r $@"

echo "file://$(mount | grep $@ | awk '{ print $3 }') flash"

>> /home/venus2/.gtk-bookmarks

elif [ "$USB_PORT" == "4" ]; then

sudo -u venus3 sh -c "pmount -s -u 077 -c koi8-r $@"

echo "file://$(mount | grep $@ | awk '{ print $3 }') flash" \

>> /home/venus3/.gtk-bookmarks

fi

При изъятииuf.sh:

#!/bin/bash

export DEV=$@

export MNT_PNT=$(mount | grep $@ | awk '{ print $3 }')

 

umount -l $@

sed -i "s@file://$MNT_PNT flash@@g" /home/venus0/.gtk-bookmarks

sed -i "s@file://$MNT_PNT flash@@g" /home/venus1/.gtk-bookmarks

sed -i "s@file://$MNT_PNT flash@@g" /home/venus2/.gtk-bookmarks

sed -i "s@file://$MNT_PNT flash@@g" /home/venus3/.gtk-bookmarks

Многие выдёргивают флэшки без отключенния, поэтому флэшки монтируются в синхронном ре­жиме - медленно для больших файлов, но зато данные сохраняются. При подключении создаются закладки, которые доступны и в файловом менеджере, и браузере и других программах, работаю­щих с .gtk-bookmarks. В Опере и Офисе отключить родные диалоги —  теперь они используют ме­нюшку в стиле pcmanfm и также работают с GTK диалогами.

Библиотека
Компьютер


  Проектирование и строительство лесосушильных камер. Автоматика для сушильных камер Безпроводные температурные сенсоры RFID
Copyright © MSE Design 2006 mav_stuff@bk.ru