Всех приветствую, читатели Хабра! Решил попробовать себя в роли знатока-писателя и освятить для вас такую тему, как “Компоненты среды рабочего стола”, чтобы больше людей, хотя бы в основе, понимали, что там происходит в системе такого, благодаря чему мы можем, не тыкаясь в консоли, с ней взаимодействовать.

Ответы на какие вопросы мы получим:

  1. Что такое окружение рабочего стола?

  2. Какие окружения рабочего стола бывают?

  3. Что из себя представляет каждый компонент окружения?

  4. Как и в какой последовательности происходит запуск компонентов графической сессии? (на примере kde-plasma)

Полезные материалы

Что такое окружение рабочего стола?

Окружение рабочего стола = среда рабочего стола = рабочий стол = Desktop Environment - это набор логически связанных приложений, который формирует полноценно работающий интерфейс для взаимодействия пользователя с системой. Репозитории некоторых дистрибутивов предлагают пакеты, с помощью которых, по мимо обязательного минимума, на систему ставятся приложения, которые хорошо интегрированы с определенным окружением. На примере Ubuntu, глобальный пакет окружения kde-plasma "kde-plasma-desktop", предоставляет "kde-baseapps". Такими приложениями могут быть: файловый менеджер, текстовый редактор, редактор изображений и другие утилиты, обеспечивающие полноценный пользовательский опыт. Одной из причин, почему дополнительные приложения предлагаются к установке, является стек технологий, на котором они разработаны - зачастую этот стек совпадает с тем, на котором написана графическая часть модулей конкретного DE, что способствует единому визуальному стилю. Вид некоторых виджетов GTK приложений сильно отличается от тех, которые предлагает QT, из-за этого желательно, чтобы системные приложения внутри определенного DE были написаны на том же графическом туллките, что и сами компоненты окружения.

Какие окружения рабочего стола бывают?

На сегодняшний день для GNU Linux существует множество окружений рабочего стола, таких как: GNOME, KDE Plasma, Xfce, Cinnamon, Deepin, Pantheon, LXDE, Mate, Unity. Каждое из них имеет свои особенности дизайна и функциональности. Допустим, для GNOME не предусмотрена возможность отключения композитинга - он встроен в библиотеку mutter, которую использует gnome-shell для менеджмента окон и композитинга. В то время, как в оконных менеджерах для Xfce (xfwm4) и KDE Plasma (Kwin), композитор можно отключить:

  1. Добавить строку "exec xfwm4 --compositor=off" в файл "~/.xinitrc".

  2. Выполнить команду "qdbus org.kde.KWin /Compositor suspend" в терминале.

Такая возможность позволит вам использовать сторонний софт, такой как picom для наложения графических эффектов на окна. Также, для примера, в GNOME отрисовка элементов интерфейса, на ряду с менеджментом окон и композитингом, выполняется внутри программы gnome-shell. Похожее архитектурное решение реализовано в отечественном AstraLinux - внутри этой ОС, согласно открытой информации про рабочий стол FLY “fly-wm — менеджер окон, рабочий стол, классическое меню "Пуск", панель задач, переключатель рабочих столов, блокировщик экрана. Не зависит от стороннего ПО;”.

В kde-plasma немного обратная ситуация: kwin является отдельным процессом, отвечающим только за композитинг и управление окнами. Если терминировать данный процесс, то рабочий стол все еще будет отображаться - будет потеряна возможность полноценно работать с окнами, т.к исчезнут декорации, с помощью которых окно можно перемещать, ресайзить, закрывать. Техническая пометка "слова про декорации являются правдивыми, если приложение не накладывает их за счет туллкита, на котором оно разработано (CSD - Client Side Decorations)". Также пропадет функционал наложения одного окна поверх другого - за все перечисленные манипуляции отвечает kwin. Если же убить процесс plasmashell, то пропадут все элементы интерфейса рабочего стола - все, что будет видеть пользователь - черный экран.

Отключен kwin
Отключен kwin
Отключен plasmashell
Отключен plasmashell

