Если рассмотреть схему работы системы X Window немного подробнее. То сначала может показаться, что эта схема слишком запутана и сложна. Однако это лишь первое впечатление от нестандартного и универсального подхода к реализации принципов работы с видеодисплейными терминалами (вывода изображения на экран монитора) в сложных и распределённых системах UNIX и Linux. На самом деле такая концепция очень полезна. В первую очередь для системного администрирования. Она позволяет администраторам организовать удобную для себя программно-аппаратную среду для управления и контроля всей системы. Ведь система X Window основана на архитектуре клиент-серверного взаимодействия. Что делает её (X Window) очень податливой для централизации и масштабирования. А это в свою очередь прямо влияет на удобство администрирования и мониторинга систем и сетей (даже самых сложных), в которых используется X Window.
Распределённая схема запуска X-приложений
Изображение обрабатывается для вывода на дисплей (не путать с монитором) X-сервером на его стороне. Для этого используются данные от зарегистрированных клиентов, которые (и это очень важно) могут работать на отдельных компьютерах в системе/сети. В качестве данных клиентов используются результаты работы графических и библиотек элементов интерфейса (GUI). А также графических сред, установленных на стороне клиента.
Информация об обновлении дисплея X Window передаётся по сети от клиентов. К дисплею может быть подключено несколько мониторов — для каждого клиента свой. Для этого клиенту необходимо знать:
- хост, на котором запущен X-сервер;
- номер активного дисплея (управляется менеджером дисплеев);
- номер монитора, привязанного к активному дисплею.
Таким образом системные администраторы могут настраивать свое рабочее место для выполнения служебных обязанностей. В частности для удобного мониторинга систем. Такую схему также можно использовать и для других задач. Например для организации видеостен или напротив для использования одного монитора несколькими машинами.
Переменная окружения DISPLAY
Каким образом X-приложение на стороне клиента «узнаёт», к какому X-серверу подключаться и какие дисплей и монитор использовать для вывода GUI? Для этого существует специальная переменная окружения DISPLAY. Она содержит информацию об IP-адресе X-сервера (или имя хоста) и номера дисплея и монитора (если мониторов несколько). Естественно, что в том случае, когда X-сервер и X-приложение работают на одном компьютере, то вся эта информация может быть опущена за исключением номера монитора. В качестве которого указывается значение «0», если он один.
Для задания параметров переменной DISPLAY на стороне клиента можно выполнить следующую команду:
$ DISPIAY=hostname.domain.com: 10.2; export DISPLAY
Теперь клиент будет «знать», что для отображения его GUI нужно использовать монитор номер 2, дисплея номер 10, который поддерживается X-сервером, доступном по адресу hostname.domain.com. Просмотреть текущее значение переменной DISPLAY можно например так:
$ export -p | grep DISPLAY declare -x DISPLAY=”:0”
Однако следует помнить, что переменные окружения должны быть корректно заданы для каждого процесса, использующего X-сервер. Например, X-приложения, запущенные из одной командной оболочки и корректно работающие в системе X Window, могут не работать, будучи запущенными из другой. Если для этих оболочек переменная DISPLAY имеет разные значения.
Даже когда X-приложения работают через указанный X-сервер, то они могут отправлять в вывод клиентской командной оболочки (из которой были запущены) некоторую информацию по стандартным каналам ввода/вывода STDOUT и STDERR – в этом нет ничего необычного.
Разумеется, в имени хоста можно опускать название домена. Если клиент и сервер оба в него включены. Хотя это может зависеть от схемы распознавания доменных имён в конкретной сети. Ну и конечно стоит помнить о том, что если клиент и сервер работают на одном компьютере, то очень рекомендуется полностью исключать из переменной DISPLAY имя компьютера (вместо хоста как в случае с удалённым X-сервером). В этом случае будет задействован сокет UNIX вместо стандартного сетевого сокета TCP. Это очень полезно — ведь данный тип сокета более быстрый и эффективный, чем сокет сети. К тому же это позволяет избежать проблем с настройкой брандмауэров. Поскольку сокеты типа UNIX по-умолчанию не подлежат прослушиванию и блокировкам.
Авторизация клиентов
Когда-то к X-серверу могли подключаться абсолютно все клиенты. Но в эпоху всё нарастающих опасностей в киберпространстве возникла необходимость защиты соединений и взаимодействия по сети. Не стала исключением и система X Window. С помощью команды xhost, выполняющей подключение к X-серверу любой пользователь мог впоследствии навредить системе. Позже от неё закономерно отказались.
Самой распространённой моделью авторизации клиентов для X-сервера является использование куков (cookie). Которые представляют собой случайно генерируемые последовательности символов. Куки известны диспетчеру дисплеев, отвечающему за авторизацию. Клиент, предоставивший диспетчеру дисплеев такие куки воспринимается сервером как аутентифицированный. Сами куки сохраняются в файл ~/.Xauthority на стороне клиента. Команда xauth позволяет просматривать куки сервера и добавлять их в файл ~/.Xauthority. Когда X-приложение не может получить доступ к X-серверу по причине неудачной авторизации, может быть получен вывод примерно такого содержания:
$ xsomeprogram -display server:0 Xlib: connection to "server:0.0" refused by server xsomeprogram: unable to open display 'server:0'
Как видно, для X-приложения был отклонён доступ к X-серверу из-за отсутствия нужных куков. Но не стоит унывать, ведь сами куки можно получить, выполнив на стороне сервера:
$ xauth list servername:0 MIT-MAGIC-COOKIE-1 ae42a68fhg35hdgc54dg5glj77 servername/unix:0 MIT-MAGIC-COOKIE-1 hg2jh54bdg53hdjkd653lcm20cm7 localhost:0 MIT-MAGIC-COOKIE-1 lkh3bh4xs87mjhgf6ba127bfg
В данном выводе получены куки для сокета UNIX, сетевого интерфейса Ethernet. А также для интерфейса с обратной связью localhost.
Далее, поскольку возможность копирования/вставки поддерживается командными оболочками. Чтобы добавить полученные куки в набор клиента нужно выполнить (на стороне клиента) следующую команду:
$ xauth add servername:0 MIT-MAGIC-COOKIE-1 ae42a68fhg35hdgc54dg5glj77
Теперь можно удостовериться, что куки были добавлены правильно. Т. е. попробовать запустить X-приложение на клиентской машине. В результате чего данные клиента должны быть отображены на сервере.
Как можно видеть, использование системы X Window позволяет легко выйти за рамки использования одного компьютера. Подобная концепция позволяет гибко масштабировать системы на основе UNIX\Linux не только в классическом представлении «командной строки», но и с использованием всех самых современных разработок и достижений для GUI.