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 - но я полагаю, что они не могут переключаться между сеансами. Но сейчас, среди прочего, есть много попыток сделать работу с несколькими местами.