Display Manager Policy: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 17 промежуточных версий 2 участников)
Строка 31: Строка 31:


Служебный скрипт вызывается из файл-триггера пакета {{pkg|xinitrc}} автоматически.
Служебный скрипт вызывается из файл-триггера пакета {{pkg|xinitrc}} автоматически.
<!--Display Manager ''должен'' иметь зависимость {{pkg|xinitrc}} >= 2.4.32.-->
<!--Display Manager ''должен'' иметь зависимость {{pkg|xinitrc}} >= 2.4.32.-->


Строка 40: Строка 39:
==== Запуск оконного менеджера ====
==== Запуск оконного менеджера ====


Скрипты обновления меню для Display Manager'а может осуществлять парсинг файлов в <tt>/usr/share/xsessions/</tt> и запуск оконного менеджера самостоятельно.
Скрипты обновления меню для Display Manager'а может осуществлять парсинг файлов в <tt>/usr/share/xsessions/</tt> и запуск оконного менеджера самостоятельно. Однако поскольку DM не соответствует стандарту Freedesktop, то он скорее всего не производит всех необходимых действий, требуемых стандартом, к примеру, не выставляет переменную окружения {{cmd|$XDG_CURRENT_DESKTOP}}. Поэтому для получения списка оконных менеджеров и запуска оконного менеджера рекомендуется пользоваться командой {{cmd|runwm}}.
Однако поскольку DM не соответствует стандарту Freedesktop, то он скорее всего не производит всех необходимых действий, требуемых стандартом, к примеру, не выставляет переменную окружения {{cmd|$XDG_CURRENT_DESKTOP}}.
 
Поэтому для получения списка оконных менеджеров и запуска оконного менеджера рекомендуется пользоваться командой {{cmd|runwm}}.


==== Использование скриптов {{pkg|xinitrc}} и {{cmd|runwm}} для эмуляции стандарта Freedesktop ====
==== Использование скриптов {{pkg|xinitrc}} и {{cmd|runwm}} для эмуляции стандарта Freedesktop ====
Строка 51: Строка 47:
Согласно новому [[УпаковкаWM|полиси по упаковке оконных менеджеров]] (Window Managers), последние декларируют себя в системе с помощью файлов {{path|/usr/share/xsessions/<name>.desktop}}.
Согласно новому [[УпаковкаWM|полиси по упаковке оконных менеджеров]] (Window Managers), последние декларируют себя в системе с помощью файлов {{path|/usr/share/xsessions/<name>.desktop}}.


Для каждого валидного и не скрытого (<tt>Hidden=true</tt>) desktop файла команда rundm --list выдаст уникальную не содержащую пробелов строку-название оконного менеджера <tt>WMNAME</tt>, которую можно отобразить в меню DE и при выборе пользователя передать в команду {{cmd|/etc/X11/Xsession}}.
Для каждого валидного и не скрытого (<tt>Hidden=true</tt>) desktop файла команда {{cmd|rundm--list}} выдаст уникальную не содержащую пробелов строку-название оконного менеджера <tt>WMNAME</tt>, которую можно отобразить в меню DE и при выборе пользователя передать в команду {{cmd|/etc/X11/Xsession}}. Команда {{cmd|/etc/X11/Xsession}} вызовет в итоге с этой строкой команду {{cmd|rundm}}, которая по ней найдет исходный desktop файл и запустит указанную там команду.


