## 23.1 什么是 X Window System
Unix Like 操作系統不是只能進行服務器的架設而已,在美編、排版、制圖、多媒體應用上也是有其需要的。 這些需求都需要用到圖形接口 (Graphical User Interface, GUI) 的操作的, 所以后來才有所謂的 X Window System 這玩意兒。那么為啥圖形窗口接口要稱為 X 呢?因為就英文字母來看 X 是在 W(indow) 后面,因此,人們就戲稱這一版的窗口接口為 X 啰 (有下一版的新窗口之意)!
事實上, X Window System 是個非常大的架構,他還用到網絡功能呢!也就是說,其實 X 窗口系統是能夠跨網絡與跨操作系統平臺的! 而鳥哥這個基礎篇是還沒有談到服務器與網絡主從式架構,因此 X 在這里并不容易理解的。不過,沒關系! 我們還是談談 X 怎么來的,然后再來談談這 X 窗口系統的元件有哪些,慢慢來,應該還是能夠理解 X 的啦!
### 23.1.1 X Window 的發展簡史
X Window 系統最早是由 MIT (Massachusetts Institute of Technology, 麻省理工學院) 在 1984 年發展出來的, 當初 X 就是在 Unix 的 System V 這個操作系統版本上面開發出來的。在開發 X 時,開發者就希望這個窗口接口不要與硬件有強烈的相關性,這是因為如果與硬件的相關性高,那就等于是一個操作系統了, 如此一來的應用性會比較局限。因此 X 在當初就是以應用程序的概念來開發的,而非以操作系統來開發。
由于這個 X 希望能夠通過網絡進行圖形接口的存取,因此發展出許多的 X 通訊協定,這些網絡架構非常的有趣, 所以吸引了很多廠商加入研發,因此 X 的功能一直持續在加強!一直到 1987 年更改 X 版本到 X11 ,這一版 X 取得了明顯的進步, 后來的窗口接口改良都是架構于此一版本,因此后來 X 窗口也被稱為 X11 。這個版本持續在進步當中,到了 1994 年發布了新版的 X11R6 ,后來的架構都是沿用此一釋出版本,所以后來的版本定義就變成了類似 1995 年的 X11R6.3 之類的樣式。 [[1]](#ps1)
1992 年 XFree86 ([http://www.xfree86.org/](http://www.xfree86.org/)) 計劃順利展開, 該計劃持續在維護 X11R6 的功能性,包括對新硬件的支持以及更多新增的功能等等。當初定名為 XFree86 其實是根據“ X + Free software + x86 硬件 ”而來的呢。早期 Linux 所使用的 X Window 的主要核心都是由 XFree86 這個計劃所提供的,因此,我們常常將 X 系統與 XFree86 掛上等號的說。
不過由于一些授權的問題導致 XFree86 無法繼續提供類似 GPL 的自由軟件,后來 Xorg 基金會就接手 X11R6 的維護! Xorg ([http://www.x.org/](http://www.x.org/)) 利用當初 MIT 發布的類似自由軟件的授權, 將 X11R6 拿來進行維護,并且在 2004 年發布了 X11R6.8 版本,更在 2005 年后發表了 X11R7.x 版。 現在我們 CentOS 7.x 使用的 X 就是 Xorg 提供的 X11R7.X 喔! 而這個 X11R6/X11R7 的版本是自由軟件,因此很多組織都利用這個架構去設計他們的圖形接口喔!包括 Mac OS X v10.3 也曾利用過這個架構來設計他們的窗口呢!我們的 CentOS 也是利用 Xorg 提供的 X11 啦!
從上面的說明,我們可以知道的是:
* 在 Unix Like 上面的圖形使用者接口 (GUI) 被稱為 X 或 X11;
* X11 是一個“軟件”而不是一個操作系統;
* X11 是利用網絡架構來進行圖形接口的執行與繪制;
* 較著名的 X 版本為 X11R6 這一版,目前大部分的 X 都是這一版演化出來的 (包括 X11R7);
* 現在大部分的 distribution 使用的 X 都是由 Xorg 基金會所提供的 X11 軟件;
* X11 使用的是 MIT 授權,為類似 GPL 的開放源代碼授權方式。
### 23.1.2 主要元件: X Server/X Client/Window Manager/Display Manager
如同前面談到的,X Window system 是個利用網絡架構的圖形使用者接口軟件,那到底這個架構可以分成多少個元件呢? 基本上是分成 X Server 與 X Client 兩個元件而已喔!其中 X Server 在管理硬件,而 X Client 則是應用程序。 在運行上,X Client 應用程序會將所想要呈現的畫面告知 X Server ,最終由 X server 來將結果通過他所管理的硬件繪制出來! 整體的架構我們大約可以使用如下的圖示來作個介紹:[[2]](#ps2)
圖23.1.1、X Window System 的架構
上面的圖示非常有趣喔!我們在用戶端想要取得來自服務器的圖形數據時,我們用戶端使用的當然是用戶端的硬件設備啊, 所以,X Server 的重點就是在管理用戶端的硬件,包括接受鍵盤/鼠標等設備的輸入信息, 并且將圖形繪制到屏幕上 (請注意上圖的所有元件之間的箭頭指示)。但是到底要繪制個啥東西呢? 繪圖總是需要一些數據才能繪制吧?此時 X Client (就是 X 應用程序) 就很重要啦!他主要提供的就是告知 X Server 要繪制啥東西。那照這樣的想法來思考,我們是想要取得遠端服務器的繪圖數據來我們的計算機上面顯示嘛! 所以啰,遠端服務器提供的是 X client 軟件啊!
下面就讓我們來更深入的聊一聊這兩個元件吧!
* X Server:硬件管理、屏幕繪制與提供字體功能:
既然 X Window System 是要顯示圖形接口,因此理所當然的需要一個元件來管理我主機上面的所有硬件設備才行! 這個任務就是 X Server 所負責的。而我們在 X 發展簡史當中提到的 XFree86 計劃及 Xorg 基金會,主要提供的就是這個 X Server 啦!那么 X Server 管理的設備主要有哪些呢?其實與輸入/輸出有關喔!包括鍵盤、鼠標、手寫板、顯示器 (monitor) 、屏幕分辨率與色彩深度、顯卡 (包含驅動程序) 與顯示的字體等等,都是 X Server 管理的。
咦!顯卡、屏幕以及鍵盤鼠標的設置,不是在開機的時候 Linux 系統以 systemd 的相關設置處理好了嗎? 為何 X Server 還要重新設置啊?這是因為 X Window 在 Linux 里面僅能算是“一套很棒的軟件”, 所以 X Window 有自己的配置文件,你必須要針對他的配置文件設置妥當才行。也就是說, Linux 的設置與 X Server 的設置不一定要相同的!因此,你在 CentOS 7 的 multi-user.target 想要玩圖形接口時,就得要載入 X Window 需要的驅動程序才行~總之, X Server 的主要功能就是在管理“主機”上面的顯示硬件與驅動程序。
既然 X Window System 是以通過網絡取得圖形接口的一個架構,那么用戶端是如何取得服務器端提供的圖形畫面呢? 由于服務器與用戶端的硬件不可能完全相同,因此我們用戶端當然不可能使用到服務器端的硬件顯示功能! 舉例來說,你的用戶端計算機并沒有 3D 影像加速功能,那么你的畫面可能呈現出服務器端提供的 3D 加速嗎? 當然不可能吧!所以啰 X Server 的目的在管理用戶端的硬件設備!也就是說:“每部用戶端主機都需要安裝 X Server,而服務器端則是提供 X Client 軟件, 以提供用戶端繪圖所需要的數據數據”。
X Server / X Client 的互動并非僅有 client --> server,兩者其實有互動的!從上圖 23.1.1 我們也可以發現, X Server 還有一個重要的工作,那就是將來自輸入設備 (如鍵盤、鼠標等) 的動作告知 X Client, 你曉得, X Server 既然是管理這些周邊硬件,所以,周邊硬件的動作當然是由 X Server 來管理的, 但是 X Server 本身并不知道周邊設備這些動作會造成什么顯示上的效果, 因此 X Server 會將周邊設備的這些動作行為告知 X Client ,讓 X Client 去傷腦筋。
* X Client:負責 X Server 要求的“事件”之處理:
前面提到的 X Server 主要是管理顯示接口與在屏幕上繪圖,同時將輸入設備的行為告知 X Client, 此時 X Client 就會依據這個輸入設備的行為來開始處理,最后 X Client 會得到“ 嗯!這個輸入設備的行為會產生某個圖示”,然后將這個圖示的顯示數據回傳給 X Server , X server 再根據 X Client 傳來的繪圖數據將他描圖在自己的屏幕上,來得到顯示的結果。
也就是說, X Client 最重要的工作就是處理來自 X Server 的動作,將該動作處理成為繪圖數據, 再將這些繪圖數據傳回給 X Server 啰!由于 X Client 的目的在產生繪圖的數據,因此我們也稱呼 X Client 為 X Application (X 應用程序)。而且,每個 X Client 并不知道其他 X Client 的存在, 意思是說,如果有兩個以上的 X client 同時存在時,兩者并不知道對方到底傳了什么數據給 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 主機端是不在乎的!
圖23.1.2、X Server 用戶端的操作系統與 X client 的溝通示意
* X Window Manager:特殊的 X Client ,負責管理所有的 X client 軟件
剛剛前面提到,X Client 的主要工作是將來自 X Server 的數據處理成為繪圖數據,再回傳給 X server 而已, 所以 X client 本身是不知道他在 X Server 當中的位置、大小以及其他相關信息的。這也是上面我們談到的, X client 彼此不知道對方在屏幕的哪個位置啊!為了克服這個問題,因此就有 Window Manager (WM, 窗口管理員) 的產生了。 窗口管理員也是 X client ,只是他主要在負責全部 X client 的控管,還包括提供某些特殊的功能,例如:
* 提供許多的控制元素,包括工作列、背景桌面的設置等等;
* 管理虛擬桌面 (virtual desktop);
* 提供窗口控制參數,這包括窗口的大小、窗口的重疊顯示、窗口的移動、窗口的最小化等等。
我們常常聽到的 KDE, GNOME, XFCE 還有陽春到爆的 twm 等等,都是一些窗口管理員的專案計劃啦! 這些專案計劃中,每種窗口管理員所用以開發的顯示發動機都不太相同,所著重的方向也不一樣, 因此我們才會說,在 Linux 下面,每套 Window Manager 都是獨特存在的,不是換了桌面與顯示效果而已, 而是連顯示的發動機都不會一樣喔!下面是這些常見的窗口管理員全名與鏈接:
* GNOME (GNU Network Object Model Environment):[http://www.gnome.org/](http://www.gnome.org/)
* KDE (K Desktop Enviroment):[http://kde.org/](http://kde.org/)
* twm (Tab Window Manager):[http://xwinman.org/vtwm.php](http://xwinman.org/vtwm.php)
* XFCE (XForms Common Environment):[http://www.xfce.org/](http://www.xfce.org/)
由于 Linux 越來越朝向 Desktop 桌面電腦使用方向走,因此窗口管理員的角色會越來越重要! 目前我們 CentOS 默認提供的有 GNOME 與 KDE ,這兩個窗口管理員上面還有提供非常多的 X client 軟件, 包括辦公室生產力軟件 (Open Office) 以及常用的網絡功能 (firefox 瀏覽器、 Thunderbird 收發信件軟件) 等。 現在使用者想要接觸 Linux 其實真的越來越簡單了,如果不要架設服務器,那么 Linux 桌面的使用與 Windows 系統可以說是一模一樣的!不需要學習也能夠入門哩! ^_^
那么你知道 X Server / X client / window manager 的關系了嗎?我們舉 CentOS 默認的 GNOME 為例好了, 由于我們要在本機端啟動 X Window system ,因此,在我們的 CentOS 主機上面必須要有 Xorg 的 X server 核心, 這樣才能夠提供屏幕的繪制啊~然后為了讓窗口管理更方便,于是就加裝了 GNOME 這個計劃的 window manager , 然后為了讓自己的使用更方便,于是就在 GNOME 上面加上更多的窗口應用軟件,包括輸入法等等的, 最后就建構出我們的 X Window System 啰~ ^_^!所以你也會知道,X server/X client/Window Manager 是同時存在于我們一部 Linux 主機上頭的啦!
* Display Manager:提供登陸需求
談完了上述的數據后,我們得要了解一下,那么我如何取得 X Window 的控制?在本機的命令行下面你可以輸入 startx 來啟動 X 系統,此時由于你已經登陸系統了,因此不需要重新登陸即可取得 X 環境。但如果是 graphical.target 的環境呢?你會發現在 tty1 或其他 tty 的地方有個可以讓你使用圖形接口登陸 (輸入帳號密碼) 的咚咚,那個是啥? 是 X Server/X client 還是什么的?其實那是個 Display Manager 啦!這個 display manager 最大的任務就是提供登陸的環境, 并且載入使用者選擇的 Window Manager 與語系等數據喔!
幾乎所有的大型窗口管理員專案計劃都會提供 display manager 的,在 CentOS 上面我們主要利用的是 GNOME 的 GNOME Display Manager (gdm) 這支程序來提供 tty1 的圖形接口登陸喔!至于登陸后取得的窗口管理員, 則可以在 gdm 上面進行選擇的!我們在[第四章](../Text/index.html#start_startx)介紹的登陸環境, 那個環境其實就是 gdm 提供的啦!再回去參考看看圖示吧! ^_^!所以說,并非 gdm 只能提供 GNOME 的登陸而已喔!
### 23.1.3 X Window 的啟動流程
現在我們知道要啟動 X Window System 時,必須要先啟動管理硬件與繪圖的 X Server ,然后才載入 X Client 。 基本上,目前都是使用 Window Manager 來管理窗口接口風格的。那么如何取得這樣的窗口系統呢? 你可以通過登陸本機的命令行后,輸入 startx 來啟動 X 窗口;也能夠通過 display manager (如果有啟動 graphical.target) 提供的登陸畫面,輸入你的帳號密碼來登陸與取得 X 窗口的!
問題是,你的 X server 配置文件為何?如何修改分辨率與顯示器?你能不能自己設置默認啟動的窗口管理員? 如何設置默認的使用者環境 (與 X client 有關) 等等的,這些數據都需要通過了解 X 的啟動流程才能得知! 所以,下面我們就來談談如何啟動 X 的流程吧! ^_^
* 在命令行啟動 X :通過 startx 指令
我們都知道 Linux 是個多用戶多任務的操作系統,所以啦,X 窗口也是可以根據不同的使用者而有不同的設置! 這也就是說,每個用戶啟動 X 時, X server 的分辨率、啟動 X client 的相關軟件及 Window Manager 的選擇可能都不一樣! 但是,如果你是首次登陸 X 呢?也就是說,你自己還沒有創建自己的專屬 X 畫面時,系統又是從哪里給你這個 X 默認畫面呢?而如果你已經設置好相關的信息,這些信息又是存放于何處呢?
事實上,當你在純命令行且并沒有啟動 X 窗口的情況下來輸入 startx 時,這個 startx 的作用就是在幫你設置好上頭提到的這些動作啰! startx 其實是一個 shell script ,他是一個比較友好的程序,會主動的幫忙使用者創建起他們的 X 所需要引用的配置文件而已。你可以自行研究一下 startx 這個 script 的內容,鳥哥在這里僅就 startx 的作用作個介紹。
startx 最重要的任務就是找出使用者或者是系統默認的 X server 與 X client 的配置文件,而使用者也能夠使用 startx 外接參數來取代配置文件的內容。這個意思是說:startx 可以直接啟動,也能夠外接參數,例如下面格式的啟動方式:
```
[root@study ~]# startx [X client 參數] -- [X server 參數]
# 范例:以色彩深度為 16 bit 啟動 X
[root@study ~]# startx -- -depth 16
```
startx 后面接的參數以兩個減號“--”隔開,前面的是 X Client 的設置,后面的是 X Server 的設置。 上面的范例是讓 X server 以色彩深度 16 bit 色 (亦即每一像素占用 16 bit ,也就是 65536 色) 顯示, 因為色彩深度是與 X Server 有關的,所以參數當然是寫在 -- 后面啰,于是就成了上面的模樣!
你會發現,鳥哥上面談到的 startx 都是提到如何找出 X server / X client 的設置值而已! 沒錯,事實上啟動 X 的是 xinit 這支程序, startx 僅是在幫忙找出設置值而已!那么 startx 找到的設置值可用順序為何呢?基本上是這樣的:
* X server 的參數方面:
1. 使用 startx 后面接的參數;
2. 若無參數,則找尋使用者主文件夾的文件,亦即 ~/.xserverrc
3. 若無上述兩者,則以 /etc/X11/xinit/xserverrc
4. 若無上述三者,則單純執行 /usr/bin/X (此即 X server 可執行文件)
* X client 的參數方面:
1. 使用 startx 后面接的參數;
2. 若無參數,則找尋使用者主文件夾的文件,亦即 ~/.xinitrc
3. 若無上述兩者,則以 /etc/X11/xinit/xinitrc
4. 若無上述三者,則單純執行 xterm (此為 X 下面的終端機軟件)
根據上述的流程找到啟動 X 時所需要的 X server / X client 的參數,接下來 startx 會去調用 xinit 這支程序來啟動我們所需要的 X 窗口系統整體喔!接下來當然就是要談談 xinit 啰~
* 由 startx 調用執行的 xinit
事實上,當 startx 找到需要的設置值后,就調用 xinit 實際啟動 X 的。他的語法是:
```
[root@study ~]# xinit [client option] -- [server or display option]
```
那個 client option 與 server option 如何下達呢?其實那兩個咚咚就是由剛剛 startx 去找出來的啦! 在我們通過 startx 找到適當的 xinitrc 與 xserverrc 后,就交給 xinit 來執行。 在默認的情況下 (使用者尚未有 ~/.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 的內容是這樣的:[[3]](#ps3)
```
xinit xterm -geometry +1+1 -n login -display :0 -- X :0
```
在 X client 方面:那個 xterm 是 X 窗口下面的虛擬終端機,后面接的參數則是這個終端機的位置與登陸與否。 最后面會接一個“ -display :0 ”表示這個虛擬終端機是啟動在“第 :0 號的 X 顯示接口”的意思。至于 X Server 方面, 而我們啟動的 X server 程序就是 X 啦!其實 X 就是 Xorg 的鏈接文件,亦即是 X Server 的主程序啰! 所以我們啟動 X 還挺簡單的~直接執行 X 而已,同時還指定 X 啟動在第 :0 個 X 顯示接口。 如果單純以上面的內容來啟動你的 X 系統時,你就會發現 tty2 以后的終端機有畫面了!只是.....很丑~因為我們還沒有啟動 window manager 啊!
從上面的說明我們可以知道, xinit 主要在啟動 X server 與載入 X client ,但這個 xinit 所需要的參數則是由 startx 去幫忙找尋的。因此,最重要的當然就是 startx 找到的那些參數啦! 所以呢,重點當然就是 /etc/X11/xinit/ 目錄下的 xinitrc 與 xserverrc 這兩個文件的內容是啥啰~ 雖然 xserverrc 默認是不存在的。下面我們就分別來談一談這兩個文件的主要內容與啟動的方式~
* 啟動 X server 的文件: xserverrc
X 窗口最先需要啟動的就是 X server 啊,那 X server 啟動的腳本與參數是通過 /etc/X11/xinit/ 里面的 xserverrc 。不過我們的 CentOS 7.x 根本就沒有 xserverrc 這個文件啊! 那使用者主文件夾目前也沒有 ~/.xserverrc ,這個時候系統會怎么做呢?其實就是執行 /usr/bin/X 這個指令啊! 這個指令也是系統最原始的 X server 可執行文件啰。
在啟動 X Server 時,Xorg 會去讀取 /etc/X11/xorg.conf 這個配置文件。針對這個配置文件的內容, 我們會在下個小節介紹。如果一切順利,那么 X 就會順利的在 tty2 以后終端環境中啟動了 X 。 單純的 X 啟動時,你只會看到畫面一片漆黑,然后中心有個鼠標的光標而已~
由前一小節的說明中,你可以發現到其實 X 啟動的時候還可以指定啟動的接口喔!那就是 :0 這個參數,這是啥? 事實上我們的 Linux 可以“同時啟動多個 X”喔!第一個 X 的畫面會在 :0 亦即是 tty2 ,第二個 X 則是 :1 亦即是 tty3 。 后續還可以有其他的 X 存在的。因此,上一小節我們也有發現, xterm 在載入時,也必須要使用 -display 來說明, 這個 X 應用程序是需要在哪個 X 載入的才行呢!其中比較有趣的是, X server 未注明載入的接口時,默認是使用 :0 ~ 但是 X client 未注明時,則無法執行喔!

**Tips** CentOS 7 的 tty 非常有趣!如果你在[分析 systemd 的章節中](../Text/index.html#systemd_cfg_repeat)有仔細看的話, 會發現到其實 tty 是有用到才會啟動的,這與之前 CentOS 6 以前的版本默認啟用 6 個 tty 給你是不同的。因此,如果你只有用到 tty1 的話, 那么啟動 X 就會默認丟到 tty2 ,而 X :1 就會丟到 tty3 這樣~以此類推喔~
啟動了 X server 后,接下來就是載入 X client 到這個 X server 上面啦!
* 啟動 X Client 的文件: xinitrc
假設你的主文件夾并沒有 ~/.xinitrc ,則此時 X Client 會以 /etc/X11/xinit/xinitrc 來作為啟動 X Client 的默認腳本。xinitrc 這個文件會將很多其他的文件參數引進來, 包括 /etc/X11/xinit/xinitrc-common 與 /etc/X11/xinit/Xclients 還有 /etc/sysconfig/desktop 。你可以參考 xinitrc 后去搜尋各個文件來了解彼此的關系。
不過分析到最后,其實最終就是載入 KDE 或者是 GNOME 而已。你也可以發現最終在 XClient 文件當中會有兩個指令的搜尋, 包括 startkde 與 gnome-session 這兩個,這也是 CentOS 默認會提供的兩個主要的 Window Manager 啰。 而你也可以通過修改 /etc/sysconfig/desktop 內的 DESKTOP=GNOME 或 DESKTOP=KDE 來決定默認使用哪個窗口管理員的。 如果你并沒有安裝這兩個大家伙,那么 X 就會去使用陽春的 twm 這個窗口管理員來管理你的環境啰。

**Tips** 不論怎么說,鳥哥還是希望大家可以通過解析 startx 這個 script 的內容去找到每個文件, 再根據分析每個文件來找到您 distributions 上面的 X 相關文件~ 畢竟每個版本的 Linux 還是有所差異的~
另外,如果有特殊需求,你當然可以自訂 X client 的參數!這就得要修改你主文件夾下的 ~/.xinitrc 這個文件啰。 不過要注意的是,如果你的 .xinitrc 配置文件里面有啟動的 x client 很多的時候,千萬注意將除了最后一個 window manager 或 X Client 之外,都放到背景里面去執行啊!舉例來說,像下面這樣:
```
xclock -geometry 100x100-5+5 &
xterm -geometry 80x50-50+150 &
exec /usr/bin/twm
```
意思就是說,我啟動了 X ,并且同時啟動 xclock / xterm / twm 這三個 X clients 喔! 如此一來,你的 X 就有這三個咚咚可以使用了!如果忘記加上 & 的符號,那就..... 會讓系統等待啊,而無法一次就登陸 X 呢!
* X 啟動的端口
好了,根據上面的說明,我們知道要在命令行下面啟動 X 時,直接使用 startx 來找到 X server 與 X client 的參數或配置文件, 然后再調用 xinit 來啟動 X 窗口系統。xinit 先載入 X server 到默認的 :0 這個顯示接口,然后再載入 X client 到這個 X 顯示接口上。而 X client 通常就是 GNOME 或 KDE ,這兩個設置也能夠在 /etc/sysconfig/desktop 里面作好設置。最后我們想要了解的是,既然 X 是可以跨網絡的,那 X 啟動的端口是幾號?
其實,CentOS 由于考慮 X 窗口是在本機上面運行,因此將端口改為插槽檔 (socket) 了,因此你無法觀察到 X 啟動的端口的。事實上, X server 應該是要啟動一個 port 6000 來與 X client 進行溝通的! 由于系統上面也可能有多個 X 存在,因此我們就會有 port 6001, port 6002... 等等。這也就是說:(假設為 multi-user.target 模式, 且用戶僅曾經切換到 tty1 而已)
| X 窗口系統 | 顯示接口號碼 | 默認終端機 | 網絡監聽端口 |
| --- | --- |
| 第一個 X | hostname:0 | tty2 | port 6000 |
| 第二個 X | hostname:1 | tty3 | port 6001 |
在 X Window System 的環境下,我們稱 port 6000 為第 0 個顯示接口,亦即為 hostname:0 , 那個主機名稱通常可以不寫,所以就成了 :0 即可。在默認的情況下,第一個啟動的 X (不論是啟動在第幾個 port number) 是在 tty2 ,亦即按下 [ctrl]+[Alt]+[F2] 那個畫面。 而起動的第二個 X (注意到了吧!可以有多個 X 同時啟動在您的系統上呢) 則默認在 tty3 亦即 [ctrl]+[Alt]+[F3] 那個畫面呢!很神奇吧! ^_^
如前所述,因為主機上的 X 可能有多個同時存在,因此,當我們在啟動 X Server / Client 時, 應該都要注明該 X Server / Client 主要是提供或接受來自哪個 display 的 port number 才行。
### 23.1.4 X 啟動流程測試
好了,我們可以針對 X Server 與 X client 的架構來做個簡單的測試喔! 這里鳥哥假設你的 tty1 是 multi-user.target 的,而且你也曾經在 tty2 測試過相關的指令,所以你的 X :1 將會啟用在 tty3 喔! 而且,下面的指令都是在 tty1 的地方執行的,至于下面的畫面則是在 tty3 的地方展現。 因此,請自行切換 tty1 下達指令與 tty3 查閱結果啰!
```
1\. 先來啟動第一個 X 在 :1 畫面中:
[dmtsai@study ~]$ X :1 &
```
圖23.1.3、單純啟動 X server的情況
上述的 X 是大寫,那個 :1 是寫在一起的,至于 & 則是放到背景去執行。此時系統會主動的跳到第二個圖形接口終端機,亦即 tty8 上喔!所以如果一切順利的話,你應該可以看到一個 X 的鼠標光標可以讓你移動了(如上圖所示)。 該畫面就是 X Server 啟動的畫面啰!丑丑的,而且沒有什么 client 可以用啊! 接下來,請按下 [ctrl]+[alt]+[F1] 回到剛剛下達指令的終端機: (若沒有 xterm 請自行 yum 安裝它!)
```
2\. 輸入數個可以在 X 當中執行的虛擬終端機
[dmtsai@study ~]$ xterm -display :1 &
[dmtsai@study ~]$ xterm -display :1 &
```
圖23.1.4、在 X 上面啟動 xterm 終端機顯示的結果
那個 xterm 是必須要在 X 下面才能夠執行的終端機接口。加入的參數 -display 則是指出這個 xterm 要在那個 display 使用的。這兩個指令請不要一次下完!先執行一次,然后按下 [ctrl]+[alt]+[F3] 去到 X 畫面中,你會發現多了一個終端機啰~ 不過,可惜的是,你無法看到終端機的標題、也無法移動終端機,當然也無法調整終端機的大小啊!我們回到剛剛的 tty1 然后再次下達 xterm 指令,理論上應該多一個終端機,去到 tty3 查閱一下。唉~沒有多出一個終端機啊? 這是因為兩個終端機重疊了~我們又無法移動終端機,所以只看到一個。 接下來,請再次回到 tty1 去下達指令吧!(可能需要 yum install xorg-x11-apps 喔!)
```
3\. 在輸入不同的 X client 觀察觀察,分別去到 tty3 觀察喔!
[dmtsai@study ~]$ xclock -display :1 &
[dmtsai@study ~]$ xeyes -display :1 &
```
圖23.1.5、分別啟動 xclock 時鐘與 xeyes 眼睛的結果
跟前面一樣的,我們又多執行了兩個 X client ,其中 xclock 會顯示時鐘,而 xeyes 則是會出現一雙大眼睛來盯著光標! 你可以移動一下光標就可以發現眼睛的焦聚會跑啊 ^_^!不過,目前的四個 X client 通通不能夠移動與放大縮小! 如此一來,你怎么在 xterm 下面下達指令啊?當然就很困擾~所以讓我們來載入最陽春的窗口管理員吧!
```
4\. 輸入可以管理的 window manager,我們這邊先以 root 來安裝 twm 喔!
[root@study ~]# yum install http://ftp.ksu.edu.tw/FTP/CentOS/6/os/x86_64/\
> Packages/xorg-x11-twm-1.0.3-5.1.el6.x86_64.rpm
# 真要命!CentOS 7 說 twm 已經沒有在維護,所以沒有提供這玩意兒了!鳥哥只好拿舊版的 twm 來安裝!
# 請您自行到相關的網站上找尋這個 twm 啰!因為版本可能會不一樣!
[root@study ~]# yum install xorg-x11-fonts-{100dpi,75dpi,Type1}
5\. 接下來就可以開始用 dmtsai 的身份來玩一下這玩意兒了!
[dmtsai@study ~]$ twm -display :1 &
```
圖23.1.6、窗口管理員 twm 的功能顯示
回到 tty1 后,用最簡單的 twm 這個窗口管理員來管理我們的 X 吧!輸入之后,去到 tty3 看看,用鼠標移動一下終端機看看?可以移動了吧?也可以縮小放大窗口啰~同時也出現了標題提示啰~也看到兩個終端機啦! 現在終于知道窗口管理員的重要性了吧? ^_^!在黑屏幕地方按下鼠標右鍵,就會出現類似上面畫面最右邊的菜單, 你就可以進行額外的管理啰~玩玩看先!
```
6\. 將所有剛剛創建的 X 相關工作全部殺掉!
[dmtsai@study ~]# kill %6 %5 %4 %3 %2 %1
```
很有趣的一個小實驗吧~通過這個實驗,你應該會對 X server 與 Window manager 及 tty3 以后的終端接口使用方式有比較清楚的了解~加油!
### 23.1.5 我是否需要啟用 X Window System
談了這么多 X 窗口系統方面的信息后,再來聊聊,那么你的 Linux 主機是否需要默認就啟動 X 窗口呢? 一般來說,如果你的 Linux 主機定位為網絡服務器的話,那么由于 Linux 里面的主要服務的配置文件都是純文本的格式文件, 相當的容易設置的,所以啊,根本就是不需要 X Window 存在呢!因為 X Window 僅是 Linux 系統內的一個軟件而已啊!
但是萬一你的 Linux 主機是用來作為你的桌上計算機用的,那么 X Window 對你而言,就是相當重要的一個咚咚了!因為我們日常使用的辦公室軟件,都需要使用到 X Window 圖形的功能呢!此外,以鳥哥的例子來說,俺之前接觸到的數值分析模式,需要利用圖形處理軟件來將數據讀取出來, 所以在那部 Linux 主機上面,我一定需要 X Window 的。
由于目前的主機系統配備已經很不錯,除非你使用的是單版計算機,否則桌面電腦、筆記本電腦的系統配備要拿來跑 X window 大概都不是問題! 所以,是否默認要啟用你的 X window 系統,完全掌握在你的服務器用途考慮上啰!!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