第二十四章、 XWindow 設定介紹
24.1 什麼是 X Window System
24.1.1 X Window 的發展簡史
由於這個 X 希望能夠透過網路進行圖形介面的存取,因此發展出許多的 X 通訊協定。
· 在 Unix Like 上面的圖形使用者介面 (GUI) 被稱為 X 或 X11;
· X11 是一個『軟體』而不是一個作業系統;
· X11 是利用網路架構來進行圖形介面的執行與繪製;
· 較著名的 X 版本為 X11R6 這一版,目前大部分的 X 都是這一版演化出來的 (包括 X11R7);
· 現在大部分的 distribution 使用的 X 都是由 Xorg 基金會所提供的 X11 軟體;
· X11 使用的是 MIT 授權,為類似 GPL 的自由軟體授權方式。
24.1.2 主要元件: X Server/XClient/Window Manager/Display Manager
基本上是分成 X Server 與 X Client 兩個元件而已喔!其中 X Server 在管理硬體,而 X Client 則是應用程式。在運作上,X Client 應用程式會將所想要呈現的畫面告知 X Server ,最終由 X server 來將結果透過他所管理的硬體繪製出來!整體的架構我們大約可以使用如下的圖示來作個介紹:
圖 1.2.1、 X Window System 的架構
X Server 的重點就是在管理用戶端的硬體,包括接受鍵盤/滑鼠等設備的輸入資訊, 並且將圖形繪製到螢幕上 (請注意上圖的所有元件之間的箭頭指示)。但是到底要繪製個啥東西呢? 繪圖總是需要一些數據才能繪製吧?此時 X Client (就是 X 應用程式) 就很重要啦!他主要提供的就是告知 X Server 要繪製啥東西。所以囉,遠端伺服器提供的是 X client 軟體啊!
1. X Server:硬體管理、螢幕繪製與提供字型功能:
既然 X Window System 是要顯示圖形介面,因此理所當然的需要一個元件來管理我主機上面的所有硬體設備才行!這個任務就是 X Server 所負責的。而我們在 X 發展簡史當中提到的 XFree86 計畫及 Xorg 基金會,主要提供的就是這個 X Server 啦!包括鍵盤、滑鼠、手寫板、顯示器 (monitor) 、螢幕解析度與色彩深度、顯示卡 (包含驅動程式) 與顯示的字型等等,都是 XServer 管理的。
X Window 有自己的設定檔,你必須要針對他的設定檔設定妥當才行。也就是說, Linux 的設定與 X Server 的設定不一定要相同的!
每部用戶端主機都需要安裝 X Server,而伺服器端則是提供 X Client 軟體, 以提供用戶端繪圖所需要的數據資料。
2. X Client (X Application):負責 X Server 要求的『事件』之處理:
前面提到的 X Server 主要是管理顯示介面與在螢幕上繪圖,同時將輸入裝置的行為告知 X Client,此時 X Client 就會依據這個輸入裝置的行為來開始處理,最後 X Client 會得到『嗯!這個輸入裝置的行為會產生某個圖示』,然後將這個圖示的顯示資料回傳給 X Server , X server 再根據 X Client 傳來的繪圖資料將他描圖在自己的螢幕上,來得到顯示的結果。
舉個例子來說,當我們在 X Window 的畫面中,將滑鼠向右移動,那他是怎麼告知 X Server 與 X Client 的呢?首先, X server 會偵測到滑鼠的移動,但是他不知道應該怎麼繪圖啊!此時,他將滑鼠的這個動作告知 X Client, X Client 就會去運算,結果得到,嘿嘿!其實要將滑鼠指標向右移動幾個位素,然後將這個結果告知 X server ,接下來,您就會看到 X Server 將滑鼠指標向右移動囉~
這樣做有什麼好處啊?最大的好處是, X Client 不需要知道 X Server 的硬體配備與作業系統!因為 X Client 單純就是在處理繪圖的資料而已,本身是不繪圖的。所以,在用戶端的 X Server 用的是什麼硬體?用的是哪套作業系統?伺服器端的 X Client 根本不需要知道~相當的先進與優秀~對吧! ^_^ 整個運作流程可以參考下圖:用戶端用的是什麼作業系統在 Linux 主機端是不在乎的!
圖 1.2.2、 X Server 用戶端的作業系統與 X client 的溝通示意
3. X Window Manager:特殊的 X Client,負責管理所有的 X client 軟體
視窗管理員也是 X client ,只是他主要在負責全部 X client 的控管,還包括提供某些特殊的功能,例如:
· 提供許多的控制元素,包括工作列、背景桌面的設定等等;
· 管理虛擬桌面 (virtual desktop);
· 提供視窗控制參數,這包括視窗的大小、視窗的重疊顯示、視窗的移動、視窗的最小化等等。
我們常常聽到的 KDE, GNOME, XFCE 還有陽春到爆的 twm 等等,都是一些視窗管理員的專案計畫啦!這些專案計畫中,每種視窗管理員所用以開發的顯示引擎都不太相同,所著重的方向也不一樣,因此我們才會說,在 Linux 底下,每套 Window Manager 都是獨特存在的,不是換了桌面與顯示效果而已,而是連顯示的引擎都不會一樣喔!底下是這些常見的視窗管理員全名與連結:
· GNOME (GNU Network Object ModelEnvironment):http://www.gnome.org/
· KDE (K Desktop Enviroment):http://kde.org/
· twm (Tab Window Manager):http://xwinman.org/vtwm.php
· XFCE (XForms CommonEnvironment):http://www.xfce.org/
我們 CentOS 預設提供的有 GNOME 與 KDE ,這兩個視窗管理員上面還有提供非常多的 X client 軟體,包括辦公室生產力軟體 (Open Office) 以及常用的網路功能 (firefox 瀏覽器、 Thunderbird 收發信件軟體) 等。
4. Display Manager:提供登入需求
在本機的文字介面底下你可以輸入 startx 來啟動 X 系統,此時由於你已經登入系統了,因此不需要重新登入即可取得 X 環境。
如果是 runlevel 5 的環境,则通过Display Manager。這個 display manager 最大的任務就是提供登入的環境,並且載入使用者選擇的 Window Manager 與語系等資料喔!
在 CentOS 上面我們主要利用的是 GNOME 的 GNOME Display Manager (gdm) 這支程式。至於登入後取得的視窗管理員,則可以在 gdm上面進行選擇的!所以說,並非 gdm 只能提供 GNOME 的登入而已喔!
24.1.3 X Window 的啟動流程:startx, xinit
执行startx => 找出X server和X client的设定档 =>执行xinit启动X Window,其中,X Server要先启动。
1. 在文字介面啟動 X :透過 startx 指令
我們都知道 Linux 是個多人多工的作業系統,所以啦,X 視窗也是可以根據不同的使用者而有不同的設定!
startx 最重要的任務就是找出使用者或者是系統預設的X server 與 X client 的設定檔,而使用者也能夠使用 startx 外接參數來取代設定檔的內容。
[root@www ~]# startx [X client 參數] -- [X server 參數]
# 範例:以色彩深度為 16 bit 啟動 X [root@www ~]# startx -- -depth 16 |
startx 後面接的參數以兩個減號『--』隔開,前面的是 XClient 的設定,後面的是 X Server 的設定。
事實上啟動 X 的是 xinit 這支程式, startx 僅是在幫忙找出設定值而已!那麼 startx 找到的設定值可用順序為何呢?基本上是這樣的:
X server 的參數方面:
· 使用 startx 後面接的參數;
· 若無參數,則找尋使用者家目錄的檔案,亦即 ~/.xserverrc
· 若無上述兩者,則以 /etc/X11/xinit/xserverrc
· 若無上述三者,則單純執行 /usr/bin/X (此即 X server 執行檔)
X client 的參數方面:
· 使用 startx 後面接的參數;
· 若無參數,則找尋使用者家目錄的檔案,亦即 ~/.xinitrc
· 若無上述兩者,則以 /etc/X11/xinit/xinitrc
· 若無上述三者,則單純執行 xterm (此為 X 底下的終端機軟體)
2. 由 startx 呼叫執行的 xinit
事實上,當 startx 找到需要的設定值後,就呼叫 xinit 實際啟動 X 的。他的語法是:
[root@www ~]# xinit [client option] -- [server or display option] |
在預設的情況下 (使用者尚未有 ~/.xinitrc 等檔案時),你輸入 startx ,就等於進行 xinit /etc/X11/xinit/xinitrc --/etc/X11/xinit/xserverrc 這個指令一般!但由於xserverrc 也不存在,參考上一小節的參數搜尋順序,因此實際上的指令是:xinit /etc/X11/xinit/xinitrc -- /usr/bin/X,這樣瞭了嗎?
那為什麼不要直接執行 xinit 而是使用 startx 來呼叫 xinit 呢?這是因為我們必須要取得一些參數嘛! startx 可以幫我們快速的找到這些參數而不必手動輸入的。因為單純只是執行 xinit 的時候,系統的預設 X Client 與 X Server 的內容是這樣的:
xinit xterm -geometry +1+1 -n login -display :0 -- X :0 |
3. 啟動 X server 的檔案: xserverrc
/usr/bin/X (symbolic link to `Xorg') 這個指令是系統最原始的 Xserver 執行檔囉。在啟動 X Server 時,Xorg 會去讀取 /etc/X11/xorg.conf 這個設定檔。
事實上我們的Linux 可以『同時啟動多個 X』喔!第一個 X 的畫面會在 :0 亦即是 tty7 ,第二個 X 則是 :1 亦即是 tty8 。
其中比較有趣的是, X server 未註明載入的介面時,預設是使用 :0 ~但是 X client 未註明時,則無法執行喔!
4. 啟動 X Client 的檔案: xinitrc
/etc/X11/xinit/xinitrc(~/.xinitrc) => 通过 /etc/X11/xinit/xinitrc-common载入参数 => /etc/X11/xinit/Xclients(~/.Xclients) => 通过 /etc/sysconfig/desktop来确定使用的WindowsManager =>如果,既没有安装GNOME,也没有安装KDE,则尝试使用twm =>同时启动xclock,xterm,firefox和twm。
5. X 啟動的埠口
其實,CentOS 由於考慮 X 視窗是在本機上面運作,因此將埠口改為插槽檔 (socket) 了,因此你無法觀察到 X 啟動的埠口的。事實上, X server 應該是要啟動一個 port 6000 來與 X client 進行溝通的!由於系統上面也可能有多個 X 存在,因此我們就會有 port 6001, port 6002... 等等。這也就是說:
X 視窗系統 | 顯示介面號碼 | 預設終端機 | 網路監聽埠口 |
第一個 X | hostname:0 | tty7 | port 6000 |
第二個 X | hostname:1 | tty8 | port 6001 |
6. X 啟動流程測試
下達指令與 tty8 查閱結果囉!(如果是 CentOS 之類的 Red Hat 系統,請務必要啟動 xfs 這個服務喔!)
1. 先來啟動第一個 X 在 :1 畫面中: [root@www ~]# X :1 & 2. 輸入數個可以在 X 當中執行的虛擬終端機 [root@www ~]# xterm -display :1 & [root@www ~]# xterm -display :1 & 3. 在輸入不同的 X client 觀察觀察,分別去到 tty8 觀察喔! [root@www ~]# xclock -display :1 & [root@www ~]# xeyes -display :1 & 4. 輸入可以管理的 window manager [root@www ~]# twm -display :1 & 5. 將所有剛剛建立的 X 相關工作全部殺掉! [root@www ~]# kill %6 [root@www ~]# kill %5 [root@www ~]# kill %4 [root@www ~]# kill %3 [root@www ~]# kill %2 [root@www ~]# kill %1 |
24.2 X Server 設定檔解析與設定
基本上,X server 的設定檔都是預設放置在 /etc/X11 目錄下,而相關的顯示模組或上面提到的總總模組,則主要放置在 /usr/lib/xorg/modules 底下。比較重要的是字型檔與晶片組,她們主要放置在:
· 提供的螢幕字型: /usr/share/X11/fonts/
· 顯示卡的晶片組: /usr/lib64/xorg/modules/drivers/
24.2.1 解析 xorg.conf 設定
[root@www ~]# X -version
X Window System Version 7.1.1
設定檔檔名為 /etc/X11/xorg.conf
Section "section name" …… <== 與這個 section name 有關的設定項目 …… EndSection |
至於常見的 section name 主要有:
· Module: 被載入到 X Server當中的模組 (某些功能的驅動程式);
· InputDevice: 包括輸入的 1. 鍵盤的格式 2. 滑鼠的格式,以及其他相關輸入設備;
· Files: 設定字型所在的目錄位置等;
· Monitor: 監視器的格式, 主要是設定水平、垂直的更新頻率,與硬體有關;
· Device: 這個重要,就是顯示卡晶片組的相關設定了;
· Screen: 這個是在螢幕上顯示的相關解析度與色彩深度的設定項目,與顯示的行為有關;
· ServerLayout: 上述的每個項目都可以重覆設定,這裡則是此一 X server 要取用的哪個項目值的設定囉。
[root@www ~]# cd /etc/X11 [root@www X11]# cp -a xorg.conf xorg.conf.20090713 <== 有備份有保佑 [root@www X11]# vim xorg.conf Section "Module" Load "dbe" Load "extmod" Load "record" Load "dri" Load "xtrap" Load "glx" Load "vnc" EndSection # 上面這些模組是 X Server 啟動時,希望能夠額外獲得的相關支援的模組。 # 關於更多模組可以搜尋一下 /usr/lib64/xorg/modules/extensions/ 這個目錄
Section "InputDevice" Identifier "Keyboard0" Driver "kbd" Option "XkbModel" "pc105" Option "XkbLayout" "us" <==注意,是 us 美式鍵盤對應 EndSection # 這個玩意兒是鍵盤的對應設定資料,重點在於 XkbLayout 那一項, # 如果沒有問題的話,我們台灣地區應該都是使用美式鍵盤對應按鈕的。 # 特別注意到 Identifier (定義) 那一項,那個是在說明,我這個鍵盤的設定檔, # 被定義為名稱是 Keyboard0 的意思,這個名稱最後會被用於 ServerLayout 中
Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "auto" Option "Device" "/dev/input/mice" Option "ZAxisMapping" "4 5 6 7" <==滾輪支援 EndSection # 這個則主要在設定滑鼠功能,重點在那個 Protocol 項目, # 那個是可以指定滑鼠介面的設定值,我這裡使用的是自動偵測!不論是 USB/PS2。
Section "Files" RgbPath "/usr/share/X11/rgb" ModulePath "/usr/lib64/xorg/modules" FontPath "unix/:7100" <==使用另外的服務來提供字型定義 FontPath "built-ins" EndSection # 我們的 X Server 很重要的一點就是必須要提供字型,這個 Files # 的項目就是在設定字型,當然啦,你的主機必須要有字型檔才行。一般字型檔案在: # /usr/share/X11/fonts/ 目錄中。至於那個 Rgb 是與色彩有關的項目。 # 相關的字型說明我們會在下一小節的 xfs 在跟大家報告。
Section "Monitor" Identifier "Monitor0" VendorName "Monitor Vendor" ModelName "Monitor Model" HorizSync 30.0 - 80.0 VertRefresh 50.0 - 100.0 EndSection # 螢幕監視器的設定僅有一個地方要注意,那就是垂直與水平的更新頻率。 # 在上面的 HorizSync 與 VerRefresh 的設定上,要注意,不要設定太高, # 這個玩意兒與實際的監視器功能有關,請查詢你的監視器手冊說明來設定吧! # 傳統 CRT 螢幕設定太高的話,據說會讓 monitor 燒毀呢,要很注意啊。
Section "Device" <==顯示卡的驅動程式項目 Identifier "Card0" Driver "vesa" <==實際的驅動程式喔! VendorName "Unknown Vendor" BoardName "Unknown Board" BusID "PCI:0:2:0" EndSection # 這地方重要了,這就是顯示卡的晶片模組載入的設定區域。由於鳥哥使用 Virtualbox # 模擬器模擬這個測試機,因此這個地方顯示的驅動程式為通用的 vesa 模組。 # 更多的顯示晶片模組可以參考 /usr/lib64/xorg/modules/drivers/
Section "Screen" <==與顯示的畫面有關,解析度與色彩深度 Identifier "Screen0" Device "Card0" <==使用哪個顯示卡來提供顯示 Monitor "Monitor0" <==使用哪個監視器 SubSection "Display" <==此階段的附屬設定項目 Viewport 0 0 Depth 16 <==就是色彩深度 Modes "1024x768" "800x600" "640x480" <==解析度 EndSubSection SubSection "Display" Viewport 0 0 Depth 24 Modes "1024x768" "800x600" EndSubSection EndSection # Monitor 與實際的顯示器有關,而 Screen 則是與顯示的畫面解析度、色彩深度有關。 # 我們可以設定多個解析度,實際應用時可以讓使用者自行選擇想要的解析度來呈現。 # 不過,為了避免困擾,鳥哥通常只指定一到兩個解析度而已。
Section "ServerLayout" <==實際選用的設定值 Identifier "X.org Configured" Screen 0 "Screen0" 0 0 <==解析度等 InputDevice "Mouse0" "CorePointer" <==滑鼠 InputDevice "Keyboard0" "CoreKeyboard" <==鍵盤 EndSection # 我們上面設定了這麼多的項目之後,最後整個 X Server 要用的項目, # 就通通一骨腦的給他寫入這裡就是了,包括鍵盤、滑鼠以及顯示介面啊。 # 其中 screen 的部分還牽涉到顯示卡、監視器螢幕等設定值呢! |
基本上,如果你的 Files 那個項目用的是直接寫入字型的路徑,那就不需要啟動 XFS (X Font Server),如果是使用 font server 時,就要先啟動 xfs。
24.2.2 X Font Server (XFS) 與加入額外中文字形:chkfontpath, fc-cache
這個 XFS 的主設定檔在 /etc/X11/fs/config ,而字型檔則在 /usr/share/X11/fonts/ ,這裡再次給他強調一下。 至於啟動的腳本則在/etc/init.d/xfs 囉!
[root@www ~]# vi /etc/X11/fs/config client-limit = 10 <==最多允許幾個 X server 向我要求字型(因為跨網路) clone-self = on <==與效能有關,若 xfs 達到限制值,啟動新的 xfs catalogue = /usr/share/X11/fonts/misc:unscaled, /usr/share/X11/fonts/75dpi:unscaled, /usr/share/X11/fonts/100dpi:unscaled, /usr/share/X11/fonts/Type1, /usr/share/X11/fonts/TTF, /usr/share/fonts/default/Type1, # 上面這些咚咚,就是字型檔案的所在!如果你有新字型,可以放置在該目錄。
default-point-size = 120 <==預設字型大小,單位為 1/10 點字 (point) default-resolutions = 75,75,100,100 <==這個則是顯示的字型像素 (pixel) deferglyphs = 16 <==延遲顯示的字型,此為 16 bits 字型 use-syslog = on <==啟動支援錯誤登錄 no-listen = tcp <==啟動 xfs 於 socket 而非 TCP |
上面這個檔案的設定重點在 catalogue 那個設定項目當中。你可以使用 chkfontpath 這個指令來列出目前支援的字型檔案,也可以直接修改呢!
# 1. 先安裝中文字形軟體,亦即 fonts-chinese 這個軟體名 [root@www ~]# yum install fonts-chinese
# 2. 查閱 taipei 字型的所在目錄位置: [root@www ~]# rpm -ql fonts-chinese | grep taipei /usr/share/fonts/chinese/misc/taipei16.pcf.gz <==重點在目錄! /usr/share/fonts/chinese/misc/taipei20.pcf.gz /usr/share/fonts/chinese/misc/taipei24.pcf.gz
# 3. 建立字型檔的目錄架構 [root@www ~]# cd /usr/share/fonts/chinese/misc [root@www ~]# mkfontdir # 這個指令在建置 fonts.dir 這個檔案,提供字型檔案目錄的說明。
# 4. 將上述的目錄加入 xfs 的支援之中: [root@www ~]# chkfontpath -a /usr/share/fonts/chinese/misc/ [root@www ~]# chkfontpath ....(前面省略).... /usr/share/fonts/chinese/misc:unscaled /usr/share/fonts/chinese/misc <==這兩行會被新增出來! [root@www ~]# /etc/init.d/xfs restart
# 5. 在 X window 底下啟動終端機,測試一下有沒有捉到該字型? [root@www ~]# xlsofnts | grep taipei # 如果順利的話,你會看到有幾個 taipeiXX 的字樣在螢幕上出現! |
总结:
x server字体 =>mkfontdir/chkfontpath -a => 写入到/etc/X11/fs/config => chkfontpath
x client字体 => 同linux字体配置一致 => cp/root/*.tt[fc] /usr/share/fonts/windows => fc-cache -f -v => fc-list :file
24.2.3 設定檔重建與顯示器參數微調:透過 gtf 調整解析度
如果你修改 xorg.conf 結果改錯了,導致無法順利的啟動 X server 時,偏偏又忘記製作備份檔!該如何是好?
[root@www ~]# Xorg -configure :1 [root@www ~]# X -config /root/xorg.conf.new :1 [root@www ~]# cp -p /root/xorg.conf.new /etc/X11/xorg.conf |
1. 關於螢幕解析度與更新率
[root@www ~]# gtf 水平像素 垂直像素 更新頻率 [-xv] 選項與參數: 水平像素:就是解析度的 X 軸 垂直像素:就是解析度的 Y 軸 更新頻率:與顯示器有關,一般可以選擇 60, 75, 80, 85 等頻率 -x :使用 Xorg 設定檔的模式輸出,這是預設值 -v :顯示偵測的過程
# 1. 使用 1024x768 的解析度,75 Hz 的更新頻率來取得顯示器內容 [root@www ~]# gtf 1024 768 75 -x # 1024x768 @ 75.00 Hz (GTF) hsync: 60.15 kHz; pclk: 81.80 MHz Modeline "1024x768_75.00" 81.80 1024 1080 1192 1360 768 769 772 802 -HSync +Vsync # 重點是 Modeline 那一行!那行給他抄下來
# 2. 將上述的資料輸入 xorg.conf 內的 Monitor 項目中: [root@www ~]# vim /etc/X11/xorg.conf Section "Monitor" Identifier "Monitor0" VendorName "Monitor Vendor" ModelName "Monitor Model" Modeline "1024x768_75.00" 81.80 1024 1080 1192 1360 768 769 772 802 -HSync +Vsync EndSection # 就是新增上述的那行特殊字體部分到 Monitor 的項目中即可。 |