Кроме <tt>WMNAME</tt>-ов, полученных из файлов {{path|/usr/share/xsessions/*.desktop}}, существует специальное <tt>WMNAME</tt> «default» для сессии по умолчанию.
Кроме <tt>WMNAME</tt>-ов, полученных из файлов {{path|/usr/share/xsessions/*.desktop}}, существует специальное <tt>WMNAME</tt> «default» для сессии по умолчанию.


Реализация для <tt>WMNAME</tt> определена в {{prg|runwm}}.
Реализация для <tt>WMNAME</tt> определена в {{prg|runwm}}. DM не должен работать с <tt>WMNAME</tt> иначе, чем через {{prg|runwm}}.


Текущая реализация <tt>WMNAME</tt>:
Текущая реализация <tt>WMNAME</tt> (может изменяться без предупреждения):
Берется первое слово из поля <tt>Name=</tt> desktop файла. Если оно не уникально, то берется имя desktop файла без суффикса DNS и префикса .desktop. Иначе берется имя desktop файла.
Берется первое слово из поля <tt>Name=</tt> desktop файла. Если оно содержит юникод или не уникально, то берется имя desktop файла без суффикса DNS и префикса .desktop. Иначе берется имя desktop файла.
Пример:
Пример:
1) icewm имеет 1 desktop файл {{path|icewm-session.desktop}} с 'Name=IceWM Session', то <tt>WMNAME</tt> будет 'IceWM'.
 
2) icewm имеет 2 desktop файла {{path|org.icewm.icewm-session.desktop}} с 'Name=IceWM Session' и {{path|org.icewm.icewm-classic.desktop}}  с 'Name=IceWM Classic look&Feel' то <tt>WMNAME</tt> будут 'icewm-session' и 'icewm-classic'.
1) Пусть axewm имеет 1 desktop файл {{path|axewm-session.desktop}} с 'Name=AxeWM Session'. Тогда <tt>WMNAME</tt> будет 'AxeWM'.
 
2) Пусть axewm имеет 2 desktop файла {{path|org.axewm.axewm-session.desktop}} с 'Name=AxeWM Session' и {{path|org.axewm.axewm-classic.desktop}}  с 'Name=AxeWM Classic look&Feel'. Тогда <tt>WMNAME</tt> будут 'axewm-session' и 'axewm-classic'.


===== получения списка оконных менеджеров командой {{cmd|runwm}} =====
===== получения списка оконных менеджеров командой {{cmd|runwm}} =====
Строка 76: Строка 74:
=== фон по умолчанию ===
=== фон по умолчанию ===
Рекомендуется выставлять в настройках Display Manager фон (wallpaper) по умолчанию как  
Рекомендуется выставлять в настройках Display Manager фон (wallpaper) по умолчанию как  
  /usr/share/design/current/backgrounds/xpm.png
  /usr/share/design/current/backgrounds/xdm.png


Чтобы файл {{path|/usr/share/design/current/backgrounds/xpm.png}}
Чтобы файл {{path|/usr/share/design/current/backgrounds/xdm.png}}
существовал бы в файловой системе, надо добавить в зависимости
существовал бы в файловой системе, надо добавить в зависимости
  Requires: design-graphics
  Requires: design-graphics


== pam ==
== Вопросы, оставшиеся не урегулированными в версии 2.0 ==
 
Планируется со временем собрать рекомендации по нижеизложенным вопросам и выпустить на их основе проект этого полиси версии 2.1.
 
На момент версии 2.0 этот раздел является заглушкой.
 
=== pam ===
 
Планируется провести стандартизацию конфигурации pam для DM на уровне дистрибутива.
Для этого собрать пакет с набором стандартных конфигураций pam для dm
dm-systemd
dm-systemd-greeter
dm-systemd-autologin
dm-nosystemd
dm-nosystemd-autologin
и перевести DM на его использование
 
Известные исключения: gdm (собственный модуль pam).
 
=== пользовательские сессии d-bus ===
 
Не путаем пользовательские сессии dbus с системными. Практически всем современным DM, включая XDM, для работы требуется системная сессия d-bus.
Cистемная сессия d-bus одна, пользовательские сессии запускаются для каждого пользователя.
Сейчас по умолчанию управлением пользовательскими сессиями dbus занимается systemd.
Если DM поддерживает pam_systemd (выполняет его корректную настройку через переменные окружения) и DM по возможности использует pam_systemd
(-pam_systemd прописан в pam-файле DM) то поддержка пользовательскими сессиями dbus выполняется прозрачно для DM:
pam_systemd прозрачно для DM связывается с logind с сообщением о новой сессии, systemd запускает при необходимости пользовательскую сессию,
pam_systemd устанавливает нужный DBUS_SESSION_BUS_ADDRESS в переменных окружения.
 
Для систем без systemd, для альтернатив systemd, на случай других неожиданностей для <xsession> есть подстраховка в виде {{cmd|/etc/X11/xinit.d/00-start-message-bus.sh}}, которая вызывается оберткой {{cmd|/etc/X11/Xsession}}. Для wayland сессий планируется добавить подстраховку в wayland-session.
 
Поэтому корректный запуск при необходимости пользовательской сессии dbus работает для всех DM, есть systemd или нет,
при условии, если они используют {{prg|/etc/X11/Xsession}} для запуска <xsession>.
 
<!--
предлагается также внести эту функциональность в runwm. Если нет DBUS_SESSION_BUS_ADDRESS -
попробовать по системной шине dbus узнать у logind, есть ли уже пользовательская сессия; запустить при необходимости.
-->
 
см. подробнее
* [https://www.freedesktop.org/wiki/Software/dbus/ https://www.freedesktop.org/wiki/Software/dbus/]
* [https://en.wikipedia.org/wiki/D-Bus https://en.wikipedia.org/wiki/D-Bus]
* [https://dbus.freedesktop.org/doc/dbus-run-session.1.html https://dbus.freedesktop.org/doc/dbus-run-session.1.html]
* [https://dbus.freedesktop.org/doc/dbus-tutorial.html https://dbus.freedesktop.org/doc/dbus-tutorial.html]
* [https://wiki.archlinux.org/title/D-Bus https://wiki.archlinux.org/title/D-Bus]
* [https://archlinux.org/news/d-bus-now-launches-user-buses/ https://archlinux.org/news/d-bus-now-launches-user-buses/]
 
=== Wayland ===
 
==== предложение к 2.1: ====
 
Requires: dm-common-wayland
Указать в качестве скрипта-обертки для запуска wayland-sessions
/etc/wayland-sessions/wrapper
 
==== проблемы к обсуждению ====
 
Не наработана системная обвязка для сессий Wayland.
 
Текст внизу предварительный и нуждается в обсуждении и уточнении.
 
Отличия классической сессии X от сессии Wayland.


на момент версии 2.0 раздел pam является заглушкой.
Сводная таблица отличий.
{| class="standard"
!
! сессия X
! сессия Wayland
|-
| сервер
| требуется уже запущенный X сервер.
| не требуется. Приложение запускает его самостоятельно
|-
| ограничения
| X приложение.
| нет. Что угодно. wayland compositor, fb app, console app,<br>X app (должна сама запускать себе X)
|-
| запуск
| нет требований. Сойдет fork+exec в текущем VT
| аналог openvt -s -- <wsession script>
|-
| обертка D-BUS
| dbus-launch --exit-with-x11 <xsession-script>
| dbus-run-session <wsession script>
|}


Похоже, что конфигурация pam для DM нуждается в стандартизации на уровне дистрибутива.
Следствие.
сессии Wayland в принципе не могут использовать  старую схему с запуском /etc/X11/Xsession как посредника.
Хотя бы потому, что /etc/X11/Xsession должен быть запущен в сеансе X-cервера, вызывает утилиты X и без X-cервера
вылетит с ошибкой. Также почти все, что делает /etc/X11/Xsession, бессмысленно вне X.
Исключение -
/etc/X11/profile.d
но там у нас по сути нет ничего конкретно для X. Можно ввести какой-нибудь
/etc/user-session/profile.d
и перенести бывшее в {{path|/etc/X11/profile.d}} туда ({{cmd|ssh-agent.sh}} {{cmd|xdg-user-dirs.sh}} ...).


Планируется со временем собрать рекомендации по настройке pam и выпустить на их основе проект этого полиси версии 2.1.
В итоге гипотетический помощник ALT для сессии Wayland должен вызвать {{path|/etc/user-session/profile.d}}
и проконтролировать наличие пользовательской сессии D-BUS, обернув при необходимости вызов сессии Wayland в {{cmd|dbus-run-session}}.
Это может быть не только скрипт, но и, к примеру, специально написанный для ALT pam модуль.


== Примечания ==
== Примечания ==

Текущая версия от 19:40, 23 августа 2023

Полиси по упаковке Display Manager’ов

Stamp90cw.png
Действующая политика Sisyphus

Политика действует, начиная со стабильного бранча 5.1 и выше.

Ответственный за проведение политики в жизнь — Igor Vlasenko.


История

  • Версия 1.0 (с бранча 5.1)
  • Версия 2.0 (с бранча 10). Вынесена на обсуждение (переезд на стандарт Freedesktop; поддержка /etc/X11/wms-methods.d оставлена для DM, не соответствующих стандарту Freedesktop). metabug

поддержка выбора оконного менеджера (WM)/рабочей среды (DE)

DM, соответствующие стандарту Freedesktop

Ничего менять не требуется. Используется стандартный механизм, когда оконные менеджеры регистрируются в системе через .desktop-файлы в каталоге /usr/share/xsessions/.

Рекомендуется настроить DM так, что если существует файл $XDG_BASE_DIRS/xsessions/default.desktop, то он был установлен в меню DM как выбор по умолчанию.

DM, не соответствующие стандарту Freedesktop

DM, не соответствующий стандарту Freedesktop, не умеет читать .desktop-файлы в каталоге /usr/share/xsessions напрямую и вынужден пользоваться сторонними программами.

Обновление меню Display Manager’а

статическая конфигурация Display Manager

Если конфигурация Display Manager статическая, т.е. меню выбора WM/DE жестко прописано в его файлах конфигурации, то для обновления своего меню Display Manager должен предоставлять метод-файл /etc/X11/wms-methods.d/DMmethod. Метод-файл /etc/X11/wms-methods.d/DMmethod должен быть исполняемым.

Этот файл будет запускаться служебными скриптами[1] каждый раз при установке, обновлении, удалении оконных менеджеров, а также при установке и обновлении самого Display Manager’а.

Служебный скрипт вызывается из файл-триггера пакета xinitrc автоматически.

динамическая конфигурация Display Manager

Если конфигурация Display Manager динамическая, т.е. пункты меню выбора WM/DE генерируются при запуске, метод-файл /etc/X11/wms-methods.d/DMmethod предоставлять не нужно.

Запуск оконного менеджера

Скрипты обновления меню для Display Manager'а может осуществлять парсинг файлов в /usr/share/xsessions/ и запуск оконного менеджера самостоятельно. Однако поскольку DM не соответствует стандарту Freedesktop, то он скорее всего не производит всех необходимых действий, требуемых стандартом, к примеру, не выставляет переменную окружения $XDG_CURRENT_DESKTOP. Поэтому для получения списка оконных менеджеров и запуска оконного менеджера рекомендуется пользоваться командой runwm.

Использование скриптов xinitrc и runwm для эмуляции стандарта Freedesktop

WMNAME для runwm

Согласно новому полиси по упаковке оконных менеджеров (Window Managers), последние декларируют себя в системе с помощью файлов /usr/share/xsessions/<name>.desktop.

Для каждого валидного и не скрытого (Hidden=true) desktop файла команда rundm--list выдаст уникальную не содержащую пробелов строку-название оконного менеджера WMNAME, которую можно отобразить в меню DE и при выборе пользователя передать в команду /etc/X11/Xsession. Команда /etc/X11/Xsession вызовет в итоге с этой строкой команду rundm, которая по ней найдет исходный desktop файл и запустит указанную там команду.

Кроме WMNAME-ов, полученных из файлов /usr/share/xsessions/*.desktop, существует специальное WMNAME «default» для сессии по умолчанию.

Реализация для WMNAME определена в runwm. DM не должен работать с WMNAME иначе, чем через runwm.

Текущая реализация WMNAME (может изменяться без предупреждения): Берется первое слово из поля Name= desktop файла. Если оно содержит юникод или не уникально, то берется имя desktop файла без суффикса DNS и префикса .desktop. Иначе берется имя desktop файла. Пример:

1) Пусть axewm имеет 1 desktop файл axewm-session.desktop с 'Name=AxeWM Session'. Тогда WMNAME будет 'AxeWM'.

2) Пусть axewm имеет 2 desktop файла org.axewm.axewm-session.desktop с 'Name=AxeWM Session' и org.axewm.axewm-classic.desktop с 'Name=AxeWM Classic look&Feel'. Тогда WMNAME будут 'axewm-session' и 'axewm-classic'.

получения списка оконных менеджеров командой runwm

Для получения списка всех WMNAME для установленных в системе оконных менеджеров можно воспользоваться командой runwm --list. Эту команду можно использовать в файле /etc/X11/wms-methods.d/DMmethod для обновления конфигурации DM, или напрямую вызвать из DM для получения меню выбора.

Запуск WM скриптами xinitrc

Для запуска оконного менеджера Display Manager должен вызывать команду /etc/X11/Xsession с параметром WMNAME.

Интеграция с системными темами branding-*

фон по умолчанию

Рекомендуется выставлять в настройках Display Manager фон (wallpaper) по умолчанию как

/usr/share/design/current/backgrounds/xdm.png

Чтобы файл /usr/share/design/current/backgrounds/xdm.png существовал бы в файловой системе, надо добавить в зависимости

Requires: design-graphics

Вопросы, оставшиеся не урегулированными в версии 2.0

Планируется со временем собрать рекомендации по нижеизложенным вопросам и выпустить на их основе проект этого полиси версии 2.1.

На момент версии 2.0 этот раздел является заглушкой.

pam

Планируется провести стандартизацию конфигурации pam для DM на уровне дистрибутива. Для этого собрать пакет с набором стандартных конфигураций pam для dm

dm-systemd
dm-systemd-greeter
dm-systemd-autologin
dm-nosystemd
dm-nosystemd-autologin

и перевести DM на его использование

Известные исключения: gdm (собственный модуль pam).

пользовательские сессии d-bus

Не путаем пользовательские сессии dbus с системными. Практически всем современным DM, включая XDM, для работы требуется системная сессия d-bus. Cистемная сессия d-bus одна, пользовательские сессии запускаются для каждого пользователя. Сейчас по умолчанию управлением пользовательскими сессиями dbus занимается systemd. Если DM поддерживает pam_systemd (выполняет его корректную настройку через переменные окружения) и DM по возможности использует pam_systemd (-pam_systemd прописан в pam-файле DM) то поддержка пользовательскими сессиями dbus выполняется прозрачно для DM: pam_systemd прозрачно для DM связывается с logind с сообщением о новой сессии, systemd запускает при необходимости пользовательскую сессию, pam_systemd устанавливает нужный DBUS_SESSION_BUS_ADDRESS в переменных окружения.

Для систем без systemd, для альтернатив systemd, на случай других неожиданностей для <xsession> есть подстраховка в виде /etc/X11/xinit.d/00-start-message-bus.sh, которая вызывается оберткой /etc/X11/Xsession. Для wayland сессий планируется добавить подстраховку в wayland-session.

Поэтому корректный запуск при необходимости пользовательской сессии dbus работает для всех DM, есть systemd или нет, при условии, если они используют /etc/X11/Xsession для запуска <xsession>.


см. подробнее

Wayland

предложение к 2.1:

Requires: dm-common-wayland

Указать в качестве скрипта-обертки для запуска wayland-sessions

/etc/wayland-sessions/wrapper

проблемы к обсуждению

Не наработана системная обвязка для сессий Wayland.

Текст внизу предварительный и нуждается в обсуждении и уточнении.

Отличия классической сессии X от сессии Wayland.

Сводная таблица отличий.

сессия X сессия Wayland
сервер требуется уже запущенный X сервер. не требуется. Приложение запускает его самостоятельно
ограничения X приложение. нет. Что угодно. wayland compositor, fb app, console app,
X app (должна сама запускать себе X)
запуск нет требований. Сойдет fork+exec в текущем VT аналог openvt -s -- <wsession script>
обертка D-BUS dbus-launch --exit-with-x11 <xsession-script> dbus-run-session <wsession script>

Следствие. сессии Wayland в принципе не могут использовать старую схему с запуском /etc/X11/Xsession как посредника. Хотя бы потому, что /etc/X11/Xsession должен быть запущен в сеансе X-cервера, вызывает утилиты X и без X-cервера вылетит с ошибкой. Также почти все, что делает /etc/X11/Xsession, бессмысленно вне X. Исключение -

/etc/X11/profile.d

но там у нас по сути нет ничего конкретно для X. Можно ввести какой-нибудь

/etc/user-session/profile.d

и перенести бывшее в /etc/X11/profile.d туда (ssh-agent.sh xdg-user-dirs.sh ...).

В итоге гипотетический помощник ALT для сессии Wayland должен вызвать /etc/user-session/profile.d и проконтролировать наличие пользовательской сессии D-BUS, обернув при необходимости вызов сессии Wayland в dbus-run-session. Это может быть не только скрипт, но и, к примеру, специально написанный для ALT pam модуль.

Примечания

  1. в настоящее время — /usr/sbin/update_wms