Глава 11. X Window System и виртуальные консоли

11.1. Что такое X Window System?
11.2. Какие реализации X существуют для FreeBSD?
11.3. Всё же почему разделились два проекта X?
11.4. Почему для установки по умолчанию во FreeBSD были выбраны порты Xorg?
11.5. Я хочу запустить X, как это сделать?
11.6. Я попытался запустить X, но получил сообщение KDENABIO failed (Operation not permitted) после ввода команды startx. Что мне теперь делать?
11.7. Почему моя мышь не работает с X?
11.8. У моей мыши есть колёсико. Могу ли я его использовать при работе в X?
11.9. Как использовать удалённые X-дисплеи?
11.10. Что такое виртуальные консоли и как изменить их количество?
11.11. Как осуществляется доступ к виртуальным консолям из X?
11.12. Как запустить XDM во время загрузки?
11.13. При запуске xconsole выдаётся сообщение Couldn't open console.
11.14. Раньше я запускал XFree86™, работая как обычный пользователь, а теперь при запуске выдается сообщение о том, что я должен быть пользователем root!
11.15. Моя мышь PS/2 в X работает неправильно.
11.16. Почему моя мышь PS/2 от MouseSystems не работает?
11.17. Как поменять местами кнопки мыши?
11.18. Как установить экранную заставку и где такие заставки можно найти?
11.19. Можно ли в X использовать клавиши Windows, которые есть на клавиатуре?
11.20. Как заставить работать аппаратное ускорение 3D-графики для OpenGL®?

11.1.

Что такое X Window System?

X Window System (обычно X11) является самой широкодоступной оконной системой, которая может работать на UNIX® и UNIX®-подобных системах, в том числе и во FreeBSD. Разработкой стандартов на используемый X-протокол занимается организация The X.Org Foundation, с текущей эталонной реализацией version 11 release 7.7, поэтому вы будете часто встречать краткую ссылку на них в виде сокращения X11.

Для разных архитектур и операционных систем существует множество реализаций этой системы. Реализацию кода для серверной части называют X-сервером.

11.2.

Какие реализации X существуют для FreeBSD?

Исторически складывалось так, что во FreeBSD в качестве используемой по умолчанию реализации X выступал пакет XFree86™, который поддерживает The XFree86 Project, Inc. Данное программное обеспечение устанавливалось по умолчанию в версиях FreeBSD до 4.10 и 5.2. Хотя Xorg поддерживала в то время свою реализацию, в целом она позиционировалась как ссылочная платформа, от чего долгие годы значительно страдала.

Однако в начале 2004 года несколько разработчиков XFree86 покинули проект из-за разногласий по поводу темпов внесения изменений в код, будущего направления развития и личных конфликтов. Теперь они передают свой код непосредственно в Xorg. Одновременно с этим Xorg обновила своё дерево исходных текстов до состояния, соответствующего последнему релизу XFree86™ перед изменением лицензионного соглашения (XFree86 version 4.3.99.903), включила туда множество изменений, ранее поддерживаемых отдельно, и выпустила этот набор как X11R6.7.0. Существует отдельный, но связанный с этим проект freedesktop.org (для краткости fd.o), работающий над перепроектированием оригинального кода XFree86™, в котором больше нагрузки должно лечь на графический адаптер (для улучшения производительности), и который должен стать более модульным (для улучшения поддержки и ускорения выпуска релизов, а также упрощения настройки). Xorg планирует включить изменения, разработанные freedesktop.org, в свои будущие релизы.

С июля 2004 в FreeBSD-CURRENT в качестве реализации, используемой по умолчанию, XFree86™ была заменена на Xorg. С тех пор в качестве реализации X11 по умолчанию используется Xorg.

Для получения более полной информации прочтите раздел о X11 Руководства FreeBSD.

11.3.

Всё же почему разделились два проекта X?

Ответ на этот вопрос находится вне круга проблем, описываемых в FAQ. Заметим, что в Internet в архивах различных списков рассылки хранится объёмная переписка. Для изучения истории этого вопроса, пожалуйста, воспользуйтесь вашей любимой поисковой системой, а не задавайте вопросы в списках рассылки FreeBSD. Может статься, что только непосредственные участники событий будут знать доподлинно все произошедшее.

11.4.

Почему для установки по умолчанию во FreeBSD были выбраны порты Xorg?

Разработчики Xorg заявляют, что их целями является более частый выпуск релизов и быстрое добавление новых функций. Если они смогут это осуществить, что их разработка будет весьма привлекательна. Кроме того, использование их программного обеспечение продолжает подпадать под условия стандартного для X лицензионного соглашения, тогда как XFree86™ пользуется несколько модифицированным её вариантом.

