用户工具

站点工具


doc:x:xorg_xdm_custom

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
doc:x:xorg_xdm_custom [2012/05/22 02:49]
zeissoctopus [在 Xsetup_0 呼叫 tcl/tk reboot/shutdown 手稿,并把手稿的 pid 记录在 /var/run/xdmshutdown.pid 中]
doc:x:xorg_xdm_custom [2012/06/03 21:25] (当前版本)
zeissoctopus
行 1: 行 1:
 +=======客制化 x11/xdm 登入画面======
 +**本文版本 2.0**
 +  * 2012 May 22 v2.0 加入 shutdown / reboot 按键
 +  * 2011 Oct 30 v1.1 客制化 xdm login 外貌(颜色,logo 图示,墙纸)
 +
 +**本文适用范围**
 +  - 仅限於启动本地主机的 X server,没有提及登入远端 X server
 +  - 仅介绍涉及 xdm 登入画面有关设定文件,没有完整描述 xdm 所有的功能设定
 +  - 笔记形式,仅记录过程,不太深入解释每一步的意义
 +
 +**参考资料**
 +  - man xdm
 +  - [[http://​neilt.org/​computing/​xdmshutdownbutton.php|neil on the web 有关如何在 xdm 加入 shutdown/​reboot 功能]]
 +
 +=====为何用 xdm ?=====
 +我不用任何 gnome/​kde/​xfce/​lxde
 +=====xdm 的缺点======
 +FreeBSD port 中的 xdm 不支援 unicode,登入画面无法秀中文字
 +=====安装所需要的 ports=====
 +^  1|x11/​xorg ​ |必需 ​ |
 +^  2|x11/​xdm ​ |必需 ​ |
 +^  3|graphics/​xli ​ |必需 ​ |
 +^  4|lang/​tcl85 ​ |必需 ​ |
 +^  5|x11-toolkits/​tk85 ​ |必需 ​ |
 +^  6|x11/​xconsole ​ |选项 ​ |
 +
 +====安装 x11/​xorg====
 +<​code>​
 +# cd /​usr/​ports/​x11/​xorg
 +# su root
 +% make install
 +% make clean
 +% exit
 +</​code>​
 +====安装 x11/xdm====
 +<​code>​
 +# cd /​usr/​ports/​x11/​xdm
 +# su root
 +% make install
 +% make clean
 +% exit
 +</​code>​
 +====安装 graphics/​xli(秀 wallpaper 软件)====
 +<​code>​
 +# cd /​usr/​ports/​graphics/​xli
 +# su root
 +% make install
 +% make clean
 +% exit
 +</​code>​
 +====安装 lang/​tcl85====
 +<​code>​
 +# cd /​usr/​ports/​lang/​tcl85
 +# su root
 +% make install
 +% make clean
 +% exit
 +</​code>​
 +====安装 x11-toolkits/​tk85====
 +<​code>​
 +# cd /​usr/​ports/​x11-toolkits/​tk85
 +# su root
 +% make install
 +% make clean
 +% exit
 +</​code>​
 +====安装 x11/​xconsole====
 +<​code>​
 +# cd /​usr/​ports/​x11/​xconsole
 +# su root
 +% make install
 +% make clean
 +% exit
 +</​code>​
 +=====了解 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 时引渡她读取专用目录内的客制化配置文件。
 +====产生一个专用目录====
 +<​code>​
 +# su root
 +% mkdir -p /​usr/​local/​custom_etc/​xdm
 +% mkdir /​usr/​local/​custom_etc/​xdm/​wallpapers
 +% mkdir /​usr/​local/​custom_etc/​xdm/​pixmaps
 +% exit
 +</​code>​
 +以上命令的目的是,产生一个专用目录来放置客制的配置文件,避免修改 ports 的默认值。不放置在 /​usr/​local/​etc 内只是我个人喜好,不是强制规定。
 +====拷贝一份 x11/xdm port 的默认配置文件入专用目录,预备修改====
 +<​code>​
 +# 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
 +</​code>​
 +====拷贝 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====
 +<​code>​
 +# su root
 +% cd /​usr/​local/​custom_etc/​xdm
 +% mv xdm-config custom-xdm-config
 +% exit
 +</​code>​
 +====修改 /​usr/​local/​custom_etc/​xdm/​custom-xdm-config 内容====
 +这个配置文件内容,主要是指示 xdm 到那里找相对应的文件处理特定的环节,由于我更动了客制配置文件的位置,因此修改的内容主要是改动对应的路径,以下是这个文件的全文:(其中以 ! 为首的行被视为注解)
 +<file text 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
 +</​file>​
 +====修改 /​usr/​local/​custom_etc/​xdm/​Xsetup_0====
 +这个文件是指示每次 xdm 都必需要执行的动作,它是一个 sh 手稿命令文件,如果想替 xdm 改变 wallpaper 便需要修改这个文件内容。以下是我的 Xsetup_0 全文内容,我指示每次 xdm 都会秀一张指定 wallpaper 和 启动 xconsole 程式。请注意,所有程序必需要背景执行
 +<file text 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'​ &
 +</​file>​
 +Xsetup_0 需要改变为可执行权限
 +<​code>​
 +# su root
 +% cd /​usr/​local/​custom_etc/​xdm
 +% chmod 500 Xsetup_0
 +% exit
 +</​code>​
 +====修改 /​usr/​local/​custom_etc/​xdm/​Xresources====
 +这个文件是一个标準 X 的资源格式文件,每次 xdm 都会读取此文件,来规范 X 程式的行为。而此文件重点是规范登入对话盒的外观和行为。
 +以下是我的 Xresources 全文内容,每一项目的解释请自行阅读 man xdm。我的笔电解像度是 1366x768
 +
 +注意:xdm 登入对话盒的资源名称是:xlogin.Login. 为首
 +<file text 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
 +</​file>​
 +====修改 /​etc/​tty====
 +引渡 FreeBSD 每次开电脑时会启动 xdm,并且指示 xdm 读入放置在 /​usr/​local/​custom_etc/​xdm/​custom-xdm-config 文件。修改 /etc/tty 中有关 ttyv8 那一行,把这一行修改为以下:
 +
 +修改前
 +<​code>#​ttyv8 ​ "/​usr/​local/​bin/​xdm -nodaemon xterm off secure</​code>​
 +修改后
 +<​code>​ttyv8 ​  "/​usr/​local/​bin/​xdm -config /​usr/​local/​custom_etc/​xdm/​custom-xdm-config"​ xterm on secure</​code>​
 +====基本完成====
 +现在 FreeBSD 每次开机
 +  - FreeBSD 根据 /etc/tty 启动 xdm,并读取 /​usr/​local/​custom_etc/​xdm/​custom-xdm-config 为总配置文件
 +  - /​usr/​local/​custom_etc/​xdm/​custom-xdm-config 引渡 xdm 读取 /​usr/​local/​custom_etc/​xdm 下的 Xsetup_0, Xstartup_0 Xresources
 +  - xdm 根据 /​usr/​local/​custom_etc/​xdm 下的 Xsetup_0, Xstartup_0 和 Xresources 秀出客制登入画面
 +=====如何在 xdm 画面中增加 shutdown / reboot 按键?=====
 +这部份是参考 [[http://​neilt.org/​computing/​xdmshutdownbutton.php|neil on the web]] 介绍,并加上配合 FreeBSD port 环境的小改动而成。
 +====重温 xdm 启动本地 X Server 过程====
 +^  时序^/​usr/​local/​custom_etc/​xdm/​custom-xdm-config 内容 ​ ^描述 ​ ^
 +|  1|DisplayManager._0.setup:​ /​usr/​local/​custom_etc/​xdm/​Xsetup_0 ​ |xdm 启动本地 X Server 时,会根据 DisplayManager._0.setup:​ 值,执行 /​usr/​local/​custom_etc/​xdm/​Xsetup_0 手稿内容,并根据 Xresources 秀出 login 对话盒 ​ |
 +|  2|DisplayManager._0.startup: ​     /​usr/​local/​custom_etc/​xdm/​Xstartup_0 ​ |用户成功登入本地 X Server后,在未进入用户 session 前,xdm 会先执行 /​usr/​local/​custom_etc/​xdm/​Xstartup_0 手稿内容 ​ |
 +====在 xdm 增添 reboot / shutdown 原理====
 +^ 时序^文件 ​ ^描述 ​ ^
 +|  1|Xsetup_0 ​ |运用 tcl/tk 在规划 login 画面时,秀出 reboot / shutdown 按键 |
 +|  2|Xstartup_0 ​ |用户成功登入后,在未进入用户 session 前,删除画面中的 reboot / shutdown 按键 ​ |
 +因此,需要
 +  - 写一个 tcl/tk 按键手稿
 +  - 在 Xsetup_0 呼叫 tcl/tk reboot/​shutdown 手稿,并记录它的 pid
 +  - 在 Xstartup_0 捡揸 tcl/tk reboot/​shutdown 的 pid,然后 kill 它,使画面中的 reboot/​shutdown 消失
 +
 +====tcl/tk reboot / shutdown 按键手稿====
 +把以下 tcl/tk 手稿储存为 /​usr/​local/​custom_etc/​xdm/​xdmshutdown
 +<file text 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
 +</​file>​
 +把 xdmshutdown 文件权限变成可执行
 +<​code>​
 +# cd /​usr/​local/​custom_etc/​xdm
 +# su root
 +% chmod 500 xdmshutdown
 +</​code>​
 +====在 Xsetup_0 呼叫 tcl/tk reboot/​shutdown 手稿,并把手稿的 pid 记录在 /​var/​run/​xdmshutdown.pid 中====
 +修改 Xsetup_0 如下
 +<file text 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&​
 +</​file>​
 +====在 Xstartup_0 中删除 tcl/tk reboot/​shutdown 按键====
 +修改 Xstartup_0 如下
 +<file text 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
 +</​file>​
 +
 +=====完成品截图=====
 +{{:​doc:​x:​xdm_sc.png?​200|}}
  
/data/vhosts/wiki-data/pages/doc/x/xorg_xdm_custom.txt · 最后更改: 2012/06/03 21:25 由 zeissoctopus