Ubuntu 12.04-14.04 桌面用户 GUI 会话如何开始

Ubuntu 12.04-14.04 桌面用户 GUI 会话如何开始

出现问题时,最好了解将用户登录到 GUI 会话的背后发生了什么,并让 Unity(或其他窗口管理器)调出桌面。

答案1

Ubuntu 12.04-14.04 桌面用户 GUI 会话如何开始

以下是事件链:

Ubuntu Linux 内核和新贵

内核以进程号 1 启动 init 进程。这是 Ubuntu 12.04 的 upstart。

新兴职位/etc/init/


手册页:man init

日志:内核日志(dmesg;复制到/var/log/syslog),,/var/log/upstart/jobname.log其他由启动的作业确定的日志。

来源:/etc/init/lightdm.conf


upstart 作业执行/usr/sbin/lightdm。我们可能可以预期,随着时间的推移,这将转换为systemd服务单元。

光网络


手册页:man lightdm , 还:Ubuntu 维基:LightDM

日志:

/var/log/syslog
/var/log/lightdm/lightdm.log
/var/log/lightdm/*

## for PAM:
/var/log/auth.log

## for the Xorg X server:
/var/log/Xorg.0.log

来源:人 lightdm/var/log/lightdm/lightdm.log


lightdm 在 init 进程中启动得相当晚;例如,系统 dbus 必须已经启动,文件系统必须准备就绪,图形显示系统必须准备就绪。

lightdm 创建 xauthority 文件,然后启动 X,在 VT 7 上启动它,这是按Alt+ Ctrl+后获得的虚拟终端F7。启动 X 时,lightdm 发出信号让 Plymouth 启动画面程序退出。这必须在所有 tty(1-6)启动后发生。

自 2013 年 7 月起,Mir 支持项目已添加到 lightdm,但从 14.04 版开始,这些项目不再默认用于桌面系统。

X 尝试使用最先进的驱动程序。它自己的驱动程序从 加载/usr/lib/xorg/modules/。请注意,许多设备都同时存在内核驱动程序和 xorg 驱动程序,而 xorg 驱动程序几乎肯定使用内核驱动程序。dri 和 glx 是重要的功能,特别是对于高级高性能图形而言。X 的日志存储在 中/var/log/Xorg.0.log

通过系统 dbus 进行有关此“座位”的通信并获取可能的用户名。lightdm 使用 X 来绘制屏幕。unity-greeter 用于协助该过程。

当您选择各种可能的用户 ID 时,将使用该用户 ID 的背景图像。

lightdm 从中获取潜在窗口管理器/系统的名称/usr/share/xsessions/*.desktop

账户信息是通过 dbus 上的 accountsservice accounts-daemon 获取的。

lightdm 和欢迎程序使用 PAM 来验证用户身份。验证成功后,PAM 将使用 --login 选项启动 gnome-keyring-daemon 守护进程,并向其提供用户的密码,以便它可以解锁用户的登录密钥环(如果存在)。请参阅https://live.gnome.org/GnomeKeyring/Pam 和 man 8 pam_unix 了解更多信息。PAM 将日志信息存储在 中,并由(几乎为空) 和/var/log/auth.log控制。具体请参见和。/etc/pam.conf/etc/pam.d/*/etc/pam.d/lightdm/etc/pam.d/lightdm-autologin

一旦用户通过身份验证,权限将被删除,并且会写入~user/.dmrc描述会话的文件。例如:

[Desktop]
Session=ubuntu

或者

[Desktop]
Session=awesome

