FreeBSD連載(49):進入X Window

1999年12月21日 16:20 王波

進入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/bin
xrdb -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/sh
echo “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 secure

  ttys中指定的進程具備再產生的特性,每個進程退出之後立即被重新執行。 因此可以不必使用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 DISPLAY
xclient $ 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:0
wb’s password: 

  上面是一個使用rsh在一個遠程電腦上執行X程序,而將視窗開回X伺服器上 的例子,在執行這個命令之前應該執行了xhost client以打開訪問權限。