Что из себя представляет каждый компонент окружения?

  1. Дисплей менеджер - приложение, которое запускается на этапе бута системы и выводит графический интерфейс для:

    1. Авторизации пользователя - после ввода данных (логин/пароль), DM передает их аутентификационному сервису для проверки правильности. Примером такого сервиса может быть PAM.

    2. Выбора окружения рабочего стола - списки возможных для запуска окружений обычно хранятся в "/usr/share/xsessions" (Xorg), "/usr/share/wayland-sessions" (Wayland).


    Также, дисплейные менеджеры можно конфигурировать. Файлы конфигурации, в зависимости от dm, могут находиться в разны директориях - обычно пути следующие: "/etc/<dm>/" "/etc/X11/<dm>/" "/etc/<dm>.conf.d/", "/usr/share/<dm>/". В общем, функционал менеджеров может варьироваться, но его основной задачей является пустить выбранного пользователя в систему с тем графическим окружением и с таким функционалом, который требуется.

    Примеры DM:

    1. GDM - рекомендован для окружения (GNOME)

    2. LightDM

    3. LXDM - рекомендован для окружения (LXDE)

    4. SDDM - рекомендован для окружений (Plasma и LXQt), заменил KDM

    5. XDM

    6. FLY-DM - стандартный для Астровского окружения FLY

  2. Оконный менеджер - программный компонент, отвечающий за управление окнами, размещенными на экране. Функционал оконного менеджера:

    1. Декорирование окон (SSD - Server Side Decorations): оконный менеджер, для того, чтобы дать пользователю возможность управлять окном, должен наложить на него декорации, благодаря которым окно можно будет ресайзить, скрывать, закрывать и сворачивать в трей - декорации могут быть наложены на стороне туллкита, на котором приложение разработано (CSD), в таком случает, управление окном контролирует определенная библиотека - GTK/QT. Также, некоторые оконные менеджеры прорисовывают рамку по контуру окна - это тоже можно отнести к декорациям.

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

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

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

    Взаимодействие между клиентскими окнами и менеджером реализовано за счет ивентов - когда приложение запрашивает отображение окна (w), оконный менеджер получает сигнал MapRequest, после чего генерирует декоративную оправу, которая на системном уровне также является окном (f). Далее происходит reparenting и созданная менеджером оправа становится родителем для клиента. После чего, оконный менеджер вызывает метод XMapWindow для декораций (f) и клиента (w), Xorg обрабатывает запрос и выводит окна на экран. Таким образом, оконный менеджер должен контролировать события с двух сторон:

    1. Со стороны клиента:

    • (Клиент) Эй, Xorg, отобрази окно.

    • (Оконный менеджер) Так, стой, сначала дай мне его обработать.

    • (Оконный менеджер) Все, готово! Xorg, отобрази 2 окна: клиента и мое, которое - декорации.

    • (Xorg) Понял, работаем.

    1. Со стороны пользователя:

    • (Декорации: кнопка скрыть) Эй, оконный менеджер, на меня тут нажали.

    • (Оконный менеджер) Ага, понял! Xorg, скрой декорации и окно клиента, сделай его дочерним для root, очисти свою память от моих декораций.

    • (Xorg) Так точно, выполняю.

    Untitled
    Взаимодействие клиента с менеджером окон

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

    1. floating/stacking - обычный, узнаваемый пользователями винды тип оконных менеджеров: окна можно перемещать, присутствуют декорации, окна могут быть расположены одно поверх другого.

    2. tiling - окна автоматически выстраиваются в сетку, отсутствуют декорации ⇒ нет возможности, с помощью мыши, управлять трансформацией окон, легковесны, не тратят иного ресурсов системы, присутствует широкий спектр кастомизации.

    3. dynamic - оконные менеджеры, в которых совмещается функционал 2 предыдущих типов: окна можно перемещать, менять их размер (не используя декорации) + они могут быть выстроены по определенной сетке.

    4. scrolling - не очень известный тип оконных менеджеров: для окон предусмотрен 1 layout: окна выстраиваются в ряд, который можно скроллить по мере расширения.

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

    Если уже речь пошла о бэкендах, то остановимся на этом подробнее. Бэкенд - это кодовая база, имплементирующая рендер всего, что мы видим на экране. Бэкенды бывают разные: egl, vulkan, xrender, glx и т.д (в этой статье затронем xrender и glx).

    Xrender является резервным вариантом и используется либо со слабым видеускорением, которое не сможет нормально тянуть рендер интерфейса или содержит в драйверах устаревшую версию OpenGL, либо с драйверами software rendering, такими как llvmpipe или softpipe.

    Графическая отрисовка в xrender базируется на библиотеках из окружения X: xcomposite, xcb, xlib etc. Сейчас xrender потихоньку выпиливается из композиторов. Из того же kwin его убрали из-за отсутствия развития технологий и поддержки, в picom он все еще используется. Какие-то серьезные проблемы стараются допиливать, но основной приоритет стоит на glx.

    GLX - бэкенд, который реализовывает все графические эффекты и рендер самих окон через вызовы расширения GLX и OpenGL. По приоритету запуска он выше xrender (обычно, в композиторах реализована проверка графических параметров системы и если по каким-то причинам glx не может быть использован, композитор стартует c xrender).

    Многие композиторы, из соображений различных оптимизаций и совместимости, являются частью оконных менеджеров. Из тех немногих хороших композиторов, которые можно использовать в связке с чистым оконным менеджером, сейчас можно выделить, наверное, только picom и несколько его форков. Раньше можно было еще как-то надеяться на compiz-reloaded, но он, последнее время, слабо развивается и, в основном, для проекта выходят баг фиксы, нежели нововведения.

    Пару слов на счет picom - это форк старого композитора compton. У picom есть постоянный мейнтейнер и широкая группа контрибьютеров. Композитор шустро развивается и регулярно дорабатывается. Из форков, самым интересным сегодня является версия разработчика Ft-Labs: в форке реализованы анимации + он периодически синхронизируется с мейнстримом и дорабатывается. Сейчас анимации в процессе разработки и для оригинального проекта, но, пока все это на стадии майлстоуна для следующей версии проекта.

  4. Шелл - часть программного окружения, которая контролирует и создает такие вещи, как фон рабочего стола, панель задач, иконки рабочего стола, контекстные меню и, возможно, еще какие-нибудь интерактивные элементы на рабочем столе (зависит от реализации). Шелл, в зависимости от архитектуры de, может включать в себя такие вещи, как менеджер окон и композитор (gnome-shell), может быть частью менеджера окон (fly-wm), либо может быть абсолютно сепаратным процессом со своим спектром задач (plasmashell). Закроем gnome-shell, сломается весь рабочий стол, закроем fly-wm, сломается вся сессия, закроем plasmashell, сломается только функционал, за который отвечает процесс - исчезнет фон рабочего стола, иконки приложений и панель задач. Сессия все еще будет запущена, окна останутся интерактивными, с корректными декорациями и наложенными эффектами.

    Какая последовательность запуска компонентов графической сессии?

    Последовательность запуска компонентов графической сессии kde-plasma: Все начинается с того, что запускается тот самый процесс инициализации системы в пространстве пользователя с pid = 1. Сейчас этот процесс называется systemd, но, все равно, во многих системах вы будете видеть в списке процессов экземпляр с названием init, который является символьной ссылкой на исполняемый файл systemd.

    Untitled
    init

    Сейчас, для понимания того, как стартует графическое окружение, вам необходимо знать только то, что этот процесс запускает пулл программ на этапе инициализации системы, в том числе, он запускает дисплей менеджер, точнее, он запускает сервис display-manager.service, который, в свою очередь, запускает исполняемый файл дисплей менеджера. Основные пути, по которым лежат сервисы: "/etc/systemd/system" "/run/systemd/system" "/lib/systemd/system". Для окружения kde-plasma, стандартным dm является sddm. При инсталляции пакета, сервис данного дисплей менеджера попадет в директорию /lib/systemd/system. На самом деле "/etc/systemd/system/display-manager.service" является всего лишь символьной ссылкой на сервис текущего основного dm. Соответственно, systemd, при запуске дисплей менеджера, будет работать именно с сервисом, который лежит в /lib/systemd/system - в эту директорию записываются сервисы, которые предоставляются пакетами после установки - в нашем случае, systemd обработает /lib/systemd/system/sddm.service, который, если заглянуть внутрь, запустит /usr/bin/sddm.

    Untitled
    display-manager.service
    Untitled
    sddm.service

    После запуска, для того, чтобы вывести пользователю интерфейс, sddm запускает Xorg сервер, грубо говоря - приложение, которое реализовывает взаимодействие с клиентами по протоколу X. На пример, для того, чтобы отобразить окно, клиентское приложение должно вызывает метод XMapWindow, Xorg сервер принимает запрос, обращается к графическому оборудованию и выводит изображение на экран. Это довольно примитивное объяснение того, реализована оконная система X - общее представление ее компонентов выглядит довольно комплексно и заслуживает подробного разбора в отдельной статье.

    Untitled
    Структура X Window System

    После того, как пользователь успешно себя идентифицировал и выбрал окружение рабочего стола plasma, sddm, в зависимости от типа сессии X11/Wayland, запустит либо startplasma-x11, либо startplasma-wayland. С этого процесса начинается инициализация пользовательской сессии: выставляются глобальные переменные окружения, запускается набор ключевых для сессии сервисов через dbus и приложений из директорий автостарта. В случае, если systemd не запущен, либо отсутствуют необходимые таргеты (юниты, которые позволяют запускать сервисы группами), startplasma-x11 запускает процесс plasma-session, который является резервным и запускает приложения без привязки к менеджеру systemd.

    Untitled
    startplasma.cpp
    Untitled
    Дерево запуска процессов

    Далее, после того, как plasma определилась с тем, каким способом формировать костяк нашей сессии, происходит непосредственный запуск приложений и сервисов. Для приложений из директорий автостарта учитывается приоритет. В .desktop файлах можно указать фазу, на которой оно будет запущено. Для этого в kde-plasma существует переменная X-KDE-autostart-phase. Индексация идет с 0 до 2. Приложение с самым последним индексом будет запущено позже всего. Указывать приоритет запуска может быть полезно в случае, когда между приложениями происходит коммуникация (IPC). На этом этапе старта системы запускаются такие приложения как оконный менеджер (kwin), оболочка (plasmashell), менеджер сессии (ksmserver), сервис уведомлений, демон (kded5) и так далее: список всех запущенных процессов с демонстрацией вложенности вы можете посмотреть с помощью команды "ps -axjf". После того, как все готово, вы наконец-то входите в сессию, видите рабочий стол и все его графические компоненты.

    Фуууух, на этом, наверное, можно закончить общее ознакомление с тем, из чего состоит "среднее по России" окружение рабочего стола. Надеюсь, вы почерпнули для себя что-то новое и сможете чуть более уверенно пользоваться системой. Если я где-то в технических разъяснениях допустил ошибку, не стесняйтесь меня править. Услышимся в следующих статьях!

