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


55

遇到问题时,最好了解一下幕后发生的事情,以便使用户登录到GUI会话并获得Unity(或其他窗口管理器)启动桌面。

Answers:


86

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

这是事件链:

Ubuntu Linux内核和新贵

内核以进程号1启动初始化进程。这是Ubuntu 12.04的新贵。

新贵职位在 /etc/init/


手册页: man init

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

资源: /etc/init/lightdm.conf


新贵作业将执行/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在初始化过程中起步很晚;例如,系统dbus必须已经启动,文件系统必须准备好,图形显示系统必须准备好。

lightdm创建一个xauthority文件,然后启动X,在VT 7(即您按Alt+ Ctrl+时获得的虚拟终端)上启动它F7。当X启动时,lightdm发出信号,要求Plymouth启动屏幕程序退出。必须在所有tty(1-6)启动之后进行此操作。

自2013年7月起,mird支持项已添加到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

/usr/sbin/lightdm-sessionshell脚本的论据摹运行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-add将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检查该变量,并检查set是否替代设置init --user 为的其他项$STARTUP。因此,用户模式新贵会在中启动这些新贵工作/usr/share/upstart/sessions。其中之一就是gnome-session.conf启动gnome会话。

除非已经完成,否则最后lightdm-session将启动一个窗口管理器,或者为统一起见,以上将启动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,但默认情况下不用于超赞。请参阅上面的.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

如您所见,该条目仅导致执行出色的窗口管理器。它从真棒包中读取自己的配置文件,包括/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

由12.04中的gnome-session运行的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必须启动settings守护程序,并为了运行窗口管理器和任何面板而启动compiz。

Compiz


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


一旦启动compiz,它将运行各种插件。在12.10之前的版本中,使用gnome设置来定义这些设置。可以使用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中使用专有的图形驱动程序。


如何判断我的系统运行的是Awesome,Unity还是compiz?
詹姆斯

@james您可能可以在进程列表中检查compiz或真棒。您可以使用诸如此类的命令来获得该信息ps aux。您也可以在文件〜/ .dmrc中查看Session参数cat ~/.dmrc。往上看。会话=的ubuntu意味着您在使用Compiz的团结在一起(这是默认的。
约翰·格鲁伯小号

出色的答案,无需任何先决知识即可很好地掌握流程!按照您的描述,我试图xsessions/ubuntu.desktop在另一个文件中复制,并希望以相同的行为结束,但没有成功(此问题中的更多详细信息)。默认的ubuntu.desktopxsession 有什么特别之处吗?
广告N

确实,如果可以的话,会增加+10。比医生还好...
戒指Ø17年

感谢您写下来。您能否更新最新的Ubuntu版本的情况?
exic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.