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