1

В Unix/Linux + X11 вы можете иметь несколько пользовательских сессий путем (а) изменения отдельных окон с помощью su , sudo или даже ssh или (б) запуска двух сред рабочего стола, используя что-то вроде меню "переключить пользователя". Мой вопрос: как (б) работает. Вопрос приходит в двух версиях:

Практическая версия: легко переключать пользователей с помощью явного интерфейса пользователя на полном рабочем столе, таком как Gnome или KDE. Но как вы делаете это из альтернативного оконного менеджера? (Круто в моем случае).

Теоретическая версия: как на самом деле работает сантехника? Несколько процессов X-сервера используют одно и то же оборудование? Или же современные версии Xorg просто поддерживают концепцию нескольких сессий. Или что-то еще?

1 ответ1

2

GNOME и KDE оба имеют "диспетчера отображения", GDM и KDM соответственно, которые играют большую роль в этом. Задачи диспетчера отображения в основном состоят в том, чтобы запускать сервер X11 (в наши дни Xorg, Xfree86 или оригинальный X-сервер ранее) на каждом физическом дисплее и представлять на них экраны входа в систему. Xdm, вероятно, самый старый.

Современные дисплеи дисплеев были расширены для запуска нескольких серверов X11 на одном и том же месте - для каждого сеанса пользователя, плюс один для экрана входа в систему ("приветствующий"). Только один из этих сеансов активен в любое время и управляет графическим оборудованием; другие бросают это. [1]

В Linux для этого используется функция "виртуальной консоли" - технически возможно переключаться между этими сеансами с помощью широко известных клавиш Ctrl Alt F12345… , хотя вы не будете знать, какой дисплей X11 пользователя работает на какой виртуальной консоли. [2]

Обычно есть еще один демон, обычно ConsoleKit или systemd-logind, который отслеживает, какие пользователи вошли в систему, для всех видов текстовых и графических сеансов (tty, ssh, X11, Wayland и т.д.).

Сам сеанс на самом деле не нужно делать много; это зависит только от 'logind', а иногда и от конкретного диспетчера отображения.

  • Если вы хотите отобразить список пользователей (как это делает Unity), демоны logind или ConsoleKit можно использовать через DBus, чтобы получить список вошедших в систему пользователей и активировать выбранный сеанс. После этого текущий сеанс должен заблокироваться (например, запустив заставку; в GNOME и KDE блокировка экрана встроена в сам диспетчер окон).

  • В GNOME нет списка пользователей, есть только один пункт меню "Переключить пользователей". При этом используется libgdmgreeter для активации "сеанса входа в систему" (сеанс с экраном входа в систему) с помощью "logind" или ConsoleKit; если не запущен "сеанс входа в систему", libgdmgreeter связывается с GDM через DBus, чтобы начать новый. Я думаю, что это можно сделать, запустив команду gdmflexiserver .


[1] Добровольно, по крайней мере, в текущей реализации Linux; Есть планы сделать его более строгим, чтобы системный компонент фактически отменял доступ. Точно так же, если вы во время сеансов запускаете PulseAudio, он добровольно откажется от доступа к аудиоустройствам. С голой ALSA нет ничего, что могло бы сделать это, так что доступ к аудио с переключением сессий - игра удачи. То есть, даже если неактивные сеансы не могут открыть аудиоустройства после того, как 'logind' выполнил свою работу, они все еще могут воспроизводить звук через ранее открытые устройства, и ничто не может заставить их закрыться (пока ядро не получит revoke() служба поддержки).

[2] Виртуальные консоли Linux доступны только на 0-м "месте"; если бы у вас было больше подключенных дисплеев и клавиатур, у них могли бы быть свои собственные серверы X11 - посмотрите демонстрационные примеры многоадресных версий Fedora 19 - но я полагаю, что они не могут переключаться между сеансами. Но сейчас, среди прочего, есть много попыток сделать работу с несколькими местами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .