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以打開訪問權限。
未完,待續。。。