11.5.

Я хочу запустить X, как это сделать?

Если вы планируете установить X на уже работающую систему, то вам необходимо использовать мета-порт x11/xorg, который построит и установит все необходимые компоненты, либо установить Xorg из пакетов FreeBSD.

# pkg_add -r xorg

Кроме того, установить Xorg можно из sysinstall(8), выбрав Configure, затем Distributions, затем The X.Org Distribution.

После того, как Xorg был успешно установлен, следуйте указаниям в разделе Конфигурация X11 Руководства FreeBSD.

11.6.

Я попытался запустить X, но получил сообщение KDENABIO failed (Operation not permitted) после ввода команды startx. Что мне теперь делать?

Вероятнее всего, в вашей системе установлен повышенный уровень безопасности (securelevel). При повышенном уровне защиты систему X запустить невозможно, потому что X требуются права на операции записи в устройство io(4). Дополнительную информацию можно найти на страницах справочной системы по init(8).

Так что вопрос сводится к тому, как вам это обойти, и у вас здесь есть в основном два варианта: установить значение securelevel обратно в ноль (обычно это делается в /etc/rc.conf) или во время загрузки запускать xdm(1) (до того, как повышается значение securelevel).

Обратитесь к Вопрос: 11.12 для получения более полной информации о запуске xdm(1) во время загрузки.

11.7.

Почему моя мышь не работает с X?

Если вы используете syscons(4) (стандартный драйвер консоли), то можете настроить поддержку указателя мыши во всех виртуальных экранах. Во избежание конфликтов с X, драйвер syscons(4) поддерживает виртуальное устройство /dev/sysmouse. Все события, получаемые от реальной мыши, пишутся в устройство sysmouse(4) через moused(8). Если вы хотите использовать вашу мышь на одной или нескольких виртуальных консолях, продолжая использовать X, посмотрите Вопрос: 4.5.4 и настройте moused(8).

Затем отредактируйте /etc/X11/xorg.conf так, чтобы в нём были следующие строки:

Section "InputDevice"
   Option	  "Protocol" "SysMouse"
   Option	  "Device" "/dev/sysmouse"
.....

Начиная с версии Xorg 7.4 раздел InputDevice в файле xorg.conf игнорируется, и вместо него используется механизм автоматически определяемых устройств. Чтобы восстановить прежнее поведение, добавьте в раздел ServerLayout или ServerFlags такую строку:

Option "AutoAddDevices" "false"

Некоторые предпочитают использовать в X устройство /dev/mouse. Чтобы оно работало, файл устройства /dev/mouse должен являться ссылкой на /dev/sysmouse (посмотрите справку по sysmouse(4)). Это можно сделать, добавив следующую строку в /etc/devfs.conf (посмотрите справку по devfs.conf(5)):

link    sysmouse    mouse

Ссылка может быть создана путем перезапуска devfs(5) с использованием следующей команды (из под пользователя root):

# /etc/rc.d/devfs restart

11.8.

У моей мыши есть колёсико. Могу ли я его использовать при работе в X?

Да.

Вам нужно указать X, что используется 5-кнопочная мышь. Для этого просто добавьте строчки Buttons 5 и ZAxisMapping 4 5 в раздел «InputDevice» файла /etc/X11/xorg.conf. Например, в вашем файле /etc/X11/xorg.conf секция «InputDevice» может принять такой вид:

Пример 11.1. Секция «InputDevice» для мыши с колёсиком в файле конфигурации Xorg
Section "InputDevice"
   Identifier      "Mouse1"
   Driver	  "mouse"
   Option	  "Protocol" "auto"
   Option	  "Device" "/dev/sysmouse"
   Option	  "Buttons" "5"
   Option	  "ZAxisMapping" "4 5"
EndSection

