用户工具

站点工具


doc:x:xorg_xdm_custom

客制化 x11/xdm 登入画面

本文版本 2.0

  • 2012 May 22 v2.0 加入 shutdown / reboot 按键
  • 2011 Oct 30 v1.1 客制化 xdm login 外貌(颜色,logo 图示,墙纸)

本文适用范围

  1. 仅限於启动本地主机的 X server,没有提及登入远端 X server
  2. 仅介绍涉及 xdm 登入画面有关设定文件,没有完整描述 xdm 所有的功能设定
  3. 笔记形式,仅记录过程,不太深入解释每一步的意义

参考资料

  1. man xdm

为何用 xdm ?

我不用任何 gnome/kde/xfce/lxde

xdm 的缺点

FreeBSD port 中的 xdm 不支援 unicode,登入画面无法秀中文字

安装所需要的 ports

1x11/xorg 必需
2x11/xdm 必需
3graphics/xli 必需
4lang/tcl85 必需
5x11-toolkits/tk85 必需
6x11/xconsole 选项

安装 x11/xorg

# cd /usr/ports/x11/xorg
# su root
% make install
% make clean
% exit

安装 x11/xdm

# cd /usr/ports/x11/xdm
# su root
% make install
% make clean
% exit

安装 graphics/xli(秀 wallpaper 软件)

# cd /usr/ports/graphics/xli
# su root
% make install
% make clean
% exit

安装 lang/tcl85

# cd /usr/ports/lang/tcl85
# su root
% make install
% make clean
% exit

安装 x11-toolkits/tk85

# cd /usr/ports/x11-toolkits/tk85
# su root
% make install
% make clean
% exit

安装 x11/xconsole

# cd /usr/ports/x11/xconsole
# su root
% make install
% make clean
% exit

了解 FreeBSD 由启动至 xdm 登入画面的流程

次序默认配置文件位置 描述
1/etc/tty 每次启动 FreeBSD 是否使用 xdm 是取决於 tty 有关 ttyv8 的设定
2/usr/local/lib/X11/xdm/xdm-config xdm 默认总配置文件,这个文件详细定义 xdm 执行时,每个阶段到那里读取相应的配置文件
3/usr/local/lib/X11/xdm/Xsetup_0 xdm 本地 X Server 默认配置文件,定义本地 X Server 启动时自动执行的内容,是一个 sh 手稿
4/usr/local/lib/X11/xdm/Xresources xdm 默认的资源配置文件,定义了默认的 xdm 登入画面外貌
5/usr/local/lib/X11/xdm/Xstartup_0 xdm 本地 X Server 默认登入配置文件,定义用户成功登入本地 X Server 后,未进入 用户 session 前,会自动执行的内容,是一个 sh 手稿

因此,想打造一个客制化的 xdm 登入画面,只少需要更改以上 5 个配置文件的内容

我如何打造一个客制化的 xdm 画面?

我的原则是,避免更动 x11/xdm 默认文件位置和内容,避免日后更新 x11/xdm 时误删我自己的客制化内容。因此,我先把 x11/xdm 默认配置文件拷贝至专用目录,执行 xdm 时引渡她读取专用目录内的客制化配置文件。

产生一个专用目录

# su root
% mkdir -p /usr/local/custom_etc/xdm
% mkdir /usr/local/custom_etc/xdm/wallpapers
% mkdir /usr/local/custom_etc/xdm/pixmaps
% exit

以上命令的目的是,产生一个专用目录来放置客制的配置文件,避免修改 ports 的默认值。不放置在 /usr/local/etc 内只是我个人喜好,不是强制规定。

拷贝一份 x11/xdm port 的默认配置文件入专用目录,预备修改

# su root
% cd /usr/local/custom_etc/xdm
% cp /usr/local/lib/X11/xdm/xdm-config .
% cp /usr/local/lib/X11/xdm/Xsetup_0 .
% cp /usr/local/lib/X11/xdm/Xresources .
% cp /usr/local/lib/X11/xdm/Xstartup_0 .
% exit

拷贝 FreeBSD icon 入专用目录,以备 xdm 使用

FreeBSD logo icon (需要 .xpm 格式) 可以从网上抓取,然后拷贝为 /usr/local/custom_etc/xdm/pixmaps/freebsd_icon.xpm

