FreeBSD連載(49):進(jìn)入X Window
X服務(wù)器的執(zhí)行程序位于/usr/X11R6/bin目錄中,并且使用一個(gè)符號(hào)聯(lián)接 “X” ,指向具體的執(zhí)行程序,如XF86_VGA16或XF86_S3V等。因此直接輸入X命令就能啟動(dòng)設(shè)置好的X服務(wù)器,系統(tǒng)將進(jìn)入圖形狀態(tài),并出現(xiàn)一個(gè)可以移動(dòng)的X形鼠標(biāo)指針,但并沒有其他反應(yīng)。這是因?yàn)閄服務(wù)器只負(fù)責(zé)處理輸入和顯示,具體對(duì)使用者的輸入進(jìn)行處理則由其他X客戶負(fù)責(zé),而直接啟動(dòng)X服務(wù)器沒有啟動(dòng)任何X客戶,因而不能處理用戶的任何輸入。
手工啟動(dòng)X Window
因此為了利用圖形界面的處理能力,在啟動(dòng)X服務(wù)器的同時(shí)還應(yīng)該啟動(dòng)X客戶程序來(lái)負(fù)責(zé)回應(yīng)用戶的輸入。這個(gè)任務(wù)可以通過(guò)shell程序startx或xinit來(lái)作到,這兩個(gè)程序能在啟動(dòng)X的同時(shí),啟動(dòng)X Window的窗口管理程序和其他X程序。
startx和xinit缺省查看使用者個(gè)人目錄下的.xinitrc文件,在這個(gè)文件內(nèi)應(yīng)該包含啟動(dòng)各個(gè)X客戶程序的命令。最簡(jiǎn)單的.xinitrc可能只包含一個(gè)命令來(lái)啟動(dòng)一個(gè)仿真終端xterm,也可以包含一系列命令來(lái)啟動(dòng)多個(gè)程序,創(chuàng)建出漂亮的X環(huán)境。想自己定制X Window操作環(huán)境的使用者可以手工創(chuàng)建和修改這個(gè)文件,以得到不同的用戶界面。
xmodmap -e 'keysym Alt_L = Meta_L Meta_L'xterm &xearth &twm在這個(gè)例子中執(zhí)行了 xmodmap用于修改X的鍵盤定義,然后在后臺(tái)執(zhí)行xterm提供一個(gè)仿真終端,執(zhí)行xearth設(shè)置X Window的背景,最后在前臺(tái)執(zhí)行一個(gè)簡(jiǎn)單的窗口管理器twm。窗口管理器被放到前臺(tái)執(zhí)行,這樣當(dāng)退出窗口管理器時(shí)將退出整個(gè)X服務(wù)器的執(zhí)行。
缺省情況下,用戶并沒有創(chuàng)建這個(gè).xinitrc文件,這樣xinit命令就只能啟動(dòng)一個(gè)xterm終端仿真程序,而沒有執(zhí)行任何其他的X程序,也沒有執(zhí)行窗口管理器。因此,直接使用xinit啟動(dòng)的X Window僅僅具備一個(gè)終端窗口,將鼠標(biāo)移動(dòng)到它上面之后,才能輸入命令執(zhí)行其他操作。用戶如果想要啟動(dòng)窗口管理器或其他程序,必須在終端窗口中輸入相應(yīng)的命令。
由于X Window中存在多個(gè)窗口,但只有一個(gè)稱為 “焦點(diǎn)” 的窗口才能接收輸入。X Window缺省使用鼠標(biāo)的位置來(lái)選擇輸入焦點(diǎn)窗口,當(dāng)然另一些窗口管理器也可以通過(guò)鍵盤來(lái)切換輸入焦點(diǎn)窗口。
但是即使不存在.xinitrc文件,使用startx也能啟動(dòng)窗口管理器和幾個(gè)X客戶程序,這是由于startx發(fā)現(xiàn)用戶個(gè)人目錄下不存在.xinitrc文件之后,就使用系統(tǒng)中的/usr/X11R6/lib/X11/xinit/xinitrc作為xinit程序的啟動(dòng)文件(startx只是調(diào)用xinit的一個(gè)shell腳本)。因此更改系統(tǒng)的xinitrc文件,就能使所有沒有創(chuàng)建.xinitrc的用戶仍然享有啟動(dòng)文件來(lái)啟動(dòng)X Window系統(tǒng)。由于FreeBSD是一個(gè)多用戶系統(tǒng),這樣配置啟動(dòng)文件就能簡(jiǎn)化每個(gè)用戶的初始配置任務(wù)。在用戶對(duì)X Window的了解加深之后,就能進(jìn)一步配置自己的啟動(dòng)文件來(lái)定制自己使用的X Window風(fēng)格。
XDM系統(tǒng)登錄方式
startx或xinit必須先在控制臺(tái)下登錄之后,輸入相應(yīng)命令才能進(jìn)入X Window環(huán)境。另一種方法為預(yù)先啟動(dòng)X Window系統(tǒng),在X Window下登錄進(jìn)系統(tǒng)。這種方式是使用xdm來(lái)實(shí)現(xiàn)的。
以root用戶登錄之后,在命令行輸入xdm,則系統(tǒng)立即啟動(dòng)X服務(wù)器,并啟動(dòng)相應(yīng)的登錄管理程序,在X Window上出現(xiàn)一個(gè)登錄窗口,允許各個(gè)用戶登錄入系統(tǒng)。
在用戶通過(guò)登錄認(rèn)證之后,xdm就需要為用戶啟動(dòng)登錄會(huì)話。xdm就以用戶身份執(zhí)行/usr/X11R6/lib/X11/xdm/Xsession文件,然后再執(zhí)行用戶個(gè)人目錄下的.xsession文件。個(gè)人目錄下的.xsession文件與.xinitrc文件類似,也是一個(gè)標(biāo)準(zhǔn)shell腳本,以下是一個(gè)例子。
PATH=/usr/bin:/usr/sbin/:/usr/X11R6/bin:/usr/local/binxrdb -load .Xdefaults xterm &xearth &twm這個(gè)文件與.xinitrc文件的不同之處在于,由于.xinitrc是在用戶登錄之后由xinit使用的,因此包括PATH在內(nèi)的環(huán)境變量都已經(jīng)在用戶的.profile等文件中設(shè)置正確了,而通過(guò)xdm登錄的用戶并沒有執(zhí)行.profile等設(shè)置文件,因此必須在.xsession中設(shè)置PATH等環(huán)境變量,才能正確找到各個(gè)執(zhí)行文件,否則就必須使用絕對(duì)路徑來(lái)啟動(dòng)應(yīng)用程序。
另一個(gè)不同之處在于,個(gè)人目錄下的.xsession文件必須存在,用戶才能通過(guò)XDM正常進(jìn)入X Window,否則登錄過(guò)程就會(huì)發(fā)生錯(cuò)誤。而對(duì)于xinit來(lái)講,.xinitrc不是必需的如果.xsession的執(zhí)行有問(wèn)題,用戶就不能從xdm的登錄界面上登錄進(jìn)系統(tǒng)。此時(shí)可以檢查相應(yīng)用戶目錄下的.xsession-errors文件,這個(gè)文件中將包含執(zhí)行.xsession的錯(cuò)誤信息。
在FreeBSD 3.1-RELEASE中存在一個(gè)小問(wèn)題,.xsession必須具備有可執(zhí)行屬性,否則就不能正確執(zhí)行,這個(gè)問(wèn)題在3.2-RELEASE中已經(jīng)修正。可以從.xsession-errors中的錯(cuò)誤信息中來(lái)發(fā)現(xiàn)這個(gè)錯(cuò)誤。
先使用root登錄系統(tǒng),再手工執(zhí)行xdm顯然只是一個(gè)調(diào)試時(shí)的執(zhí)行方式,如果要真正使用xdm讓用戶登錄系統(tǒng),應(yīng)該在系統(tǒng)啟動(dòng)時(shí)自動(dòng)執(zhí)行xdm,最簡(jiǎn)單的方法是在/usr/X11R6/etc/rc.d目錄下增加一個(gè)可執(zhí)行的文件,例如命名為xdm.sh,并使用chmod +x xdm.sh使其可以被執(zhí)行,最簡(jiǎn)單的xdm.sh可以為以下的形式:
#! /bin/shecho “Enter xdm”/usr/X11R6/bin/xdm這樣系統(tǒng)將在啟動(dòng)后直接啟動(dòng)xdm,進(jìn)入X Window并展示一個(gè)登錄界面等待用戶登錄。xdm以一種守護(hù)進(jìn)程的方式運(yùn)行在后臺(tái),每次用戶退出之后會(huì)自動(dòng)重新啟動(dòng)另一個(gè)登錄界面,允許用戶登錄。
當(dāng)然也可以將xdm命令放入rc.local文件中,然而使用單獨(dú)的啟動(dòng)文件使得啟動(dòng)文件更為整齊、清晰。
啟動(dòng)Xdm的另一種方式是更改/etc/ttys中的設(shè)置,系統(tǒng)會(huì)根據(jù)ttys文件中的配置在相應(yīng)終端上啟動(dòng)相應(yīng)的程序,因此可以在一個(gè)空余的控制臺(tái)終端上,通常是第四個(gè)虛擬控制臺(tái)ttyv3,啟動(dòng)xdm。
ttyv3 '/usr/X11R6/bin/xdm -nodaemon' xterm on securettys中指定的進(jìn)程具備再產(chǎn)生的特性,每個(gè)進(jìn)程退出之后立即被重新執(zhí)行。因此可以不必使用xdm本身的守護(hù)進(jìn)程功能,而讓系統(tǒng)來(lái)維護(hù)Xdm自動(dòng)執(zhí)行。就需要使用-nodaemon參數(shù),使xdm以普通進(jìn)程的方式運(yùn)行。
遠(yuǎn)程啟動(dòng)X客戶程序:
X Window本身的X協(xié)議支持網(wǎng)絡(luò),是一種分布式的體系結(jié)構(gòu)。如果使用者的FreeBSD與其他Unix通過(guò)網(wǎng)絡(luò)相連接,就能在一個(gè)計(jì)算機(jī)上運(yùn)行X客戶程序,而將窗口顯示在另一個(gè)運(yùn)行X服務(wù)器的計(jì)算機(jī)上。
由于一臺(tái)計(jì)算機(jī)上可以運(yùn)行多個(gè)X服務(wù)器,每個(gè)服務(wù)器會(huì)支持多個(gè)顯示屏,那么X客戶程序必須確認(rèn)在計(jì)算機(jī)上的某一個(gè)服務(wù)器的某一個(gè)顯示屏上進(jìn)行顯示,因此必須包括計(jì)算機(jī)地址、X服務(wù)器序號(hào)和顯示屏號(hào)來(lái)唯一確定一個(gè)顯示資源的位置,例如xserver:0.0,通常一臺(tái)計(jì)算機(jī)中并沒有過(guò)多的X服務(wù)器,該X服務(wù)器也不具備多個(gè)顯示屏,因此就可以對(duì)顯示資源的位置進(jìn)行簡(jiǎn)化,一般使用xserver:0的表示方式。
這種表示方式就可以標(biāo)志遠(yuǎn)程X服務(wù)器的顯示位置,當(dāng)執(zhí)行X客戶程序時(shí),就需要在命令行上使用display選項(xiàng),來(lái)告訴X客戶程序這個(gè)顯示位置的參數(shù)。
xclIEnt $ xterm -display xserver:0&或者通過(guò)設(shè)置DISPLAY環(huán)境變量來(lái)達(dá)到同樣的目的。
xclient $ DISPLAY=xserver:0; export DISPLAYxclient $ xterm &這兩種方法都向名為xserver的計(jì)算機(jī)上的X服務(wù)器發(fā)出了請(qǐng)求,但能否正常開出窗口還必須得到這個(gè)X服務(wù)器的許可。缺省情況下X服務(wù)器具備訪問(wèn)控制能力,標(biāo)準(zhǔn)訪問(wèn)控制方法使得只有具備訪問(wèn)許可的X客戶,及其子程序才能訪問(wèn)X服務(wù)器的資源,而其他X客戶程序不能使用X服務(wù)器資源。當(dāng)使用者使用startx和xinit啟動(dòng)X服務(wù)器時(shí),或者通過(guò)xdm登錄進(jìn)系統(tǒng)時(shí),其后啟動(dòng)的X客戶程序就繼承了原有的訪問(wèn)權(quán)限。然而通過(guò)網(wǎng)絡(luò)啟動(dòng)的X客戶程序,使用X服務(wù)器資源就受到了這個(gè)訪問(wèn)控制的限制,不能正常啟動(dòng)。
控制X服務(wù)器的訪問(wèn)控制能力的命令為xhost,為了使得xserver的顯示資源能被xclient上的X客戶程序所使用,就必須在已經(jīng)具備X服務(wù)器訪問(wèn)能力的X仿真終端下執(zhí)行以下指令:
xserver $ xhost xclient上面的xhost命令允許xclient計(jì)算機(jī)上的X客戶程序使用這個(gè)X服務(wù)器,也可以執(zhí)行使用+作為xhost的參數(shù),這將允許任意X客戶程序訪問(wèn)X服務(wù)器,因此就存在一定的安全性問(wèn)題。如果通過(guò)網(wǎng)絡(luò)使用X服務(wù)器的情況比較多,就可以將相應(yīng)的xhost指令放入.xinitrc或.xsession中,自動(dòng)進(jìn)行設(shè)置。
xserver $ rsh xclient /usr/X11R6/bin/xterm -display xserver:0wb’s passWord:上面是一個(gè)使用rsh在一個(gè)遠(yuǎn)程計(jì)算機(jī)上執(zhí)行X程序,而將窗口開回X服務(wù)器上的例子,在執(zhí)行這個(gè)命令之前應(yīng)該執(zhí)行了xhost client以打開訪問(wèn)權(quán)限。
未完,待續(xù)。。。
