我登录并启动 Unity 或其他图形用户界面后会发生什么?

Joh*_*ber 56 unity lightdm gnome-session

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

Joh*_*ber 87

如何使用 Ubuntu 12.04-14.04 启动桌面用户 GUI 会话

这是事件链:

Ubuntu Linux 内核和新贵

内核将 init 进程作为进程号 1 启动。这是 Ubuntu 12.04 的新贵。

新贵的工作在 /etc/init/


手册页: man init

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

来源: /etc/init/lightdm.conf


新贵作业执行/usr/sbin/lightdmsystemd随着时间的推移,我们可能会期望将其转换为服务单元。

轻量级


手册页:man lightdm ,另外:Ubuntu Wiki: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
Run Code Online (Sandbox Code Playgroud)

资料来源:man lightdm/var/log/lightdm/lightdm.log


lightdm get 在 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 上的帐户服务帐户守护程序获取的。

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
Run Code Online (Sandbox Code Playgroud)

或者

[Desktop]
Session=awesome
Run Code Online (Sandbox Code Playgroud)

.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
Run Code Online (Sandbox Code Playgroud)

/usr/sbin/lightdm-sessionshell脚本运行的论据g ^ nome-session --session=ubuntu (原文如此.--“Ubuntu的”,而不是“统一”)

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,则对任何现有/etc/X11/Xmodmap$HOME/.Xmodmap

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

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

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

ssh-agent 可以保留会话的 ssh 密钥,如果它们在会话期间被 ssh-add 了一段时间,但是 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检查该变量,如果 set 替代设置init --user 为 的其他项目$STARTUP。因此,用户模式 ​​upstart 在/usr/share/upstart/sessions. 其中之一是gnome-session.conf启动gnome-session。

除非已经做了,最后 lightdm-session 启动一个窗口管理器,或者为了统一,上面启动 gnome-session 会话管理器。

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

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


手册页: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
Run Code Online (Sandbox Code Playgroud)

另一个,/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
Run Code Online (Sandbox Code Playgroud)

如您所见,该条目只是导致执行了很棒的窗口管理器。它读取自己的配置文件,包括来自 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
Run Code Online (Sandbox Code Playgroud)

这将启动 /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
Run Code Online (Sandbox Code Playgroud)

12.04中gnome-session运行的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
Run Code Online (Sandbox Code Playgroud)

对于 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 更改它们。插件设置存储在 active_plugins 下的 apps/compiz-1/general/screen0/options 中。重复导致我在 compiz 中出现段错误。这些存储在用户主目录中的 ~/.gconf/ 目录中,如上组织。实际值存储在 %gconf.xml 文件中。

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

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