拷贝 FreeBSD wallpaper 入专用目录,以备 xdm 使用

Wallpaper (.jpg 格式) 更换你喜欢的,然后拷贝为 /usr/local/custom_etc/xdm/wallpapers/freebsd_wallpaper.jpg

改名 xdm-config 为 custom-xdm-config

# su root
% cd /usr/local/custom_etc/xdm
% mv xdm-config custom-xdm-config
% exit

修改 /usr/local/custom_etc/xdm/custom-xdm-config 内容

这个配置文件内容,主要是指示 xdm 到那里找相对应的文件处理特定的环节,由于我更动了客制配置文件的位置,因此修改的内容主要是改动对应的路径,以下是这个文件的全文:(其中以 ! 为首的行被视为注解)

custom-xdm-config
!
DisplayManager.daemonMode:      false
!
DisplayManager*userPath:        /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
!
DisplayManager*systemPath:      /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
!
DisplayManager*systemShell:     /bin/sh
!
DisplayManager*failsafeClient:  /usr/local/bin/xterm
!
DisplayManager.authDir:         /var/lib/xdm
DisplayManager.errorLogFile:    /var/log/xdm.log
DisplayManager.pidFile:         /var/run/xdm.pid
DisplayManager.keyFile:         /usr/local/lib/X11/xdm/xdm-keys
DisplayManager.servers:         /usr/local/lib/X11/xdm/Xservers
DisplayManager.accessFile:      /usr/local/lib/X11/xdm/Xaccess
DisplayManager*resources:       /usr/local/custom_etc/xdm/Xresources
DisplayManager.willing:         su -m nobody -c /usr/local/lib/X11/xdm/Xwilling
!
! All displays should use authorization, but we cannot be sure
! X terminals may not be configured that way, so they will require
! individual resource settings.
DisplayManager._0.authorize:    true
DisplayManager*authorize:       false
!
DisplayManager*chooser:         /usr/local/lib/X11/xdm/chooser
DisplayManager*startup:         /usr/local/lib/X11/xdm/Xstartup
DisplayManager*session:         /usr/local/lib/X11/xdm/Xsession
DisplayManager.keyFile:         /usr/local/lib/X11/xdm/xdm-keys
DisplayManager.servers:         /usr/local/lib/X11/xdm/Xservers
DisplayManager.accessFile:      /usr/local/lib/X11/xdm/Xaccess
DisplayManager*resources:       /usr/local/custom_etc/xdm/Xresources
DisplayManager.willing:         su -m nobody -c /usr/local/lib/X11/xdm/Xwilling
!
! All displays should use authorization, but we cannot be sure
! X terminals may not be configured that way, so they will require
! individual resource settings.
DisplayManager._0.authorize:    true
DisplayManager*authorize:       false
!
DisplayManager*chooser:         /usr/local/lib/X11/xdm/chooser
DisplayManager*startup:         /usr/local/lib/X11/xdm/Xstartup
DisplayManager*session:         /usr/local/lib/X11/xdm/Xsession
DisplayManager*reset:           /usr/local/lib/X11/xdm/Xreset
DisplayManager*authComplain:    true
!
! The following three resources set up display :0 as the console.
DisplayManager._0.setup:        /usr/local/custom_etc/xdm/Xsetup_0
!DisplayManager._0.startup:     /usr/local/lib/X11/xdm/GiveConsole
DisplayManager._0.startup:      /usr/local/custom_etc/xdm/Xstartup_0
DisplayManager._0.reset:        /usr/local/lib/X11/xdm/TakeConsole
!
DisplayManager*loginmoveInterval:       10
!
! SECURITY: do not listen for XDMCP or Chooser requests
! Comment out this line if you want to manage X terminals with xdm
DisplayManager.requestPort:     0

修改 /usr/local/custom_etc/xdm/Xsetup_0

这个文件是指示每次 xdm 都必需要执行的动作,它是一个 sh 手稿命令文件,如果想替 xdm 改变 wallpaper 便需要修改这个文件内容。以下是我的 Xsetup_0 全文内容,我指示每次 xdm 都会秀一张指定 wallpaper 和 启动 xconsole 程式。请注意,所有程序必需要背景执行

