FreeBSD连载(49):进入X Window
X服务器的执行程序位于/usr/X11R6/bin目录中,并且使用一个符号联接 “X” ,指向具体的执行程序,如XF86_VGA16或XF86_S3V等。因此直接输入X命令就能启动设置好的X服务器,系统将进入图形状态,并出现一个可以移动的X形鼠标指针,但并没有其他反应。这是因为X服务器只负责处理输入和显示,具体对使用者的输入进行处理则由其他X客户负责,而直接启动X服务器没有启动任何X客户,因而不能处理用户的任何输入。
手工启动X Window
因此为了利用图形界面的处理能力,在启动X服务器的同时还应该启动X客户程序来负责回应用户的输入。这个任务可以通过shell程序startx或xinit来作到,这两个程序能在启动X的同时,启动X Window的窗口管理程序和其他X程序。
startx和xinit缺省查看使用者个人目录下的.xinitrc文件,在这个文件内应该包含启动各个X客户程序的命令。最简单的.xinitrc可能只包含一个命令来启动一个仿真终端xterm,也可以包含一系列命令来启动多个程序,创建出漂亮的X环境。想自己定制X Window操作环境的使用者可以手工创建和修改这个文件,以得到不同的用户界面。
xmodmap -e 'keysym Alt_L = Meta_L Meta_L'xterm &xearth &twm在这个例子中执行了 xmodmap用于修改X的键盘定义,然后在后台执行xterm提供一个仿真终端,执行xearth设置X Window的背景,最后在前台执行一个简单的窗口管理器twm。窗口管理器被放到前台执行,这样当退出窗口管理器时将退出整个X服务器的执行。
缺省情况下,用户并没有创建这个.xinitrc文件,这样xinit命令就只能启动一个xterm终端仿真程序,而没有执行任何其他的X程序,也没有执行窗口管理器。因此,直接使用xinit启动的X Window仅仅具备一个终端窗口,将鼠标移动到它上面之后,才能输入命令执行其他操作。用户如果想要启动窗口管理器或其他程序,必须在终端窗口中输入相应的命令。
由于X Window中存在多个窗口,但只有一个称为 “焦点” 的窗口才能接收输入。X Window缺省使用鼠标的位置来选择输入焦点窗口,当然另一些窗口管理器也可以通过键盘来切换输入焦点窗口。
但是即使不存在.xinitrc文件,使用startx也能启动窗口管理器和几个X客户程序,这是由于startx发现用户个人目录下不存在.xinitrc文件之后,就使用系统中的/usr/X11R6/lib/X11/xinit/xinitrc作为xinit程序的启动文件(startx只是调用xinit的一个shell脚本)。因此更改系统的xinitrc文件,就能使所有没有创建.xinitrc的用户仍然享有启动文件来启动X Window系统。由于FreeBSD是一个多用户系统,这样配置启动文件就能简化每个用户的初始配置任务。在用户对X Window的了解加深之后,就能进一步配置自己的启动文件来定制自己使用的X Window风格。
XDM系统登录方式
startx或xinit必须先在控制台下登录之后,输入相应命令才能进入X Window环境。另一种方法为预先启动X Window系统,在X Window下登录进系统。这种方式是使用xdm来实现的。
以root用户登录之后,在命令行输入xdm,则系统立即启动X服务器,并启动相应的登录管理程序,在X Window上出现一个登录窗口,允许各个用户登录入系统。
在用户通过登录认证之后,xdm就需要为用户启动登录会话。xdm就以用户身份执行/usr/X11R6/lib/X11/xdm/Xsession文件,然后再执行用户个人目录下的.xsession文件。个人目录下的.xsession文件与.xinitrc文件类似,也是一个标准shell脚本,以下是一个例子。
PATH=/usr/bin:/usr/sbin/:/usr/X11R6/bin:/usr/local/binxrdb -load .Xdefaults xterm &xearth &twm这个文件与.xinitrc文件的不同之处在于,由于.xinitrc是在用户登录之后由xinit使用的,因此包括PATH在内的环境变量都已经在用户的.profile等文件中设置正确了,而通过xdm登录的用户并没有执行.profile等设置文件,因此必须在.xsession中设置PATH等环境变量,才能正确找到各个执行文件,否则就必须使用绝对路径来启动应用程序。
另一个不同之处在于,个人目录下的.xsession文件必须存在,用户才能通过XDM正常进入X Window,否则登录过程就会发生错误。而对于xinit来讲,.xinitrc不是必需的如果.xsession的执行有问题,用户就不能从xdm的登录界面上登录进系统。此时可以检查相应用户目录下的.xsession-errors文件,这个文件中将包含执行.xsession的错误信息。
在FreeBSD 3.1-RELEASE中存在一个小问题,.xsession必须具备有可执行属性,否则就不能正确执行,这个问题在3.2-RELEASE中已经修正。可以从.xsession-errors中的错误信息中来发现这个错误。
先使用root登录系统,再手工执行xdm显然只是一个调试时的执行方式,如果要真正使用xdm让用户登录系统,应该在系统启动时自动执行xdm,最简单的方法是在/usr/X11R6/etc/rc.d目录下增加一个可执行的文件,例如命名为xdm.sh,并使用chmod +x xdm.sh使其可以被执行,最简单的xdm.sh可以为以下的形式:
#! /bin/shecho “Enter xdm”/usr/X11R6/bin/xdm这样系统将在启动后直接启动xdm,进入X Window并展示一个登录界面等待用户登录。xdm以一种守护进程的方式运行在后台,每次用户退出之后会自动重新启动另一个登录界面,允许用户登录。
当然也可以将xdm命令放入rc.local文件中,然而使用单独的启动文件使得启动文件更为整齐、清晰。
启动Xdm的另一种方式是更改/etc/ttys中的设置,系统会根据ttys文件中的配置在相应终端上启动相应的程序,因此可以在一个空余的控制台终端上,通常是第四个虚拟控制台ttyv3,启动xdm。
ttyv3 '/usr/X11R6/bin/xdm -nodaemon' xterm on securettys中指定的进程具备再产生的特性,每个进程退出之后立即被重新执行。因此可以不必使用xdm本身的守护进程功能,而让系统来维护Xdm自动执行。就需要使用-nodaemon参数,使xdm以普通进程的方式运行。
远程启动X客户程序:
X Window本身的X协议支持网络,是一种分布式的体系结构。如果使用者的FreeBSD与其他Unix通过网络相连接,就能在一个计算机上运行X客户程序,而将窗口显示在另一个运行X服务器的计算机上。
由于一台计算机上可以运行多个X服务器,每个服务器会支持多个显示屏,那么X客户程序必须确认在计算机上的某一个服务器的某一个显示屏上进行显示,因此必须包括计算机地址、X服务器序号和显示屏号来唯一确定一个显示资源的位置,例如xserver:0.0,通常一台计算机中并没有过多的X服务器,该X服务器也不具备多个显示屏,因此就可以对显示资源的位置进行简化,一般使用xserver:0的表示方式。
这种表示方式就可以标志远程X服务器的显示位置,当执行X客户程序时,就需要在命令行上使用display选项,来告诉X客户程序这个显示位置的参数。
xclIEnt $ xterm -display xserver:0&或者通过设置DISPLAY环境变量来达到同样的目的。
xclient $ DISPLAY=xserver:0; export DISPLAYxclient $ xterm &这两种方法都向名为xserver的计算机上的X服务器发出了请求,但能否正常开出窗口还必须得到这个X服务器的许可。缺省情况下X服务器具备访问控制能力,标准访问控制方法使得只有具备访问许可的X客户,及其子程序才能访问X服务器的资源,而其他X客户程序不能使用X服务器资源。当使用者使用startx和xinit启动X服务器时,或者通过xdm登录进系统时,其后启动的X客户程序就继承了原有的访问权限。然而通过网络启动的X客户程序,使用X服务器资源就受到了这个访问控制的限制,不能正常启动。
控制X服务器的访问控制能力的命令为xhost,为了使得xserver的显示资源能被xclient上的X客户程序所使用,就必须在已经具备X服务器访问能力的X仿真终端下执行以下指令:
xserver $ xhost xclient上面的xhost命令允许xclient计算机上的X客户程序使用这个X服务器,也可以执行使用+作为xhost的参数,这将允许任意X客户程序访问X服务器,因此就存在一定的安全性问题。如果通过网络使用X服务器的情况比较多,就可以将相应的xhost指令放入.xinitrc或.xsession中,自动进行设置。
xserver $ rsh xclient /usr/X11R6/bin/xterm -display xserver:0wb’s passWord:上面是一个使用rsh在一个远程计算机上执行X程序,而将窗口开回X服务器上的例子,在执行这个命令之前应该执行了xhost client以打开访问权限。
未完,待续。。。