绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
GDM图形界面登录整体流程分析
2022-05-26 16:28:32

在我们的 /etc/inittab 的后一行是

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon



这个 prefdm 是什么呢?从文件名我们可以看出是 “Preferred Display Manager” 的缩写。

前面的 Preferred 是什么意思呢?就是“被选择/喜欢的”的意思。那如何体现这个选择的功能呢?

下面就让我们来分析这个 shell script (没错,它是一个脚本)

[code]
#!/bin/sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin  # 注释 :设置 PATH 变量

# shut down any graphical boot that might exist # 注释 :关闭任何图形界面引导程序

if [ -x /usr/bin/rhgb-client ]; then   # 注释 :如果存在该文件且可执行,
    /usr/bin/rhgb-client -quit         # 则执行该命令,并带 -quit 选项
fi

# 补充 :在 RHEL4 中,次安装后会出现一个蓝色的进度条,点击它就可以看到

# 平时的那些启动服务的信息,这个就是由上面的 rhgb-client 命令提供的,

# 而这个命令是由 /etc/rc.d/rc.sysinit 启动的


# We need to source this so that the login screens get translated

[ -f /etc/profile.d/lang.sh ] && . /etc/profile.d/lang.sh

# 注释 : 上面的命令判断是否存在该脚本,是则执行它。

# 该脚本的功能是用于设置登录界面的语言,同样不太长,74 行而已,可以自行分析


# Run preferred X display manager


# 注释 :下面就是重头戏了,启动之前设定的 Display Manager ,

# 显示登录对话框


preferred=                              # 注释 :该变量的值首先置空
if [ -f /etc/sysconfig/desktop ]; then   # 注释 :如果存在 desktop 文件,则执行它
        . /etc/sysconfig/desktop         # 该文件只有1行,就是 DESKTOP=XXX
        if [ "$DISPLAYMANAGER" = GNOME ]; then   # 很明显,下面这些语句都不会被
                preferred=gdm                    # 执行,因为 DISPLAYMANAGER
        elif [ "$DISPLAYMANAGER" = KDE ]; then   # 变量并没有定义,所以为空
                preferred=kdm
        elif [ "$DISPLAYMANAGER" = XDM ]; then
                preferred=xdm
        fi
fi

shopt -s execfail

# 注释 :shopt 是 shell 的一个内置命令,-s execfail

# 表示启用  ExecFail 功能,它表示如果下面的 exec 命令失败,不会退出非交互式 shell

# 在这里给出它的简单解释 :

#               execfail
                      If set, a non-interactive shell will not exit if it can-
                      not execute the file specified as  an  argument  to  the
                      exec  builtin  command.   An  interactive shell does not
                      exit if exec fails.


[ -n "$preferred" ] && exec $preferred $* >/dev/null 2>&1

# 注释 :如果 preferred 变量的值不为空,则使用执行的 Display Mananger

# 并用它的代码覆盖当前 non-interactive shell 的代码

# 基于上面的 desktop 文件的内容,这句话是不会被执行的。



# Fallbacks, in order

# 注释 :既然不执行上面的命令,那么总得启动一个 Display Manager 了吧,

# 所以下面依次查功能是 gdm、kdm、xdm

exec gdm $* >/dev/null 2>&1
exec kdm $* >/dev/null 2>&1
exec xdm $* >/dev/null 2>&1

# catch all exit error

# 注释 :要注意,当你退出 GDM 后者 KDM 时,并不会执行下面的 exit 命令,

# 只有在上面的3个exec 命令都执行失败才会执行下面的 exit 1


exit 1
[/code]

前面我们提到了 /etc/sysconfig/desktop 文件,下面我们就修改它来实现默认为 KDE 或者 XDM

1、修改 /etc/sysconfig/desktop 文件

[code]
[root@dhcp-client ~]# cat /etc/sysconfig/desktop
DESKTOP="GNOME"
DISPLAYMANAGER="XDM"
[root@dhcp-client ~]
[/code]

2、重启。为什么需要重启呢?因为在 /etc/inittab 中,在 x:5:respawn:/etc/X11/prefdm -nodaemon 这句中,respawn  的作用就是 prefdm 一旦退出,

    init 立即再执行一个 /etc/X11/prefdm -nodaemon 。也就是说,一旦退出该程序,init 立马会重新执行 prefdm ,所以你才能在“注销”后又再次看

   到“图形登录界面”。所以记得要重启哦

3、重启,现在你看到的就是 XDM 的登录界面了,一个黑黑的屏幕,中间是灰色的窗口,和 Solaris

     或者 AIX 的 CDE 界面很象,但和 GDM/KDM 不同的是,它不允许你选择语言

4、同样道理,你可以修改 DISPLAYMANAGER="KDE",则默认启动 KDM

5、经过测试发现,DESKTOP 和 DISPLAYMANAGER 可以不同,因为两者并不是必须对应的。

   在上面的例子中,登录窗口是 XDM ,但进入后是 GNOME 的环境。同样你可以定义登录

   界面为 GNOME (DISPLAYMANAGER=‘GNOME"),但桌面环境为 KDE(DESKTOP="KDE")。

   是不是很有趣呢?

分享好友

分享这个小栈给你的朋友们,一起进步吧。

GDM
创建时间:2022-04-19 11:12:50
GDM
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~