Xsetup_0
#!/bin/sh
xconsole -geometry 480x100+0-0 -daemon -notify -verbose -fn fixed -exitOnFail &
/usr/local/bin/xsetbg -fork '/usr/local/custom_etc/xdm/wallpapers/freebsd_wallpaper.jpg' &

Xsetup_0 需要改变为可执行权限

# su root
% cd /usr/local/custom_etc/xdm
% chmod 500 Xsetup_0
% exit

修改 /usr/local/custom_etc/xdm/Xresources

这个文件是一个标準 X 的资源格式文件,每次 xdm 都会读取此文件,来规范 X 程式的行为。而此文件重点是规范登入对话盒的外观和行为。 以下是我的 Xresources 全文内容,每一项目的解释请自行阅读 man xdm。我的笔电解像度是 1366×768

注意:xdm 登入对话盒的资源名称是:xlogin.Login. 为首

Xresources
!
Xcursor.theme:                          whiteglass
!
xlogin.Login.width:                     600
xlogin.Login.height:                    200
xlogin.Login.x:                         350
xlogin.Login.y:                         250
!
xlogin.Login.foreground:                Black
xlogin.Login.background:                Lavender
xlogin.Login.hiColor:                   Ghost White
xlogin.Login.shdColor:                  Dim Gray
xlogin.Login.greetColor:                Midnight Blue
xlogin.Login.failColor:                 Red
!
xlogin.Login.face:                      Sans-12
xlogin.Login.greetFace:                 Sans-18:bold:italic
xlogin.Login.promptFace:                Sans-12:bold
xlogin.Login.failFace:                  Sans:bold
!
xlogin.Login.greeting:                  FreeBSD 9.0-STABLE Workstation
xlogin.Login.namePrompt:                Login:\040 
xlogin.Login.passwdPrompt:              Password:\040 
xlogin.Login.promptColor:               Red
xlogin.Login.changePasswdMessage:       Password Change Required
xlogin.Login.fail:                      Login incorrect
xlogin.Login.failTimeout:               10
xlogin.Login.logoFileName:              /usr/local/custom_etc/xdm/pixmaps/freebsd_icon.xpm
xlogin.Login.borderWidth:               7
xlogin.Login.logoPadding:               15
xlogin.Login.useShape:                  true
xlogin.Login.frameWidth:                3
xlogin.Login.innerFramesWidth:          2
xlogin.Login.sepWidth:                  0
xlogin.Login.allowRootLogin:            false
xlogin.Login.allowNullPasswd:           false
xlogin.Login.echoPasswd:                true
xlogin.Login.translations:              #override \
                                        Ctrl<Key>R: abort-display()\n\
                                        <Key>F1: set-session-argument(failsafe) finish-field()\n\
                                        <Key>Delete: delete-character()\n\
                                        <Key>Left: move-backward-character()\n\
                                        <Key>Right: move-forward-character()\n\
                                        <Key>Home: move-to-begining()\n\
                                        <Key>End: move-to-end()\n\
                                        Ctrl<Key>KP_Enter: set-session-argument(failsafe) finish-field()\n\
                                        <Key>KP_Enter: set-session-argument() finish-field()\n\
                                        Ctrl<Key>Return: set-session-argument(failsafe) finish-field()\n\
                                        <Key>Return: set-session-argument() finish-field()
!
XConsole.text.geometry: 480x100
XConsole.verbose:       true
XConsole*iconic:        true
XConsole*font:          fixed

修改 /etc/tty

引渡 FreeBSD 每次开电脑时会启动 xdm,并且指示 xdm 读入放置在 /usr/local/custom_etc/xdm/custom-xdm-config 文件。修改 /etc/tty 中有关 ttyv8 那一行,把这一行修改为以下:

修改前

#ttyv8  "/usr/local/bin/xdm -nodaemon xterm off secure

修改后

ttyv8   "/usr/local/bin/xdm -config /usr/local/custom_etc/xdm/custom-xdm-config" xterm on secure

基本完成

现在 FreeBSD 每次开机

  1. FreeBSD 根据 /etc/tty 启动 xdm,并读取 /usr/local/custom_etc/xdm/custom-xdm-config 为总配置文件
  2. /usr/local/custom_etc/xdm/custom-xdm-config 引渡 xdm 读取 /usr/local/custom_etc/xdm 下的 Xsetup_0, Xstartup_0 Xresources
  3. xdm 根据 /usr/local/custom_etc/xdm 下的 Xsetup_0, Xstartup_0 和 Xresources 秀出客制登入画面

