itmo_conspects

Extra 4. Графические подсистемы

Данный конспект был основан на записи лекций №13 (*тык*) и №14 (*тык*) с канала А. В. Маятина

Ключевым отличием операционной системы Linux от систем Windows и macOS для рядового пользователя - это различия во взаимодействии пользователя с системой. В Windows и macOS преимущественно используется графический интерфейс или GUI (Graphical User Interface), тогда как в Linux исторически и архитектурно используется интерфейс командной строки или CLI (Command Line Interface)

Рассмотрим, как устроен графический интерфейс в Windows от компании Microsoft. Предком современной системы Windows была система MS-DOS (от MicroSoft Disk Operating System), в нем в качестве интерфейса была командная строка

Командная строка в MS-DOS

Это не мешало отдельным программам иметь текстовый интерфейс (TUI, Text User Interface) или графический интерфейс (например, в играх):

Информация о компьютере в MS-DOS

Однако при запуске пользователя встречала командная строка. Позднее в 1985 году вышла Windows 1.0 - система, которая представляла графическую оболочку и базовые приложения для MS-DOS. После нее выходили Windows 2.0, Windows 3.0 и другие. Так выглядела Windows For Workgroups 3.11:

Windows 3.11

В те времена пользователи отдельно покупали MS-DOS и версию Windows. Вплоть до Windows 3.2 система Windows была надстройкой для MS-DOS, но в Windows 95 графический оболочка была полностью встроена в ядро (несмотря на это MS-DOS остался для поддержки обратной совместимости):

Windows 95

С тех пор графический интерфейс в Windows является главным интерфейсом для взаимодействия с системой


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

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

Так появился X Window System - базовый протокол, описывающий взаимодействие между программами, которые хотят отрисовать свое содержимое, и графической оболочкой. В X Window System:

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

Альтернативой X Window System является протокол Wayland - о нем рассказано позже

История X Window System

X Window System появилась внутри Массачусетского института технологий. Разработкой руководили Боб Шайфлер и Джим Геттис, а первый публичный релиз состоялся 19 июня 1984 года

После этого в 1986 году, появилась версия X10, которая быстро распространялась среди пользователей Unix. В сентябре 1987 года вышла 11-ая версия протокола - X11. Протокол был насколько хорошо спроектирован, что с тех пор его базовая версия практически не менялась, а новые возможности добавлялись через расширения

После выхода реализации протокола X11R2 (здесь R - это от “релиз”) в январе 1988 года управление проектом перешло от MIT к консорциуму X MIT (MIT X Consortium), который финансировали компании DEC и IBM. Эта и будущие реализации публиковались под лицензией MIT

Параллельно независимые разработчики адаптировали код X11R4 для работы с графическими картами с VGA на IBM-совместимых компьютерах, что привело к появлению в 1991 году реализации X386 1.1 - название отражало 32-битный процессор Intel 386 на архитектуре x86, который использовался в IBM-совместимых компьютерах. Позднее это ответвление было переименовано в XFree86

В 1993 году была образована некоммерческая корпорация X Consortium, Inc., которая продолжила выпуск новых версий X11R6 и X11R6.1

Далее произошел релиз XFree86 2.0 в 1994 году и последующие версии, такие как XFree86 3.x, активно развивались и к концу 1990-х годов стали фактическим стандартом X-сервера для Linux и многих других Unix-подобных систем

31 декабря 1996 года X Consortium, Inc. прекратил свое существование, и все права на X Window System перешли к The Open Group

В феврале 2004 года вышла реализация XFree86 4.4.0, где была изменена лицензия на менее свободную XFree86 License 1.1. В результате этого в апреле 2004 года был основан фонд X.Org Foundation. 6 апреля 2004 года вышла реализация X11R6.7.0, которая стала первым сервером от X.Org. Сейчас же последний релиз - это X11R7.7, который вышел в 2012 году

Большинство дистрибутивов выбрало сервер от X.Org, и с тех пор X.Org Foundation управляет развитием и поддержкой X Window System и выпускает ее эталонную реализацию под лицензией MIT

Сейчас X.Org Server имеет другую нумерацию, и последняя версия 21.1.14 вышла в 2024 году

Архитектура X Window System

Как уже было подмечено, в Linux графический интерфейс устроен по клиент-серверной архитектуре: приложения-клиенты отправляют данные о том, что отрисовывать на реализацию сервера, который поддерживает протокол X11 (например X.Org Server)

Для упрощения разработки приложения используют библиотеку Xlib, которая реализует протокол X11 на стороне клиента и позволяет приложениям общаться с X-сервером

Сам протокол состоит из 4 видов сообщений:

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


Для подключения клиенты используют переменную среды DISPLAY. Она состоит из строки в формате [хост]:номер_дисплея[.номер_экрана], в которой:

Архитектура

Чтобы запустить сервер X.Org из терминала, нужно:

Таким клиентом может быть программа xterm - эмулятор терминала для графического режима. xterm стал первым приложением, которое показало работоспособность протокола X Window System

Оконный менеджер

Сам протокол X11 и сервер, реализующий его, не описывают стратегии размещения окна. При запуске сервер X.Org рисует “корневое окно”, состоящее из одноцветного фона (обычно черного) и курсора в форме креста. Такой режим полезен для компьютеров, выполняющих функцию киоска

