solaris桌面登录详解
随着 Solaris 10 X86 版本的推出以及 OpenSolaris 社区的不断壮大,越来越多的人尝试着使用 Solaris,更有很多爱好者把 Solaris 做为日常的桌面系统来使用。而在使用 Solaris 作为桌面系统时,我们第一个要接触的就是桌面登录系统,本文将从 Solaris 桌面系统的登录的流程,主要程序,各种配置文件以及登录发生错误时如何来定位这些问题来做些阐述。
一. 桌面登录管理程序 Dtlogin
Solaris 采用 CDE(Common Desktop Environment)桌面系统中的登录管理程序 dtlogin 来管理桌面系统的登录。dtlogin 是一个守护进程,当其启动后,会产生一个主 dtlogin 进程,这个进程将负责:
监听远程登录请求;
为本地机器上的每一个显示(DISPLAY)启动 Xserver 和一个 dtlogin 子程序来进 行登录管理。
而每一个显示上的 dtlogin 子进程将负责:
启动进程 dtgreet 来显示图形登录界面;
等待用户输入用户名/密码后进行验证,验证成功后启动相应的桌面进程;
等待直到桌面进程退出,然后子 dtlogin 也退出把控制权交还给 dtlogin 主程序进行下一次的登录循环。
通过查看这些进程的继承关系,我们可以对 dtlogin 运行流程有个清晰的认识,下面将分四种情况来查看 dtlogin 的进程依赖关系,从而更好的理解 dtlogin 是如何工作的。
当系统启动后,图形登录界面出现时,此时系统中的 dtlogin 进程树关系为:
# ptree pgrep dtlogin
646 /usr/dt/bin/dtlogin -daemon
647 /usr/openwin/bin/fbconsole -n -d :0
648 /usr/openwin/bin/Xsun :0 -defdepth 24 -nobanner -auth /var/dt/A:0-RCaWq
681 /usr/dt/bin/dtlogin -daemon
837 dtgreet -display :0
从以上的进程树输出可以看出,主 dtlogin 程序首先启动了 fbconsole,这个进程用来将/dev/console 的输出重定向到 Xserver 中的 console 窗口;然后 dtlogin 根据 Xserver 的配置文件(/usr/dt/config/Xservers 或/etc/dt/config/Xservers)启动相应的 Xserver 进程,这里我们启动了Xsun;紧接着主 dtlogin 创建了一个子 dtlogin 进程,这个进程用来管理在显示 0 上的登录程序,然后其启动了 dtgreet 这个进程来显示出我们日常见到的登录界面。
2. 当我们登录系统后,dtgreet 就退出然后启动了相应的桌面程序,进程树的变化如下:
# ptree pgrep dtlogin
646 /usr/dt/bin/dtlogin -daemon
647 /usr/openwin/bin/fbconsole -n -d :0
648 /usr/openwin/bin/Xsun :0 -defdepth 24 -nobanner -auth /var/dt/A:0-RCaWq
681 /usr/dt/bin/dtlogin -daemon
954 /bin/ksh /usr/dt/bin/Xsession
993 sh /usr/bin/swupnot -wait
1137 sleep 1
1019 /usr/dt/bin/sdt_shell -c unset DT; DISPLAY=:0; /u
1022 -bash -c unset DT; DISPLAY=:0; /usr/dt/bin/dtse
1038 /bin/ksh /usr/dt/config/Xsession2.jds
1040 /usr/bin/gnome-session
1044 /usr/bin/ssh-agent -- /usr/bin/dbus-launch –exit-with-sess
从以上输出可以看出,子 dtlogin 管理了显示 0 之后的桌面登录流程,当用户认证成功后,dtgreet 就退出了,子 dtlogin 紧接着启动了脚本程序/usr/dt/bin/Xsession,在这个脚本里,将根据用户选择的桌面类型(CDE 或 JDS)来启动相应的脚本,从以上输出可以看到这里我们启动了 JDS 桌面,从而调用了脚本 Xsession2.jds,这个脚本里直接启动了 JDS 的桌面管理程序gnome-session,从而我们会看到熟悉的 JDS 桌面环境。注:当用户是第一次登录桌面系统,而且没有指定相应的桌面类型时,子 dtlogin 将不会调用脚本文件 Xsession,而是调用其他程序来让用户指定桌面类型从而启动相应的桌面程序。
3. 当用户退出桌面系统后,进程树的变化为:
# ptree pgrep dtlogin
646 /usr/dt/bin/dtlogin -daemon
647 /usr/openwin/bin/fbconsole -n -d :0
1514 /usr/openwin/bin/Xsun :0 -defdepth 24 -nobanner -auth /var/dt/A:0-RCaWq
1548 /usr/dt/bin/dtlogin -daemon
1559 dtgreet -display :0
当用户从桌面中退出后,我们会又一次看到登录界面,但我们从上面的进程树的情况可以看到,这里,当我们从桌面退出后, X server 和子 dtlogin 也相应退出,主 dtlogin 就会重新创建新的 Xserver 和新的子 dtlogin 进程来进行下一次的桌面登录管理,从而进行新的一次登录循环
4. 有 XDMCP 请求下的进程树情况:
#ptree pgrep dtlogin
646 /usr/dt/bin/dtlogin -daemon
14245 /usr/openwin/bin/fbconsole -n -d :0
14300 /usr/openwin/bin/Xsun :0 -defdepth 24 -nobanner -auth /var/dt/A:0-RCaWq
14324 /usr/dt/bin/dtlogin -daemon
14342 /bin/ksh /usr/dt/bin/Xsession
14405 /usr/dt/bin/sdt_shell -c unset DT; DISPLAY=:0; /u
14407 -bash -c unset DT; DISPLAY=:0; /usr/dt/bin/dtse
14423 /bin/ksh /usr/dt/config/Xsession2.jds
14425 /usr/bin/gnome-session
14429 /usr/bin/ssh-agent -- /usr/bin/dbus-launch --exit-with-sess
7918 /usr/dt/bin/dtlogin -daemon
7948 /bin/ksh /usr/dt/bin/Xsession
7986 sh /usr/bin/swupnot -wait
7992 sleep 20
8012 /usr/dt/bin/sdt_shell -c unset DT; DISPLAY=dhcp-215-212:
8015 -bash -c unset DT; DISPLAY=dhcp-215-212:0; /usr
8031 /bin/ksh /usr/dt/config/Xsession2.jds
8033 /usr/bin/gnome-session
8037 /usr/bin/ssh-agent -- /usr/bin/dbus-launch --exit-with-sess
以上的情况是当有远程系统通过 XDMCP(X Display Manager Control Protocol) 协议来登录时,主 dtlogin 会起一个子 dtlogin 来处理相应的登录事项,但注意此时不需要为远程机器启动 Xserver,因为远程机器上会有自己的 Xserver,然后子 dtlogin 根据相应的显示(这里是 DISPLAY=dhcp-215-212:0)来做相应的图形登录管理。
从以上四种情况可以看出,dtlogin 做为图形登录管理守护进程,将会为每一个显示(DISPLAY)来启动一个子 dtlogin 来管理桌面登录,而对每个本地的显示还将启动相应的Xserver,在整个桌面登录的生命周期里,子 dtlogin 将一直负责后台的工作,所以,要对Solaris 的登录系统有所了解,就需要对 dtlogin 有更深入的了解,下面我们就从 dtlogin 的管理,配置来进行进一步的阐述。
二. dtlogin 的管理
从以上的介绍可以看出,dtlogin 是整个桌面登录的关键程序,我们需要对如何进行dtlogin 管理有个很好的认识,尤其是在 Solaris 10 中,由于 SMF(Service ManagementFacility)框架的引入,对 dtlogin 的管理方法上有所变化,具体如下列所示:
1. 允许/禁止 dtlogin 守护进程
我们可以用脚本文件 dtconfig 来允许/禁止 dtlogin,如下命令:
/usr/dt/bin/dtconfig -e
/usr/dt/bin/dtconfig -d
其中 dtconfig 是一个脚本文件,以上的命令在 Solaris10 和以前的 Solaris 版本中是一样的,只不过在具体实现上,Solaris 10 的 dtconfig 中采用了 SMF 的命令。
2,启动/停止 dtlogin 进程
而对于启动/停止 dtlogin 守护进程,还是有不小的区别,对于 Solaris 9 或之前的版本,采用传统的停止守护进程的方式即可:
/etc/init.d/dtlogin start
/etc/init.d/dtlogin stop
对于 Solaris 10,我们要采用 SMF 的命令来做:
/usr/sbin/svcadm enable -t svc:/application/graphical-login/cde-login:default
为了简单起见,以上的命令可以简写为
/usr/sbin/svcadm enable -t cde-login
/usr/sbin/svcadm disable -t cde-login
3. dtlogin 的启动参数
dtlogin 启动是可以带一些参数来进行定制化,比如我们想打印出 dtlogin 的调试信息来分析时,就需要加相应的参数,设置 dtlogin 的启动参数在不同的 Solaris 版本中也是不一样的,这里我们以打开调试选项作为例子来做说明:
在 Solaris 9 或之前的版本,如果需要把 dtlogin 的调试开关打开并将调试信息输出到文件中去,需 要编辑文件/etc/init.d/dtlogin,把其中一行
/usr/dt/bin/dtlogin -daemon &
修改为
/usr/dt/bin/dtlogin -daemon -debug 16 > /tmp/dtlogin.log 2>&1 &
而在 Solaris 10 中,我们就不能直接改文件了,需要用 SMF 的命令来配置 dtlogin 这个服务的属性来得到调试日志,具体步骤如下:
# svccfg
# svc:> select application/graphical-login/cde-login
# svc:/application/graphical-login/cde-login> setprop dtlogin/debug_level = "16"
# svc:/application/graphical-login/cde-login> setprop dtlogin/debug_log = "/tmp/dtlogin.log"
# svc:/application/graphical-login/cde-login> exit
三. Dtlogin 的资源文件
Dtlogin 的整个运行中,牵扯到很多的资源文件,缺省状态下,这些资源文件全部放在/usr/dt/config 目录下,其中重要的资源文件有:
Xconfig: 指定 dtlogin 的其他配置文件和缺省配置
Xaccess: dtlogin 用这个文件来进行远程 XDMCP 请求的控制
Xservers: 列出需要启动 Xserver 的显示列表和 Xserver 启动选项
Xresources: 包含在登录界面显示的各个资源定义
Xsetup: 在显示登录界面前运行的一个脚本,主要是为相应的 locale 添加字体资源
Xstartup:在用户身份认证成功后执行的脚本
Xreset:当用户从桌面登出时运行的脚本
以上这些资源配置文件可以进行定制化,可以把定制后的文件放在目录/etc/dt/config 下面,这 样我们就有了自己的配置选项,具体的资源文件以及各个文件包含的配置选项可以参见 dtlogin(1X)帮助文件,帮助中对这些资源文件和配置进行了很详细的解释。
四. 桌面登录程序的日志文件
1. Xserver 的日志文件
当 Xserver 发生错误时,它会将错误信息放在/var/dt/Xerrors 中,当登录或图形显示失败时,我 们可以查看这个文件来确定 Xserver 是否发生错误。
2. dtlogin 调试信息
通过用前一章节介绍的方法来开启 dtlogin 的调试选项,我们可以得到 dtlogin 的调试信息。
3. startlog 和 errlog
我们知道,当用户身份验证成功后,dtlogin 将调用脚本文件/usr/dt/bin/Xsession 来启动相应的桌面环境,而 Xsession 的运行情况也将被记录下来,我们可以在下列文件中找到Xsession 的日志
$HOME/.dt/startlog
$HOME/.dt/startlog.old
$HOME/.dt/startlog.older
其中 startlog 是最近一次登录的日志,而其他两个是上一次和两次登录的日志,从这里我们可以查看到具体的桌面启动过程,一个成功的登录后,这个日志文件内容常为:
--- /usr/dt/bin/Xsession starting...
--- starting /bin/true
--- Xsession started by ctrun
--- setting font path...
--- starting /usr/dt/bin/dtsession_res -load -system
--- sourcing //.dtprofile...
--- sourcing /usr/dt/config/Xsession.d/0010.dtpaths...
--- sourcing /usr/dt/config/Xsession.d/0015.sun.env...
--- sourcing /usr/dt/config/Xsession.d/0020.dtims...
--- sourcing /usr/dt/config/Xsession.d/0030.dttmpdir...
--- sourcing /usr/dt/config/Xsession.d/0040.xmbind...
--- starting /usr/dt/bin/dtsearchpath
--- starting /usr/dt/bin/dtappgather &
--- starting /usr/dt/bin/dsdm &
--- session log file is /dev/null
--- DTSOURCEPROFILE is true (see //.dtprofile)
--- execing /usr/dt/config/Xsession2.jds with a /sbin/sh login shell ...
--- starting desktop on /dev/pts/1
4. 桌面进程管理程序日志文件
从第一节我们知道,Xsession 运行完后,最终将运行桌面的程序管理程序,即 dtsession(CDE)或 gnome-session(JDS),缺省状况下,这些程序将日志文件输出到/dev/null,需要手工打开日志开关,如下:
编辑$HOME/.dtprofile 并删除行
export dtstart_sessionlogfile="/dev/null"
这样,我们就可以在$HOME/.dt/sessionlogs/目录中找到相应的日志文件.
五. 常见错误和解决方法
有时候我们在图形登录的时候会遇到问题,下面我们就可能发生的情况做些具体分析:
1. 当系统启动后不能进入图形界面时,我们可以做以下分析:
A. 查看 dtlogin 这个进程是否存在,如果不存在,先要尝试重起这个服务,具体方法前面的章节有介绍,如果重起 dtlogin 服务失败后,我们就需要打开 dtlogin 的调试开关,从dtlogin 的调试日志中去查找原因。
B. 当 dtlogin 这个进程存在,但屏幕闪烁几次后退到 console 登录的状态,很可能是Xserver 启动时发生了问题,需要我们查看日志文件/var/dt/Xerrors 以确保 Xserver 能正常启动。
2. 输入用户名,密码,认证成功后不能进入桌面系统
当用户身份认证成功后,如果不能进入桌面系统而退回到登录界面,我们需要查看:
A. 首先我们要排除在用户上的一些限制的错误,可能的错误有:
用户的额定磁盘空间已经满了
用户对$HOME/.TTauthority 有没有读/写权限
用户配置的.profile 或其他的在 login 执行的文件写法有误
B. 需要查看 Xsession 的运行日志 startlog 以确认 Xsession 运行正常
C. 查看桌面进程管理程序的日志来看看是否有在运行桌面程序管理器时发生了什么问题
D. 如果是登录 CDE 桌面,一些登录的问题会牵扯到进程 ttsession(tooltalk session manager),这个进程是用来在各个 CDE 应用程序间进行消息传递,这个程序的一部分错误信息会写在/var/adm/messages 下,所以在这种情况下,我们要综合/var/adm/messages,/var/dt/Xerrors 以及$HOME/.dt/startlog 来判断是否是 ttsession 的问题。
3. 不能退出桌面环境
如果我们不能正常退出桌面环境时,我们需要查看一下 ttsession 这个进程是否还存活,因为退出桌面这个命令是需要 ttsession 传达到桌面进程管理程序 dtsession 的。
4. 远程图形登录不能成功
当我们从远程用 Xmanager 或从另一台 Solaris/Linux 机器来图形登录 Solaris 服务器失败时,需要我们检查以下设置:
A. Solaris 服务器上的 dtlogin 主进程是否存在,因为 dtlogin 是提供 XDMCP 服务的程序,当 dtlogin 这个服务没有被允许或运行,我们需要手工的启动这个服务。
B. 如果 dtlogin 这个服务运行正常,是否我们对远程图形登录做了限制,我们就需要检查配置文件 Xaccess 来看看是否允许 XDMCP 请求。
六. 参考文档:
1. Solaris Common Desktop Environment: Advanced User s and System Administrator s Guide
2. Dtlogin(1X) 帮助