如何在 xdm 画面中增加 shutdown / reboot 按键?

这部份是参考 neil on the web 介绍,并加上配合 FreeBSD port 环境的小改动而成。

重温 xdm 启动本地 X Server 过程

时序/usr/local/custom_etc/xdm/custom-xdm-config 内容 描述
1DisplayManager._0.setup: /usr/local/custom_etc/xdm/Xsetup_0 xdm 启动本地 X Server 时,会根据 DisplayManager._0.setup: 值,执行 /usr/local/custom_etc/xdm/Xsetup_0 手稿内容,并根据 Xresources 秀出 login 对话盒
2DisplayManager._0.startup: /usr/local/custom_etc/xdm/Xstartup_0 用户成功登入本地 X Server后,在未进入用户 session 前,xdm 会先执行 /usr/local/custom_etc/xdm/Xstartup_0 手稿内容

在 xdm 增添 reboot / shutdown 原理

时序文件 描述
1Xsetup_0 运用 tcl/tk 在规划 login 画面时,秀出 reboot / shutdown 按键
2Xstartup_0 用户成功登入后,在未进入用户 session 前,删除画面中的 reboot / shutdown 按键

因此,需要

  1. 写一个 tcl/tk 按键手稿
  2. 在 Xsetup_0 呼叫 tcl/tk reboot/shutdown 手稿,并记录它的 pid
  3. 在 Xstartup_0 捡揸 tcl/tk reboot/shutdown 的 pid,然后 kill 它,使画面中的 reboot/shutdown 消失

tcl/tk reboot / shutdown 按键手稿

把以下 tcl/tk 手稿储存为 /usr/local/custom_etc/xdm/xdmshutdown

xdmshutdown
#!/usr/local/bin/wish8.5
#
# NT 20 October 2002 - adapted/copied from various similar
# scripts dragged kicking and screaming from the bowels of the web:)
#
# 
proc shutdownf {} { exec /sbin/shutdown -p now  2>/dev/console >/dev/console }
 
proc rebootf {} { exec /sbin/shutdown -r now 2>/dev/console >/dev/console }
 
button .shutdown -text "Shutdown" -background Lavender -activebackground orange -width 25 -command shutdownf
 
button .reboot -text "Reboot" -background Lavender -activebackground orange -width 25 -command rebootf
 
pack .reboot -side top
pack .shutdown -side top

把 xdmshutdown 文件权限变成可执行

# cd /usr/local/custom_etc/xdm
# su root
% chmod 500 xdmshutdown

在 Xsetup_0 呼叫 tcl/tk reboot/shutdown 手稿,并把手稿的 pid 记录在 /var/run/xdmshutdown.pid 中

修改 Xsetup_0 如下

Xsetup_0
#!/bin/sh
# change wallpaper of xdm
/usr/local/bin/xsetbg -fork '/usr/local/custom_etc/xdm/wallpapers/a_freebsd_sakasa.jpg' &
 
# call xconsole
xconsole -geometry 480x100+0-0 -daemon -notify -verbose -fn fixed -exitOnFail &
 
# add tcl/tk shutdown / reboot button 
/usr/local/custom_etc/xdm/xdmshutdown -geometry 250x60+530+500 &
echo $! > /var/run/xdmshutdown.pid&

在 Xstartup_0 中删除 tcl/tk reboot/shutdown 按键

修改 Xstartup_0 如下

Xstartup_0
#!/bin/sh
# Assign ownership of the console to the invoking user
#
# By convention, both xconsole and xterm -C check that the
# console is owned by the invoking user and is readable before attaching
# the console output.  This way a random user can invoke xterm -C without
# causing serious grief.
#
chown $USER /dev/console
 
# delete tcl/tk reboot / shutdown button before enter user session
pid=$(cat /var/run/xdmshutdown.pid 2>/dev/null)
test "$pid" && kill -9 $pid 2>/dev/null

完成品截图

/data/vhosts/wiki-data/pages/doc/x/xorg_xdm_custom.txt · 最后更改: 2012/06/03 21:25 由 zeissoctopus