Расположением окон управляет оконный менеджер (Window Manager). Оконный менеджер позволяет запускать несколько приложений в графическом режиме и управлять положение и размерам их окон. Всего различают три типа оконных менеджеров:

  1. Мозаичные менеджеры представляют окна в виде непересекающихся областей, что делает их нетребовательными к ресурсам
  2. Стековые менеджеры позволяют размещать окна так, что одно из них пересекает другое, из-за чего часть рабочей области этого окна не видна
  3. Композитные менеджеры позволяют задать тени или частичную прозрачность окон

Типы оконных менеджеров

Такие оконные менеджеры могут добавлять дополнительные элементы интерфейса к окнам программ, например, рамку с заголовком программы и кнопками “Закрыть”, “Свернуть”, “Развернуть” или панель задач, где указаны запущенные программы

Оконный менеджер для startx можно указать в файле ~/.xinitrc

Расширенные графические среды

Эволюцией оконных менеджеров являются расширенные графические среды (Extended Graphical Environment, XGE)

Расширенная графическая среда (или среда рабочего стола, Desktop Environment) предоставляет свой оконный менеджер и набор базовых программ для работы внутри среды, таких как проигрыватель, файловый менеджер и так далее

В Linux распространены две графических среды:

  1. KDE Plasma (от K Desktop Environment)

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

    Среда KDE основана на фреймворке Qt, написанном на языке C++, который предоставляет широкий инструментарий для создания графических интерфейсов, например, классы элементов интерфейса, классы виджетов, классы для работы с сетевыми протоколами, классы для работы с интерфейсом OpenGL. Также Qt предоставляет множество инструментов для разработки и локализации приложений

    KDE также предоставляет оконный менеджер KWin и базовый набор приложений:

    • Amarok - проигрыватель
    • Dolphin - файловый менеджер
    • Kdeadmin - инструменты для администрирования
    • KDevelop - среда разработки приложений для KDE
    • Konqueror - веб-браузер (сейчас используется Falkon - браузер на основе Chromium)
    • Konsole - эмулятор терминала
    • Kontact - клиент электронной почты и менеджер контактов
    • KDE Connect - приложение для интеграции телефона с компьютером
    • и много других, включая игры и приложения для обучения

    Как можно заметить, приложения KDE имеют в названии букву K

    KDE

  2. GNOME (от GNU Network Object Model Environment)

    Когда KDE начала свое развитие, среда использовала версию фреймворка Qt, которая распространялась под проприетарной лицензией. Поэтому как альтернатива была создана среда GNOME, которая использует код только под открытой лицензией

    GNOME использует графическую библиотеку GTK (от GIMP ToolKit), созданную для программы GIMP и написанную на языке C, которая использует низкоуровневую библиотеку GLib

    GNOME использует менеджер окон Mutter (до этого использовался Metacity) и предоставляет свой набор программ:

    • Totem - проигрыватель
    • Nautilus - файловый менеджер
    • GnomeSystemTools - инструменты для администрирования
    • Web - веб-браузер
    • GNOME Terminal - эмулятор терминала
    • Evolution - менеджер контактов

    GNOME

Эти среды являются довольно ресурсозатратными, поэтому есть множество других менее распространенных и легких графических сред:

Для конечного пользователя среды предоставляют схожий набор программ, поэтому у части дистрибутивов нет конкретного выбор графических сред, например, Fedora поставляется в двух изданиях - с KDE и с GNOME


Графические среды тем временем представляют риск безопасности системы:

Поэтому разработчики из Red Hat во главе с Дэвидом Цойтеном предложили принципиально иной подход, который и был реализован в библиотеке PolicyKit

Основная идея PolicyKit - это не давать приложению права суперпользователя, а предоставлять только те полномочия, которые необходимы для выполнения конкретного действия. Процесс остается непривилегированным, но может попросить специальный системный демон polkitd выполнить за него высокорискованную операцию. В отличие от sudo, который повышает привилегии для всего процесса, PolicyKit авторизует одно действие в рамках уже запущенной программы

Также PolicyKit вводит понятие централизованной политики - администратор системы может с помощью простых правил (обычно в XML-файлах) определить, кто и при каких условиях может выполнять то или иное действие

Дисплейный менеджер

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

Дисплейный менеджер решает проблему ручного запуска графической сессии. Он сразу после загрузки:

При запуске:

  1. Система загружается, запускается systemd
  2. Включается графическая цель graphical.target, которая запускает сервис дисплейного менеджера
  3. Дисплейный менеджер поднимает X-сервер (или Wayland) на виртуальном терминале
  4. Появляется экран входа. После успешного входа дисплейный менеджер запускает сеанс пользователя:
    • Для X11 записывает DISPLAY=:0 и запускает оконный менеджер или среду
    • Для Wayland запускает композитор

Сейчас популярные дисплейные менеджеры это:

Wayland

Несмотря на успешность X11, со временем накопилось несколько фундаментальных проблем:

В 2008 году Кристиан Хогсберг (работавший над X-сервером в Red Hat) начал разработку Wayland - новое протокола графического сервера. Главная идея была в том, что сервер не рисует сам, а только управляет поверхностями, клиенты же рисуют напрямую через буферы, передавая их серверу для компоновки

Архитектура Wayland включает композитор Wayland. Композиторы Wayland - это одновременно оконные менеджеры и серверы

Ключевые особенности Wayland:

Сейчас большинство дистрибутивов (Fedora, Ubuntu, Debian и другие) используют Wayland в основных редакциях

Для обратной совместимости с существующими X-клиентами запускается XWayland - X-сервер, который рисует не на реальном экране, а в окно Wayland

Несмотря на это, Wayland имеет свои недостатки: