在 Unix/Linux + X11 中,您可以通过以下方式拥有多个用户会话(A)su
使用、sudo
甚至ssh
或更改单个窗口(二)使用类似“切换用户”菜单运行两个桌面环境。我的问题是:(b) 如何工作。这个问题有两个版本:
实用版本:通过 Gnome 或 KDE 等完整桌面中的显式 UI 可以轻松切换用户。但是如何从其他窗口管理器执行此操作?(惊人的就我而言)。
理论版本:管道系统究竟是如何工作的?多个 X 服务器进程是否共享同一硬件?或者 Xorg 的现代版本是否仅支持多个会话的概念。或者是其他原因?
答案1
GNOME 和 KDE 都有“显示管理器”,分别是 GDM 和 KDM,它们在这方面发挥了重要作用。显示管理器的目的基本上是在每个物理显示器上运行 X11 服务器(现在的 Xorg,早期的 Xfree86 或原始 X 服务器),并在其上显示登录屏幕。Xdm 可能是最古老的。
现代显示管理器已扩展至运行多种的X11 服务器位于同一位置 – 用于每个用户会话,以及用于登录屏幕(“欢迎界面”)本身。这些会话中只有一个处于活动状态并控制图形硬件;其他会话放弃控制。[1]
在 Linux 上,“虚拟控制台”功能用于此目的——技术上可以使用广为人知的CtrlAltF12345…键在这些会话之间切换,尽管您不知道哪个用户的 X11 显示器在哪个虚拟控制台上运行。[2]
通常还有另一个守护进程,通常是 ConsoleKit 或“systemd-logind”,用于跟踪登录的用户,包括各种文本和图形会话(tty、ssh、X11、Wayland 等)。
会话本身实际上不需要做很多事情;它只依赖于“logind”,有时还依赖于特定的显示管理器。
如果您想要显示用户列表(如 Unity 所做的那样),可以通过 DBus 使用“logind”或 ConsoleKit 守护程序来获取已登录用户的列表,并激活所选会话。当前会话应在执行此操作后自行锁定(例如通过运行屏幕保护程序;GNOME 和 KDE 都在窗口管理器本身中集成了屏幕锁定)。
在 GNOME 中,没有用户列表,只有一个“切换用户”菜单项。这用于
libgdmgreeter
使用“logind”或 ConsoleKit 激活“登录会话”(具有登录屏幕的会话);如果没有正在运行的“登录会话”,libgdmgreeter 将通过 DBus 联系 GDM 以启动一个新会话。我认为这可以通过运行命令来完成gdmflexiserver
。
[1] 至少在当前的 Linux 实现中是自愿的;有计划使其更加严格,以便系统组件实际上会撤销访问权限。同样,如果会话运行 PulseAudio,它会自愿放弃对音频设备的访问权限。使用裸 ALSA,没有什么可以这样做,因此会话切换的音频访问是一场运气游戏。也就是说,即使非活动会话无法打开'logind' 完成其工作后的音频设备,它们仍然可以通过先前打开的设备播放声音,并且没有什么可以强制关闭它们(直到内核获得revoke()
支持)。
[2] Linux 虚拟控制台仅在第 0 个“座位”上可用;如果您连接了更多显示器和键盘,它们可以拥有自己的 X11 服务器 - 查看 Fedora 19 多座位演示 - 但它们我猜不能进行会话切换。但目前,在尝试使多座位工作等方面有很多进展。