Поддубный Виталий
ООО «Манускрипт Солюшн»
г.Тула
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 Liesenborgs.
Также хочу поблагодарить Артёма Мороза за решение некоторых проблем и
дополнения. Кстати, Артём сам программист, и в фирме, где он работает, была
написана программа FriendlySeats для системы windows. Эта
программа позволяет легко и быстро настроить мультисит в windows 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
и без неё, стандартного мультисита с применением Xevdevserver'а и
без него.
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
Результат:
Далее проверяем, что система использует именно
проприетарные драйвера видеокарты:
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-сервера уже нельзя будет управлять разрешением экрана и
драйверами видеокарт через центры управления, а результатом выполнения команды glxinfo | 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]
прописываем (либо ищем эту строку и раскомментируем её):
Теперь есть два варианта конфигурирования.
Вариант1: сначала стартует основной X-сервер, а поверх него – два сеанса Xgl
и Xevdev-сервер.
Важное замечание: в приведённом ниже конфиге в
обоих секциях server-Xgl строка
command=…
и следующая строка – это одна команда, которая должна быть написана в одну
строку через пробел. Поскольку команда очень длинная, она не вместилась в
данном описании в одну строку целиком, пришлось разбить на две.
Также для видеокарт 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,
user2 — 5902, user3 — 5903 и т.д.; остальные
галочки выставляются по желанию.
Теперь, когда администратор будет обслуживать систему при помощи
программы "Просмотр удалённых рабочих столов" (команда vinagre
%U),
он в параметрах соединения должен указать порт для того пользователя, к
которому желает "подцепиться"; например, для user2
администратор должен указать порт не 5900, а уже 5902.
13) как разрулить звук на несколько пользователей:
вариант №1: если в системном блоке несколько звуковых карт
(например, две: одна встроенная и одна PCI), то звук можно настроить за счёт
самой системы, для этого под профилем каждого пользователя через меню настроек
звука достаточно выбрать свою звуковую карту; также это необходимо сделать в
апплете управления громкостью, который находится рядом с часами, иначе
получится ситуация, когда будет регулироваться общий звук;
до кучи нужно сделать настройки, чтобы звук от игр, которые запускаются
через Wine, также шёл на разные аудиокарты, для этого достаточно в переменных
окружения установить
AUDIODEV и MIXERDEV на устройства, которые вам захочется. Например один игрок
будет пользоваться картой №1, второй №2. Узнаем, какие аудиоустройства у нас
имеются:
ls /dev/dsp*
ls /dev/mixer*
Теперь, чтобы привязать каждому пользователю свою аудиокарту,
достаточно в ~/.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, на случай, если вы вдруг
решите сделать мультисит без применения программы Xevdevserver.
Например, без неё можно обойтись при построении стандартного мультисита либо
мультисита на 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'у
из города Хмельницкий.
ЗАКЛЮЧЕНИЕ:
В данной статье я попытался рассмотреть все возможные
варианты реализации технологии Multiseat в системе 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 диалогами.