Пример 11.2. Пример «.emacs» для простой прокрутки страницы при помощи мыши с колёсиком (опционально)
;; wheel mouse
(global-set-key [mouse-4] 'scroll-down)
(global-set-key [mouse-5] 'scroll-up)

11.9.

Как использовать удалённые X-дисплеи?

Из соображений обеспечения информационной безопасности открывать удалённые окна на машине по умолчанию запрещено.

Для включения этой возможности просто запустите X с аргументом -listen_tcp:

% startx -listen_tcp

11.10.

Что такое виртуальные консоли и как изменить их количество?

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

При запуске системы после вывода сообщений этапа загрузки на консоль выдаётся приглашение на вход в систему. Вы можете ввести своё имя и пароль и начать работать (или играть!) на первой виртуальной консоли.

В какой-то момент вы можете захотеть запустить ещё одну сеанс, скажем, чтобы заглянуть в документацию по программе, которую вы запустили или для для чтения электронной почты во время ожидания завершения передачи данных по FTP. Просто нажмите Alt+F2 (удерживая клавишу Alt, нажмите F2) и вы обнаружите приглашение, ждущее вас на второй «виртуальной консоли»! Когда захотите вернуться к первоначальному сеансу, нажмите Alt+F1.

После установки по умолчанию во FreeBSD задействованы восемь виртуальных консолей, а комбинации клавиш Alt+F1, Alt+F2, Alt+F3 и так далее служат для переключения между ними.

Чтобы увеличить количество консолей, отредактируйте файл /etc/ttys (посмотрите справку по ttys(5)), добавив туда записи для терминалов с именами от ttyv8 до ttyvc после слов «Virtual terminals»:

# Edit the existing entry for ttyv8 in /etc/ttys and change
# "off" to "on".
ttyv8   "/usr/libexec/getty Pc"	 cons25  on secure
ttyv9   "/usr/libexec/getty Pc"	 cons25  on secure
ttyva   "/usr/libexec/getty Pc"	 cons25  on secure
ttyvb   "/usr/libexec/getty Pc"	 cons25  on secure

Используйте из них столько, сколько посчитаете нужным. Чем больше виртуальных терминалов у вас имеется, тем больше ресурсов они используют; это может иметь значение, если у вас меньше чем 8 Мбайт ОЗУ. Вы можете сменить статус консолей с secure на insecure.

Важно:

Если вы хотите запустить X, вы должны оставить для него по крайней мере один неиспользуемый (или выключенный) виртуальный терминал. Таким образов, если вы хотите иметь приглашения login на всех двенадцати функциональных клавиши, то вам не повезло — вы можете это сделать только для одиннадцати из них, если хотите на этой же машине ещё запустить X-сервер.

Самым простым способом убрать консоль является просто её выключение. Например, если вы запустили на всех 12 консолях виртуальные терминалы, как указано выше, и ещё хотите запустить X, то должны будете изменить параметры двенадцатого виртуального терминала с:

ttyvb   "/usr/libexec/getty Pc"	 cons25  on  secure

на:

ttyvb   "/usr/libexec/getty Pc"	 cons25  off secure

Если на вашей клавиатуре только десять функциональных клавиш, то последние строки будут выглядеть так:

ttyv9   "/usr/libexec/getty Pc"	 cons25  off secure
ttyva   "/usr/libexec/getty Pc"	 cons25  off secure
ttyvb   "/usr/libexec/getty Pc"	 cons25  off secure

(Вы также можете просто их удалить.)

Самым простым (и надёжным) способом активировать виртуальные консоли является перезагрузка. Однако если вы вовсе не хотите этого делать, просто остановите X Window System и выполните (как пользователь root):

# kill -HUP 1

При этом требуется, чтобы вы полностью закрыли X Window, если она была запущена, до запуска этой команды. Если вы это не сделаете, ваша система может повиснуть или заблокироваться после выполнения команды kill.

11.11.

Как осуществляется доступ к виртуальным консолям из X?

Используйте комбинацию клавиш Ctrl+Alt+Fn для переключения обратно в виртуальную консоль. Нажатие Ctrl+Alt+F1 вернёт вас на первую виртуальную консоль.

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

Чтобы вернуться в сеанс работы X, вы должны переключиться в виртуальную консоль, на которой запущена X Window. Если вы запустили X из командной строки (например, при помощи команды startx), то сеанс работы X будет привязан к следующей неиспользуемой виртуальной консоли, а не к той текстовой консоли, с которой он был запущен. Если у вас имеется восемь активных виртуальных терминалов, то X будет работать на девятом, и вам нужно будет воспользоваться комбинацией Alt+F9 для возврата в X.

11.12.

Как запустить XDM во время загрузки?

Есть две философские школы, проповедующие различные методы запуска xdm(1). Последователи одного течения запускают xdm из /etc/ttys (посмотрите ttys(5)), используя приводимый пример, тогда как другие вставляют запуск xdm в скрипт rc.local (посмотрите справку по rc(8)) или X, помещая последний в каталог /usr/local/etc/rc.d. Оба метода равноправны, и один из них может работать в ситуациях, с которыми не справляется другой и наоборот. В обоих случаях результат один и тот же: X выводит графическое приглашение для входа в систему.

Плюсом метода с использованием ttys(5) является документирование того, на каком vty будет запущен X и то, что ответственность за перезапуск X-сервера при завершении сеанса работы лежит на процессе init(8). Метод с использованием rc(8) позволяет просто прекратить работу xdm командой kill xdm, если при запуске X возникли какие-нибудь проблемы.

Из rc(8) xdm должен быть запущен без аргументов, (то есть как даемон). xdm должен быть запущен после запуска getty(8), иначе они будут конфликтовать, блокируя консоль. Лучше всего выдержать паузу секунд на 10 и потом запустить xdm.

Если xdm запускается из /etc/ttys, то есть вероятность конфликта между xdm и getty(8). Одним из способов избежать этого является добавление номера vt в файл /usr/local/lib/X11/xdm/Xservers:

:0 local /usr/local/bin/X vt4

В вышеприведённом случае X-серверу указывается работать на /dev/ttyv3. Заметьте, что номера отличаются на единицу. Дело в том, что X-сервер считает vty от единицы, когда как отсчёт vty в ядре FreeBSD ведётся с нуля.

11.13.

При запуске xconsole выдаётся сообщение Couldn't open console.

Если вы запускаете X с использованием сценария startx, права на устройство /dev/console не изменяются, поэтому такие программы, как xterm -C и xconsole, не будут работать.

Это зависит от прав доступа, установленных для консоли по умолчанию. В многопользовательской системе вовсе не нужно, чтобы любой пользователь мог выводить информацию на системную консоль. Для пользователей, вошедших в систему через VTY, для решения этой проблемы существует файл fbtab(5).

В общем, раскомментируйте строчку в файле /etc/fbtab (посмотрите справку по fbtab(5)):

/dev/ttyv0 0600 /dev/console

Этого будет достаточно для того, чтобы всякий, кто вошёл в систему с терминала /dev/ttyv0, имел доступ к консоли.

11.14.

Раньше я запускал XFree86™, работая как обычный пользователь, а теперь при запуске выдается сообщение о том, что я должен быть пользователем root!

Все X-серверы должны запускаться пользователем root, чтобы иметь прямой доступ к вашему видеооборудованию. Более старые версии XFree86™ (<= 3.3.6) устанавливали все поставляемые серверы так, что они автоматически запускались пользователем root (с установленным битом смены владельца запускаемого процесса). Несомненно, это рискованно, потому что X-серверы являются большими, сложными программами. Более новые версии XFree86™ не устанавливают на серверах бит смены владельца на пользователя root именно по этой причине.

Очевидно, что запускать X-сервер, работая как пользователь root, неправильно и небезопасно. Есть два способа использовать X, работая как обычный пользователь. Первый способ заключается в использовании xdm или другого менеджера дисплеев (к примеру, kdm); второй способ - в использовании программы Xwrapper.

xdm представляет собой даемон, который обрабатывает входы в систему в графическом режиме. Обычно он запускается во время загрузки и отвечает за аутентификацию пользователей и запуск их сеансов; практически это графический аналог программ getty(8) и login(1). Более подробная информация о xdm находится в документации по XFree86 и в соответствующем разделе FAQ.

Xwrapper является оболочкой для X-сервера; это маленькая утилита, позволяющая кому-либо запускать X-сервер, и достаточно безопасная в использовании. Она выполняет некоторую проверку передаваемых ей в командной строке аргументов, и если всё в порядке, запускает соответствующий X-сервер. Если по каким-либо причинам вы не хотите запускать менеджер дисплеев, то эта утилита вам подойдет. Если у вас установлена полная Коллекция Портов, вы можете найти этот порт в каталоге x11/wrapper.

11.15.

Моя мышь PS/2 в X работает неправильно.

Вполне может быть, что ваша мышь и её драйвер рассинхронизировались.

В редких случаях драйвер может ошибочно обнаруживать проблемы с синхронизацией, и вы будете видеть такие сообщения ядра:

psmintr: out of sync (xxxx != yyyy)

и заметите, что мышь теперь работает неправильно.

Если это случится, отмените проверку согласования, установив значение флага для драйвера мыши PS/2 в 0x100. Войдите в конфигуратор UserConfig, задав опцию -c в приглашении загрузчика:

boot: -c

Затем в командной строке UserConfig наберите:

UserConfig> flags psm0 0x100
UserConfig> quit

11.16.

Почему моя мышь PS/2 от MouseSystems не работает?

Было несколько сообщений, что некоторые модели мышей PS/2 от MouseSystems работают только в режиме «высокого разрешения». В других режимах курсор мыши постоянно прыгает в верхний левый угол экрана.

Укажите флаг 0x04 драйверу мыши PS/2 для перевода её в режим высокого разрешения. Войдите в UserConfig, задав опцию -c в приглашении загрузчика:

boot: -c

Затем в командной строке UserConfig наберите:

UserConfig> flags psm0 0x04
UserConfig> quit

В предыдущем разделе описана возможная причина проблем с мышью.

11.17.

Как поменять местами кнопки мыши?

Поместите команду xmodmap -e "pointer = 3 2 1" в один из ваших скриптов .xinitrc или .xsession.

11.18.

Как установить экранную заставку и где такие заставки можно найти?

Подробный ответ находится в разделе Загрузочные экранные заставки Руководства FreeBSD.

11.19.

Можно ли в X использовать клавиши Windows, которые есть на клавиатуре?

Да. Всё, что вам нужно сделать, это с помощью xmodmap(1) задать функции, которые вы хотите к этим клавишам привязать.

Положим, что все клавиатуры «Windows» стандартны и эти три клавиши имеют следующие клавиатурные коды:

  • 115 — клавиша Windows между клавишами Ctrl и Alt с левой стороны

  • 116 — клавиша Windows справа от клавиши AltGr

  • 117 — клавиша Menu, слева от клавиши Ctrl, находящейся справа

Чтобы заставить левую клавишу Windows набирать запятую, попробуйте выполнить такую команду:

# xmodmap -e "keycode 115 = comma"

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

Для того, чтобы переопределения клавиш Windows выполнялось автоматически каждый раз при запуске X, можно поместить вызов команд xmodmap в ваш ~/.xinitrc либо, что предпочтительней, создать файл ~/.xmodmaprc и включить в него параметры для xmodmap, по одному на строку, и добавить в ~/.xinitrc такую строку:

xmodmap $HOME/.xmodmaprc

Например, вы можете переопределить эти 3 клавиши так, чтобы они выполняли функции клавиш F13, F14 и F15 соответственно. Это позволит легко привязать их к полезным функциям в приложениях или вашем менеджере окон, как будет показано далее.

Чтобы сделать это, поместите в файл ~/.xmodmaprc вот такие строки:

keycode 115 = F13
keycode 116 = F14
keycode 117 = F15

Если, к примеру, вы используете порт x11-wm/fvwm2, то можете переопределить клавиши таким образом, что F13 сворачивает в иконку (или восстанавливает предыдущие размеры) окна, на которое указывает курсор, F14 перемещает окно с курсором на передний план или, если оно уже впереди, возвращает обратно, а F15 вызывает главное меню приложения Workplace, даже если курсор находится не на рабочем столе, что бывает полезно, если нет ни одного видимого кусочка рабочего стола (к тому же логотип на клавише соответствует этой функции).

Вот строки из ~/.fvwmrc, с помощью которых достигаются описанные выше функции:

Key F13	FTIWS	A	Iconify
Key F14	FTIWS	A	RaiseLower
Key F15	A	A	Menu Workplace Nop

11.20.

Как заставить работать аппаратное ускорение 3D-графики для OpenGL®?

Наличие 3D-ускорения зависит от версии используемого вами сервера Xorg и типа графического адаптера. Если у вас адаптер nVidia, то вы можете использовать бинарные файлы драйверов для FreeBSD, установив один из следующих портов:

  • Последние версии адаптеров nVidia поддерживаются портом x11/nvidia-driver.

  • Адаптеры nVidia, такие как GeForce2 MX/3/4, поддерживаются драйверами серии 96XX, доступными в порте x11/nvidia-driver-96xx.

  • Более старые адаптеры, такие как GeForce and RIVA TNT, поддерживаются драйверами серии 71XX, доступными в порте x11/nvidia-driver-71xx.

nVidia предоставляет подробную информацию о том, какие адаптеры поддерживаются тем или иным драйвером. Эта информация доступна непосредственно с их сайта: http://www.nvidia.com/object/IO_32667.html.

Для адаптеров Matrox G200/G400 вам следует попробовать порт x11-servers/mga_hal.

Для ATI Rage 128 и Radeon посмотрите страницы Справочника ati(4), r128(4) и radeon(4).

Для адаптеров 3dfx Voodoo 3, 4, 5, и Banshee есть порт x11-servers/driglide.

Этот, и другие документы, могут быть скачаны с http://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.

По вопросам, связанным с этой документацией, пишите в рассылку <doc@FreeBSD.org>.