Комментарии (12)


  1. NutsUnderline
    10.04.2024 06:52
    +4

    Тема хорошая, но подача уже со второго раздела начинает вызывать вопросы: всплыл какой то композинг (это что вообще за штука???), всякие термины, почти сразу че то в командную строку... в общем не для начинающих уже сразу, дальше - глубже.

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


  1. net_racoon
    10.04.2024 06:52

    Интересно, а такпя сложная архитектура во всех графических ОС? Просто даже сейчас в XFCE есть какие-то косяки (типа проблема с комбинациями клавиш, значками в трее и т.п.), я не могу понять почему они все никак не могут их решить.


    1. NutsUnderline
      10.04.2024 06:52

      в винде, ну, в 95 по крайней.. было как то попороще :) Но там те же истории те же, а наворочалось еще больше.


  1. NutsUnderline
    10.04.2024 06:52

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


    1. V1tol
      10.04.2024 06:52
      +1

      Никто не мешает отказаться от дисплей менеджера и логиниться в своего пользователя в консоли, а дальше startx (или вэйланд альтернативу) вручную или автоматически. А потом можно прикрутить и автологин.


  1. Javian
    10.04.2024 06:52

    off На mint xfwm встретил неприятность при работе с двумя видеокартами. К внутренней Intel подключен монитор. К внешней мониторы не подключены, стоит свободный драйвер nouveau. Рабочий стол отображается на внутренней.

    Ставлю проприетарный драйвер Nvidia и при загрузке на мониторе только мигающий курсор. И не смог вернуть рабочий стол на монитор на встроенной видеокарте.



  1. ShefEr
    10.04.2024 06:52

    Странно, что про логику взаимодействия с окнами в устаревших иксах рассказали, а как оно в актуальном вейланде - нет.


    1. KirillZhilnikov Автор
      10.04.2024 06:52
      +1

      В рамках статьи была задача представить DE в общем плане и частично углубиться во что-то одно для демонстрации комплексности "подкопотных" процессов. X11 и Wayland будут подробно изложены в отдельных работах



  1. artintgm
    10.04.2024 06:52

    А есть способ понять, какие компоненты работают? Если window manager ну всё-таки глазками можно увидеть, то нижележащие компоненты не всегда очевидны: какой композитный менеджер, какой у него бэкенд, какой видеокартой выводится, если графика гибридная выводится. В особенности, если была попытка в Xubuntu запустить i3.


    1. KirillZhilnikov Автор
      10.04.2024 06:52
      +1

      Понять, какие компоненты работают можно через дерево процессов "ps -axjf". Базовые компоненты DE обычно различаются неймингом: для KDE-Plasma названия процессов, начинаются с 'k' 'plasma' (kwin, kded, ksmserver и т.д). Определить композитор можно либо по документации к оконному менеджеру/оболочке, либо через возможные аргументы командной строки (xfwm4 --help), либо посмотреть в synaptic, какие пакеты подтягиваются при установке окружения (если композитор идет отдельно). Узнать бэкенд можно через конфигурацию композитора, либо посмотреть в списке процессов "ps" (может быть запущен с определенным флагом "picom --backend=xrender"). Также, могут быть отдельные утилиты - в случае с kde-plasma, посмотреть информацию по композитингу можно "kcmshell5 kwincompositing".