当前位置: 首页>>技术教程>>正文


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

, , ,

问题描述

当出现问题时,理解在用户签署GUI会话并让Unity(或其他窗口管理器)启动桌面时会发生什么事情可能会很好。

最佳解决办法

如何使用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服务单元。

Lightdm


手册页: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

资料来源: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是重要的功能,特别是对于高级高性能图形。日志在/var/log/Xorg.0.log中存储为X.

系统dbus上有关于此”seat”的通信,并且可能获得用户名。 lightdm使用X来绘制屏幕。 unity-greeter用于协助该过程。

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

lightdm得到了来自/usr/share/xsessions/*.desktop的潜在window-managers /系统的名称。

帐户信息通过客户服务accounts-daemon通过dbus获取。

lightdm和greeter使用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

来自/usr/share/xsessions/*.desktop.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

/usr/sbin/lightdm-session shell脚本使用参数g nome-session --session=ubuntu(sic .– ‘ubuntu’,而不是’unity’)运行

lightdm-session


日志:?错误日志:~/.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加载资源(如果存在),使用/etc/X11/Xkbmap$HOME/.Xkbmap的内容加载带有setxbmap的键盘映射;

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

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

  • 使用/etc/X11/Xsession.options中的选项在/etc/X11/Xsession.d/*中运行Xsession脚本。其中一个启动ssh-agent(冗余),另一个执行$HOME/.xsessionrc。另一个启动session-dbus(上述Xsession.options文件中允许的ssh-agent和session-dbus)。此会话dbus对于有关此单个用户会话的进程之间的通信非常有用。

如果ssh-agent在会话期间的某个时间进行了ssh-add编辑,则它可以保留会话的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将变量UPSTART设置为1/etc/X11/Xsession.d/99upstart检查该变量,如果设置,则将init --user替换为设置为$STARTUP的其他项目。因此,user-mode 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认为它是session-wrapper。

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

另一个是/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包中读取自己的配置文件,包括/etc/xdg/awesome/rc.lua。它可以配置$ HOME /.config /awesome /rc.lua。

Unity


来源:配置文件检查


这是/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是否运行。如果它犯了一个错误,说团结可以运行而且不能,那就有麻烦了。如果发生这种情况,请在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以运行窗口管理器和任何面板。

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中使用专有的图形驱动程序。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1358.html,未经允许,请勿转载。