.desktop从现在开始的文件决定/usr/share/xsessions/*.desktop其余的启动顺序。

例如,以下是 Unity 的示例:

[Desktop Entry]
Name=Ubuntu
Comment=This session logs you into Ubuntu
Exec=gnome-session --session=ubuntu
TryExec=unity
Icon=
Type=Application
X-Ubuntu-Gettext-Domain=gnome-session-3.0

shell/usr/sbin/lightdm-session脚本使用参数 g 运行nome-session --session=ubuntu (原文如此——‘ubuntu’,而不是‘unity’)

lightdm 会话


日志:?
错误日志:~/.xsession-errors
已启动进程日志:~/.cache/upstart/*
来源:/usr/sbin/lightdm-session


/usr/sbin/lightdm-session然后采取以下步骤:

运行:

  • /etc/profile, $HOME/.profile

  • /etc/xprofile $HOME/.xprofile

  • /etc/X11/Xresources从和加载资源(如果存在) ,则使用和$HOME/.Xresources的内容通过 setxbmap 加载键盘映射 ;/etc/X11/Xkbmap$HOME/.Xkbmap

  • 如果不使用 XKB,则使用 xmodmap 来对付任何现有的/etc/X11/Xmodmap$HOME/.Xmodmap

  • 运行脚本/etc/X11/xinit/xinitrc.d

  • 运行中的 Xsession 脚本/etc/X11/Xsession.d/*,使用中的选项/etc/X11/Xsession.options

    其中一个启动 ssh-agent(冗余),另一个执行$HOME/.xsessionrc。另一个启动 session-dbus(ssh-agent 和 session-dbus 都在上述文件中允许Xsession.options)。此 session dbus 对于与此单个用户会话有关的进程之间的通信很有用。

如果在会话期间的某个时间点通过 ssh-add 添加了 ssh 密钥,则 ssh-agent 可以保留该会话的 ssh 密钥,但 gnome-keyring-daemon 也会执行相同的操作。

/etc/X11/Xsession.d/50_check_unity_support运行 /usr/lib/nux/unity_support_test,如果失败则导出LIBGL_ALWAYS_SOFTWARE=1到环境,以便llvmpipe用于软件渲染桌面。

从 Ubunu 13.10 开始: /etc/X11/Xsession.d/00upstart将变量设置UPSTART1/etc/X11/Xsession.d/99upstart检查该变量,如果设置,则将其替换init --user 为设置为 的其他项$STARTUP。因此,用户模式 ​​upstart 在 中启动那些 upstart 作业/usr/share/upstart/sessions。其中之一是gnome-session.conf启动 gnome-session。

除非已经完成,否则 lightdm-session 最后会启动一个窗口管理器,或者对于 unity,上述操作会启动 gnome-session 会话管理器。

看来 lightdm-session 承担了 xsession 的传统角色。它的手册页位于http://manpages.ubuntu.com/manpages/precise/man5/Xsession.5.html.lightdm 将其视为会话包装器。

gnome-session 会话管理器(Unity 和 Gnome Shells)


手册页:http://manpages.ubuntu.com/manpages/precise/en/man1/gnome-session.1.html
日志:?

来源:手册页


例如,gnome-session 用于 Unity,但默认情况下不用于 awesome。请参阅上面的 .desktop 文件。

gnome-session 从 /usr/share/gnome-session/sessions/ 启动指定的程序,并从 ~/.config/autostart/ 和 /etc/xdg/autostart 启动应用程序。

以下是 /etc/xdg/autostart 的一个示例:

$cat /etc/xdg/autostart/nm-applet.desktop
[Desktop Entry]
Name=Network
Comment=Manage your network connections
Icon=nm-device-wireless
Exec=nm-applet
Terminal=false
Type=Application
NoDisplay=true
NotShowIn=KDE;
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Component=general
X-GNOME-Autostart-enabled=true
X-Ubuntu-Gettext-Domain=nm-applet

另一个,/etc/xdg/autostart/gnome-keyring-ssh.desktop,使用 --start 选项启动 gnome-keyring-daemon,完成该守护进程的启动,并将有关它的重要信息存储在环境中以供 ssh 可能使用。

从 ps aux 列表中可以看出 gnome-session 使用 dbus-launch 启动窗口管理器。

窗口管理器

超棒的窗口管理器


手册页:http://manpages.ubuntu.com/manpages/precise/en/man1/awesome.1.html
日志:?

来源:手册页,配置文件检查


这是 lightdm-session 使用的 /usr/share/xsessions/ 中的 awesome.desktop 文件:

[Desktop Entry] 
Encoding=UTF-8
Name=awesome
Comment=Highly configurable framework window manager
TryExec=awesome
Exec=awesome

如您所见,该条目仅导致 awesome 窗口管理器被执行。它读取自己的配置文件,包括 awesome 包中的 /etc/xdg/awesome/rc.lua。可以使用 $HOME/.config/awesome/rc.lua 进行配置。

统一


来源:配置文件检查


这是 /usr/share/xsessions/ 中的 ubuntu.desktop 文件:

[Desktop Entry]
Name=Ubuntu
Comment=This session logs you into Ubuntu
Exec=gnome-session --session=ubuntu
TryExec=unity
Icon=
Type=Application
X-Ubuntu-Gettext-Domain=gnome-session-3.0

这将启动 /usr/share/gnome-session/sessions/ubuntu.session 中描述的 gnome 会话

以下是该文件:

[GNOME Session]
Name=Ubuntu
RequiredComponents=gnome-settings-daemon;
RequiredProviders=windowmanager;panel;
DefaultProvider-windowmanager=compiz
DefaultProvider-panel=compiz
IsRunnableHelper=/usr/lib/nux/unity_support_test
FallbackSession=ubuntu-2d
DesktopName=Unity

gnome-session 在 12.04 中运行的 IsRunnableHelper 程序决定是否可以运行 unity 或 ubuntu-2d 是否运行。如果它出错并说 unity 可以运行但实际上不能运行,那就麻烦了。如果遇到这种情况,请在 lightdm 中手动选择 ubuntu-2d。虽然它返回返回代码,但我们可以通过使用 -p 选项运行它来查看它在做什么。

$ /usr/lib/nux/unity_support_test -p
OpenGL vendor string:   X.Org R300 Project
OpenGL renderer string: Gallium 0.4 on ATI RS690
OpenGL version string:  2.1 Mesa 8.0.2

Not software rendered:    yes
Not blacklisted:          yes
GLX fbconfig:             yes
GLX texture from pixmap:  yes
GL npot or rect textures: yes
GL vertex program:        yes
GL fragment program:      yes
GL vertex buffer object:  yes
GL framebuffer object:    yes
GL version is 1.4+:       yes

Unity 3D supported:       yes

对于 12.10 及更高版本,不支持的硬件使用 llvmpipe 软件来渲染硬件无法渲染的内容。其配置文件比上面的更简单。请参阅上文了解如何启用它。

从以上文件中我们可以看出,gnome-session 必须启动设置守护进程,并启动 compiz 以运行窗口管理器和任何面板。

康普兹


手册页:http://manpages.ubuntu.com/manpages/precise/en/man1/compiz.1.html
日志:?
来源:http://en.wikipedia.org/wiki/Compiz、文件系统检查


一旦启动 compiz,它就会运行各种插件。在 12.10 之前,gnome-settings 用于定义这些插件。可以使用 ccsm(compiz 配置设置管理器)或 gconf-editor 更改它们。插件设置存储在 apps/compiz-1/general/screen0/options 下的 active_plugins 中。重复设置导致我在使用 compiz 时出现段错误。这些插件存储在用户主目录中的 ~/.gconf/ 目录中,组织方式如上所述。实际值存储在那里的 %gconf.xml 文件中。

从 12.10 开始,这些插件以二进制形式存储在您的 ~/.config/dconf/user 文件中。dconf 或 gsettings 存储设置的方法较新。您可以使用 查看所有这些设置dconf dump /org/gnome/

Unityshell 就是这些插件之一。它使用 nux 项目作为嵌入式工具包。图像在具有指定透明度值的 3 维空间的纹理上绘制。这些图像由 compiz 处理并发送到 llvm 或高级图形驱动程序,以便系统计算机图形硬件上的图形引擎合成并渲染它们。通常,这与更传统的将图像直接渲染到帧缓冲区相反。这种复杂的事件链需要更高级的驱动程序,有时会导致在 Ubuntu 中使用专有图形驱动程序。

相关内容