X сервер linux что это
Сетевые соединения X11
Есть две технологии в ИТ, которые казалось должны были исчезнуть на рубеже прошлого века, но их живучесть и удобство раз за разом отодвигает их уход со сцены. Речь идет об IPv4 и X11. Если первый из них практически во всех аспектах уступает IPv6, то преимущества Wayland, как технологии над X11 очевидны не всем. Wayland вовсе не универсален, как X Windows System, он намного более прост. Это дает ему ряд преимуществ по сравнению с иксами, но в этом же кроются его недостатки.
Если говорить о преимуществах, то это в первую очередь простота реализации и долгожданное избавление пользователей графической среды Linux от таких артефактов перерисовки, как разрывы изображения, a․ k․ a․ tearing. С этим особенно часто сталкиваются обладатели видеокарт NVidia. Хватает и недостатков и противники замены X-сервера напирают на гибкость использования сетевых возможностей в различных сценариях.
As mentioned, X is essentially a networking protocol with graphical displaying capabilities.
▍ Сетевая структура взаимодействий X-сервера
Наиболее распространенным IPC, т․ е․ способом взаимодействия между процессами, X-клиента и X-сервера, являются сокеты. Их роль в предоставлении API связи с использование TCP/IP, а также сокетов домена Unix. Помимо сокетов клиент и сервер для коммуникации могут также использовать иные каналы IPC, например MIT Shared Memory Extension.
Доменные сокеты Unix (от англ. Unix Domain Sockets, UDS) являются POSIX-механизмом IPC, с помощью которого различные процессы ОС могут взаимодействовать друг с другом. Такие сокеты эффективнее локальных TCP/IP соединений, так как не требуют дополнительных байтов в заголовке протокола. Подобно сокетам TCP/IP, доменные сокеты Unix поддерживают надёжную потоковую передачу данных с помощью SOCK_STREAM. Они также могут работать в режиме упорядоченной ( см․ SOCK_SEQPACKET) и неупорядоченной ( см․ SOCK_DGRAM) передачи датаграмм.
Рис. 1 Сетевое взаимодействие между клиентом и сервером X с помощью UDS.
UDS используют файловую систему ОС в качестве адресного пространства имён (например /tmp/my_xapp ), сами сокеты в ней всего лишь inode, а процессы обращаются к сокетам, так же, как к файлу. Однако обмен данными в активном соединении использует не файловую систему, а только буферы памяти ядра.
Рис. 2 Сетевое взаимодействие между клиентом и сервером X поверх TCP/IP.
Количество таких интерфейсов определено константой NUMTRANS в файле X11/Xtrans/Xtrans.c.
Таблица Xtransports[] определена в том же самом файле и содержит 10 элементов, таким образом NUMTRANS ≤ 10.
Проследив цепочку до системного вызова socket() находим такую последовательность транспортных процедур.
▍ Взгляд изнутри трафика между клиентом и сервером X
Запустим простейшую иксовую программу Xclock и проверим как все это работает на практике.
Рис. 3 Установка параметров соединения в сессии X11.
Рис. 4 Сетевой след соединения X11 в WireShark.
То же самое и во всех подробностях можно увидеть в tshark в текстовом формате. Так выглядит клиентский запрос X11 в сторону сервера.
Пакет с ответом со стороны X-сервера совсем не так лаконичен, в нем указаны все необходимые детали для форматирования графического вывода на экран.
▍ Удаленное подключение к X-серверу по ssh
Переходя от теории сетевых взаимодействий X Window System к практике, рассмотрим, как запустить графическое приложение на уделенном X-сервере при подключении по ssh.
/.Xauthority y. Если все нормально, то файл уже создан и проверка показывает на наличие MAGIC COOKIE.
Рис. 5 Собственно xclock, значит удаленные иксы настроены и работают.
Я стараюсь по мере возможности тестировать сеанс Wayland при каждом новом релизе KDE Plasma, несмотря на многочисленные улучшения с каждым разом, на версии kde-apps-21.04.3 работать можно лишь на Plasma-X11. В чем бы не состояли преимущества Wayland, до тех пор пока в терминале зависает команда man, хаотично прыгают элементы ниспадающего меню и блуждает внешний монитор, старый и добрый X Window System остается вне конкуренции. Надеюсь так не будет продолжаться долго.
Что придет на замену X Window System?
Одним из знаменательных Linux событий прошлого года стал выход 25-й Федоры с графическим окружением Gnome 3.22 на базе дисплейного сервера Wayland, который призван заменить X Window System. Но зачем вообще после стольких лет возникла такая необходимость?
В последнее время экипаж МКС пересел с Windows на Linux.
— Хьюстон, у нас проблемы. Нас сносит на Юпитер.
— Вы что, опять возились с xorg.conf?
— Да. Хьюстон, за три последних дня у нас почему-то выросли бороды.
Далее, речь о том, почему Linux необходима новая графическая среда, хотя бы в 2017 г, а отдельным постом я расскажу про Wayland и Mir.
Номенклатура X
Я уверен, что вы уже прочитали статью Хабрапост про графический стек Linux, а также страницу на Вики и теперь можете уверенно двигаться дальше. Ну, а если пока оставили в закладках, позвольте вкратце напомнить.
Графическая подсистема X.Org Server состоит из двух частей.
Еще немного тезауруса о технологиях, благодаря которым современное графическое окружение Linux держит свою марку.
Mesa — Реализация OpenGL, OpenCL и Vulkan API для Linux и Unix, включающая в себя как программные библиотеки, так и набор драйверов видеокарт. Mesa имеет и умеет много чего, но в основном это открытая реализация OpenGL API, для трансляции которого в исполнительные команды используются программные:
lvmpipe — может и быстрый,
и аппаратные бэкенды с помощью открытых драйверов intel, radeon и noveau.
Всемогущий X
Программирование на X — это как чтение французских философов, после этого начинаешь задаваться вопросом: что я на самом деле знаю?
Томас Турман.
Кому на сегодняшний день позарез нужны иксы? В Android телефонах, телевизорах, планшетах X Windows System не используется, Хромбуки тоже как-то без них обходятся. Значит речь идет только о Linux / Unix рабочих станциях, в основном по той причине, что тулкиты GTK+ и QT, долгое время не могли обходиться без X.
В этом году X11 исполняется 30 лет. Секрет живучести X Window System в следующих принципах, сформулированных в 1996 г.
Сочетание этих принципов позволило X11 быть невероятно гибким и масштабируемым решением для столь разных графических оболочек Unix в течении долгого времени. Особенное место занимает последний — обеспечить механизм, для того, чтобы X-клиент смог реализовать все свои затеи. Обратной стороной такой всеядности и живучести стало невероятное нагромождение устаревших стандартов, методов и технологий. Можно вспомнить сервер шрифтов вместе с XLFD или движок для отрисовки многоугольников и разноцветных полос.
Изначально X был государством в государстве и подменял собой множество функции ядра ОС:
X.Org и принуждение к миру
Некоторое время всех все устраивало, программисты ваяли стильные приложения, примерно такие.
Затем внезапно устройства стали более быстрыми, мощными и сложными: несколько GPU, мониторов, разношерстые устройства ввода. Рендеринг также стал более сложным, появился OpenGL. X Window system стала обрастать расширениями, однако ядро протокола по политическим мотивам осталось нетронутым. На все недостатки находились обходные пути, и пошло и поехало… BIOS видеокарты, порты I/O, подсистема питания. И всем этим хозяйством X управлял из рук вон плохо, превратившись в ОС внутри ОС, причем достаточно паршивую ОС.
Стало понятно, что иксы нужно менять, но в этот момент начались дрязги и пляски вокруг лицензии xfree86. После того, как страсти по лицензиям утихли, произошло размежевание иксовых разработчиков и основная их масса выбрала X.Org со свободной лицензией GPL. Работа снова закипела.
Какие-же функции остались за X сервером после всех этих трансформаций? В принципе не так уж много. По сути основная работа иксов состоит в том, чтобы посредничать между X-клиентом и WM — оконным менеджером. Клиентская программа рисует фрейм, X сервер передает данные WM, который рендерит кадр, определяет местоположение окна и передает обратно серверу, который показывает готовый результат. Основную работу сейчас делает именно WM, и напрашивается вопрос. А что случится, если мы уберем посредника? Ответ — Wayland.
Точно так-же при обновлении содержимого экрана иксы не при делах. Приложение рисует что-то, данные через DRI попадают в область off-screen buffer памяти видеокарты. Приложение затем оповещает сервер о том, что буфер изменился, а X-сервер передает это сообщение WM, и тот через DRI рисует новую картинку.
Помимо этого остаются архитектурные ограничения, которые невозможно обойти, не ломая совместимость с древними Motif приложениями. Да-да, не смейтесь, несколько лет назад я сам с такими работал и даже сопровождал. К таким ограничениям относится ужасный IPC, полный захват устройств ввода, в результате чего скринсейвер не запускается при открытом меню, кнопки управления звуком блокированы скринсейвером и pop-up сообщениями. Дерганое изображение, неравномерная отрисовка, артефакты обновления, это все никуда не денется, как бы ни старались иксовые программисты, а они стараются все меньше и все больше перестраиваются на Wayland. Ах, да и еще имманентное состояние гонки.
Состояние гонки
В силу своей асинхронности X11 предрасположен создавать состояние гонки между событиями X-клиента или между быстрым и мертвым тормознутым X-клиентом. Возьмем простейший случай: пользователь щелчком левой кнопки мыши вызывает меню приложения, затем отпускает кнопку и приложение при наведения курсора выполняет определенное действие. Покажем последовательность событий на диаграмме Фейнмана.
На диаграмме видно, что произойдет, если пользователь отпустит левую клавишу раньше события 4. Если натренированный на действие пользователь заранее переместился на место предполагаемого пункта меню до того момента, пока там возникло новое окно, то тогда произойдет состояние гонки mouse ahead. Событие ButtonRelease придется на еще не занятую новым окном область экрана. Это вполне вероятно на удаленных X-сессиях по медленной сети.
Промежуточные итоги
Тридцать лет тому назад Unix сервера и рабочие станции благодаря X Window System получили унифицированную графическую среду, что было довольно прогрессивным и важным шагом для ИТ индустрии. Кто сейчас восхищается давнишними конкурентами — Sun NeWS, Amiga, или ругает их? Тогда иксы обошли их во за счет кросс-платформенности, возможности запускать приложения поверх TCP/IP, что было сравнимо с http доступом для веб приложений сегодня.
Вместе с тем создатели иксов явно где-то перемудрили. Принцип обеспечения механизмов, но не политики впоследствии сыграл злую шутку с экосистемой X и она обросла всем тем, чем обросла. За десятилетия ландшафт компьютеров, устройств и ПО радикально изменился, а X Window System проникла на лаптопы и даже смартфоны Нокиа. До сих пор разработчикам вполне удавалось держать проект на плаву, благодаря миграции значительной части функционала в ядро. Этот ресурс уже тоже исчерпан, и в силу вступил неумолимый закон убывающей отдачи. Наконец-то есть возможность начать с чистого листа, догнать и перегнать тренд, вместо того, чтобы плестись за ним. Я также связываю с этим давно обещанный прорыв Linux на десктопы. Закономерность или случайность, но Linux имеет полное доминирование на устройствах, где нет X сервера.
X Window System
Обратите внимание на то, что все заглавные буквы «X» в этой лекции — латинские.
На свете существует множество графических устройств, управление которыми на низком уровне (вывод изображений и ввод данных, например, о перемещении мыши) — задача совсем не для пользователя, тем более, что каждый вид устройства управляется по-своему. Заботы о вводе и выводе на низком уровне берёт на себя графическая подсистема Linux — X Window System, предоставляя пользовательским программам возможность работать в терминах оконного интерфейса.
X Window System появилась всё в той же UNIX, проект этот был настолько наукоёмок и настолько полно охватывал тогдашнюю область задач, связанную с графикой, что ему так и не возникло никаких серьёзных альтернатив.
X-сервер и X-клиенты. Протокол X11
X Window System использует традиционную оконную модель, в которой пространством ресурсов является экран. Экран — это прямоугольник, на котором отображаются команды графического вывода и организуется обратная связь с устройствами графического ввода. Пример обратной связи — указатель мыши. Сама мышь — довольно простое устройство ввода, способное передавать информацию о его перемещении и состоянии кнопок. Указатель же отображает мнение подсистемы об абсолютных координатах гипотетической «точки ввода».
Иллюстрация 3. Расположение точки ввода (фокус)
В примере указатель мыши показывает расположение точки ввода (на кнопке « WindowMaker »). Если сейчас Мефодий нажмёт на левую клавиу мыши, графическая подсистема зафиксирует это событие ввода и передаст его той задаче, которой принадлежит соответствующая кнопка. Именно задачи (а не сидящий за монитором пользователь) и являются субъектами для X Window System, между ними разделяются графические ресурсы. Каждой задаче принадлежит одно или несколько окон, представленных некоторой (как правило, прямоугольной) частью экрана. Внутри окна выполняются графические операции (вывод) и именно окнам передаётся поток данных от устройств ввода. Какое окно получит события ввода — определяется с помощью синтетического понятия фокус: вводимые данные передаются от графической подсиcтемы только тому окну, которое «получило фокус», по умолчанию это происходит, когда указатель мыши попадает в часть экрана, занимаемую этим окном.
В более сложном случае окна могут перекрываться, частично занимая один и тот же участок экрана. Если дополнительно постановить, что каждое из них лежит на своей глубине, то самое «верхнее» будет отображаться полностью, и ему будет доступен для вывода и получения фокуса весь заказанный прямоугольник. Следующее за верхним окно может быть им «загорожено», тогда отображается только часть этого окна, которую «видно из-под» верхнего. Заметим, что выводить это окно может в пределах всего заказанного прямоугольника, просто видно может быть не всё, и управление фокусом будет происходить на основании видимой части окна.
Программа, которая отвечает за работу с устройствами графического ввода и вывода и обеспечивает при этом логику оконной системы, называется X-сервером (X Server, то есть сервер системы «Икс»). В рамках X Window System, X-сервер — это ядро. Подобно ядру, он выполняет низкоуровневые операции и взаимодействует с аппаратурой, ничего самостоятельно не предпринимая. Подобно ядру, он предоставляет задачам унифицированный интерфейс к этим низкоуровневым функциям, а также занимается разделением доступа (окно и фокус) к графическим ресурсам. X-сервер не волнует, отчего эти задачи вообще появляются и чем живут. Он только принимает запросы на выполнение графических действий и передаёт по назначению вводимые данные. Жизнеобеспечение процессов и даже способ передачи X-запросов — дело исключительно операционной системы, по отношению к которой и сам X-сервер — задача.
Задачи, которые обращаются к X-серверу с запросами, называются X-клиентами. Обычно X-клиент сначала регистрирует окно (можно несколько), которое и будет ему полем ввода-вывода. Потом он сможет рисовать в этом окне и обрабатывать происходящие с окном события: активность устройств ввода и изменение свойств самого окна (размер, перемещение, превращение в иконку, закрытие и т. п.). X-клиент в Linux — это процесс, запускаемый обычно в фоне (не связанный по вводу с терминальной линией). В самом деле, зачем процессу читать с терминала, когда для ввода он может использовать X-сервер? Если с X-сервером связаться не удастся, на стандартном выводе ошибок может появиться какое-нибудь сообщение — его легко перенаправить в файл.
X-сервер Программа, принимающая и обрабатывающая X-запросы.
Клиент передаёт серверу X-запросы любым доступным ему способом. В разных версиях Linux, например, могут использоваться различные объекты файловой системы (чаще всего — т. н. сокеты, сходные по функциональности с двунаправленными каналами). Во многих случаях запросы передаются по сети, при этом неважно, какой именно транспортный уровень будет использован для соединения клиента с сервером (в современных системах это, чаще всего, сеть TCP/IP и протокол TCP). Главное, чтобы клиент посылал стандартные запросы, соответствующие определённому протоколу обмена данными. Кстати сказать, другое имя X Window System — X11 (или X11R6) — это просто номер версии X-протокола, стандартизующего X-запросы, при этом «R6» обозначает номер подверсии (revision) и вполне может увеличиться, если X11R6 устареет настолько, что потребует нового пересмотра (revision).
«Голый» X-сервер, к которому ни присоединён ни один X-клиент, можно запустить из командной строки, для этого достаточно выполнить команду « X » (одна заглавная латинская буква X). Именно так и поступил Мефодий, текстовая консоль сменилась чёрным экраном без всяких окон.
В некоторых вариантах X Window System экран по умолчанию раскрашивается в чёрно-белую крапинку.
Эта функция не будет работать, если в конфигурационном файле X-сервера включён параметр « DontVTSwitch ».
DISPLAY
$ export DISPLAY=:0
methody@susanin:
$ xcalc &
Пример 1. Запуск X-клиента из виртуальной консоли
Иллюстрация 4. Запуск X-клиента
Итак, X-сервер запускается на одном компьютере, а X-клиенты вполне могут работать на других (причём на нескольких!), посылая ему запросы. С точки зрения человека, сидящего за (обратите внимание!) X-сервером, каждый такой клиент представлен в виде окна. Требования к аппаратуре на машинах, запускающих X- клиенты, будут изрядно отличаться от требований к аппаратуре машины для X- сервера. Типичная машина с X-сервером — это рабочее место (workstation). Она должна быть оборудована качественными устройствами ввода-вывода — монитором, видеокартой, клавиатурой и мышью. Что же касается её вычислительных способностей, то их должно быть достаточно для выполнения X-запросов, и только. Такой компьютер не обязан работать под управлением Linux, на нём даже может вообще не быть операционной системы! В восьмидесятые годы выпускались подобные устройства, называемые «X-терминал» (X terminal).
X-клиент Программа, осуществляющая ввод и вывод графических данных при попмщи X-запросов, обрабатываемых X-сервером.
В отличие от машины с X-сервером, компьютер для запуска X-клиентов может совсем не иметь устройств графического ввода-вывода. Его задача в том, чтобы все X-программы и запустившие их пользователи не мешали друг другу работать. На такой машине нужна хорошо настронная операционная среда, с достаточным для запуска многих процессов быстродействием и объёмом оперативной памяти. Пара X11R6–Linux весьма неплохо работает на т. н. бездисковых комплексах. Рабочие станции в таких комплексах — самые настоящие X-терминалы, они не имеют жёстких дисков. Вся работа происходит на центральном компьютере, с которого на рабочую станцию загружается по сети урезанный вариант системы, достаточный для запуска X-сервера, и сам X-сервер. В таких комплексах администрировать нужно одну только центральную машину, они надёжнее компьютерных залов и, что немаловажно, стоят дешевле, причём в качестве X-терминалов можно использовать и довольно маломощные, пожилые компьютеры.
Виртуальный сервер
Виртуальный X-сервер может вообще никаких действий не выполнять, а только передавать X-запросы куда-нибудь дальше, например, «настоящему» X-серверу. Так поступает демон Secure Shell, sshd (программа терминального доступа, о которой шла речь в лекции Сетевые и серверные возможности), переправляя X-запросы X-серверу в зашифрованном виде. Этим свойством sshd можно воспользоваться, если сообщение по X-протоколу между двумя компьютерами невозможно (запрещено межсетевым экраном), или вы считаете такое соединение небезопасным.
ssh methody@fuji
methody@fuji’s password:
Last login: Sat Dec 25 13:26:40 2004 from localhost
methody@fuji:
$ xcalc
Error: Can’t open display:
methody@fuji:
$ export DISPLAY=sakura:0
methody@fuji:
$ xcalc
Error: Can’t open display: sakura:0
methody@fuji:
$ logout
Connection to fuji closed.
methody@sakura:
Демон SSH заводит виртуальный X-сервер на удалённой машине, причём номер_сервера обычно заводится таким, чтобы не пересекаться с X-серверами, которые могут быть запущены на этой машине (в примере номер_сервера равен 10). Виртуальный sshd-X сервер принимает все X-запросы с того же компьютера и передаёт их — в зашифрованном виде — на компьютер, где запущен ssh и невиртуальный X-сервер. Здесь все X-запросы вынимаются из SSH-«водопровода» и передаются местному серверу, как если бы они исходили от местного X-клиента (так оно и сеть: этот клиент — ssh ).
XFree86 и XOrg
Наиболее распространённая версия реализации X11R6 называется XFree86. Эта графическая подсистема изначально проектирвалась как реализация X11R5 для машин архитектуры i386 — самых распространённых на сегодня персональных компьютеров. Главная особенность этой архитектуры — бесчисленное многобразие устройств графического вывода (т. н. видеокарт) и непрестанное нарушение их разработчиками всех мыслимых стандартов. Поэтому главной задачей создателей XFree86 было устроить гибкую структуру компоновки и настройки X-сервера в соответсвии с подвернувшимся под руку устройством графического вывода, а заодно и ввода, потому что клавиатур, мышей и заменяющих их устройств на свете тоже немало. Сегодня XFree86 существует для многих архитектур и многих операционных систем.
В последние годы параллельно с XFree86 развивается основанная на тех же исходных текстах X Window System графическая подсистема XOrg. До недавнего времени по спектру поддерживаемого оборудования, архитектур и функциональности XOrg мало чем отличалась от XFree86, и сейчас они примерно эквивалентны с точки зрения пользователя. Однако направления развития этих двух проектов, состав их разработчиков и лицензионная политика несхожи. В ближайшем будущем вполне вероятно, что Xorg обгонит XFree86 и по возмпожностям, и по частоте использования.
Конфигурация X-сервера
Мы рассмотрим конфигурацию графической подсистемы на примере XFree86. Файл XF86Config-4 структурирован: состоит из нескольких обязательных разделов, которые могут следовать в любом порядке. В раздел объединяется часть профиля, связанная с одной из сторон деятельности X-сервера. Каждый раздел имеет такую структуру:
Files Пути к файлам с ресурсами, необходимыми X-серверу
ServerFlags Общие параметры X-сервера
Module Расширения, которые следует загрузить
InputDevice Описание устройств ввода
Device Описание устройства вывода (видеокарты)
Monitor Описание монитора
Modes Описание видеорежимов
Screen Описание экрана (связывает монитор и видеокарту)
ServerLayout Конфигурация сервера
Пример 4. Разделы XF86Config
Section «ServerLayout»
Identifier «layout1»
Screen «screen1»
InputDevice «Mouse1» «CorePointer»
InputDevice «Keyboard1» «CoreKeyboard»
EndSection
Пример 5. Раздел ServerLayout конфигурацонного файла XF86Config
Модули и расширения
Требование гибкости привело к тому, что в реализации XFree86 и XOrg графическая подсистема стала совсем уже похожа на операционную систему. Сам X-сервер играет роль ядра. Запускаясь, сервер подгружает драйверы — специальные компоненты, работающие с выбранной видеокартой, и модули — компоненты, расширяющие функциональные возможности сервера (в конфигурационном файле XF86Config необходимые модули перечисляются в разделе Modules ). Есть весьма нужные расширения, вроде glx (высокоуровневые функции трёхмерной графики) или freetype (поддержка шрифтов TrueType), а есть экзотические, которые иногда могут понадобиться, напрмер, RECORD, позволяющее записывать, а после — «проигрывать» все происходящие с сервером события.
Расширения называются так ещё и потому, что их возможности расширяют сам протокол X11R6. Вместо того, чтобы изменять протокол всякий раз, когда в голову придёт очередная ещё не реализованая в нём возможность, создатели X11 предусмотрели стандартный способ дополнения этого протокола. При этом X- клиент, желающий воспользоваться определённым расширением, всегда может спросить у X-сервера, поддерживается ли оно, и действовать по обстановке.