Linux 桌面玩家指南:09. X Window 的奧祕

原文: Linux 桌面玩家指南:09. X Window 的奧祕

特別說明:要在個人隨筆後寫評論的小夥伴們請注意了,個人博客開啓了 MathJax 數學公式支持,MathJax 使用$標記數學公式的開始和結束。若是某條評論中出現了兩個$,MathJax 會將兩個$之間的內容按照數學公式進行排版,從而致使評論區格式混亂。若是你們的評論中用到了$,可是又不是爲了使用數學公式,就請使用\$轉義一下,謝謝。html

想從頭閱讀該系列嗎?下面是傳送門:編程

前言

大名鼎鼎的 X Window 你們確定不陌生。都知道它是 Unix/Linux 下面的窗口系統,也都知道它基於 Server/Clinet 架構。在網上隨便搜一搜,也能夠找到很多 X Window 的介紹。有很多文章爲了給用戶留一個直觀的印象,每每先讓系統進入純文本界面,而後使用 startx 來啓動圖形界面,或者直接使用 X 來啓動 X Server,再而後運行一個 xterm 來作示範。我以爲以上這些文章對 X Window 的理解有限,不夠深刻。因此,我這裏寫一篇《X Window 的奧祕》,以最新的 Ubuntu-18.10 Desktop 爲例,展現如何學習 X Window。vim

10 月是一個比較開心的月份。在這個月中,陸續發佈了最新的 Ubuntu 18.10 和 Fedora 29,還有人在個人博客中問關於 CentOS 7 的問題。CentOS 7 當然是一個優秀的發行版,但並非做爲桌面系統的首選,Gnome 的版本太舊,官方倉庫中的軟件包也不夠豐富,美化起來比較困難。在這一篇中,我要展現遠程鏈接 X Server 的操做,須要兩個外觀差距稍微大一點的 Linux 桌面系統,因此選擇了 CentOS 7 和 Ubuntu 18.10。安全

Ubuntu 18.10 此次外觀大變樣,使用了 Yaru 主題,下面的截圖展現了其中 Terminal 和 GVim 的外觀:
bash

而 CentOS 7 默認的外觀實在太醜,因此我給他換上了最流行的 adapta-gtk-theme 和 paper-icon-theme,下面的截圖展現了其中 Terminal 和 GVim 的外觀:
網絡

這兩種風格應該是比較好區分的,在後文中,很容易經過外觀來判斷一個 GUI 程序究竟來自於哪個系統。架構

瞭解本身機器上的 X Window

X Window 實際上是一種規範,它有不少不一樣的實現,在 Linux 系統下最流行的是實現 Xorg 和 XFree86,微軟 Windows 系統下也有 X Window 的實現,蘋果的 Mac 也是 X Window 的一種實現。要了解本身機器上運行的 X Window 到底是哪個,可使用查看進程的ps命令,以下圖:
ssh

從上圖能夠看出,Ubuntu 18.10 使用的 X Window 是 Xorg。若是使用ps -ef命令,還能夠看到 Xorg 運行時的命令行參數。tcp

想了解 X Window,下面這些文檔須要看一遍先:
編程語言

下面來講一下也許是衆所周知的基礎知識:X Window 是一個分層的架構,它分爲 Serve 和 Client。X Server 負責圖形界面的顯示,(也負責用戶的輸入),而Client 程序須要鏈接到 X Server,而後請求 X Server 繪製圖形界面,同時從 X Server 接受用戶的輸入。在桌面系統上,X Server 和 Client 程序每每安裝在同一臺機器上,平常使用基本感受不到它是分層的。可是很顯然,X Server 和 Client 也能夠分別運行在不一樣的機器上,在一臺機器上運行程序,而在另一臺機器上顯示圖形界面。

X Window 中的 Server 和 Client 的概念和咱們平時接觸到的「Server/Client」概念恰好相反。不少熟悉 Internet 原理的人,第一次接觸 X Window 的這兩個概念都會搞錯。好比,我在一臺本地機器上運行 Ubuntu 18.10 桌面版,而在另一臺遠程機器上運行 CentOS 7(純字符界面),當我用 ssh 從 Ubuntu 鏈接到 CentOS 的時候,Ubuntu 是 Client,而 CentOS 是 Server。在 X Window 中,Server 恰恰是我面前的這臺 Ubuntu,X Server 運行在 Ubuntu 上。我能夠在 CentOS 中運行 GVim,可是窗口顯示在 Ubuntu 中,這時,GVim 是一個 Client 程序,它在遠程機器上運行,而它的窗口顯示在本地。

理解 display 和虛擬控制檯

前面提到網上不少介紹 X Window 的文章都是先讓系統進入字符界面,而後手動啓動一個 X Server。其實這徹底沒有必要,由於在同一臺機器上徹底能夠運行多個 X Server,只須要讓每一個 X Server 的 display 不一樣便可。那麼 display 到底是什麼呢?

在 X Window 中,能夠經過hostname:display_number.screen_number來指定一個屏幕。能夠這樣理解:一臺計算機能夠有多個 display,一個 display 能夠有多個屏幕。因此,display 至關因而計算機配備的一套輸入輸出設備,通常狀況下,一臺電腦只配一套鍵盤鼠標和一個顯示器,特殊狀況下,能夠配多個顯示器。

如今問題出來了,個人電腦只有一套鍵盤鼠標和一個顯示器,也就是隻有一個 display,那又怎麼能運行多個 X Server 呢?那是由於在 Linux 中,還有虛擬控制檯這樣的高級特性。只須要同時按下 Ctrl+Alt+F一、Ctrl+Alt+F二、...、Ctrl+Alt+F7,就能夠在不一樣的虛擬控制檯中進行切換。在 Ubuntu 18.10 中,虛擬控制檯 3 到 6 運行的是 agetty,也就是字符界面,虛擬控制檯 2 運行的是 Xorg。(Fedora 中不同,虛擬控制檯 1 運行的是圖形界面,其它的是字符界面。)以下圖:

咱們能夠直接運行 X Server 程序來啓動 X Server。/usr/bin/X 和 Xorg 都是 X Server 程序。其實 /usr/bin/X 是 Xorg 的符號連接,用哪個都是同樣的。

啓動 X Server 的時候能夠指定 display 參數,由於能夠省略掉 hostname 和 screen_number,因此能夠用:0:1這樣的格式來指定 display。在個人機器上,原本就有一個 X Server 在運行,display :0 已經被佔用了,因此我使用 sudo X vt8 :1 -auth /run/user/1000/gdm/Xauthority -retro 來在 display :1 上再運行一個 X Server,以下圖:

其中的 -retro 參數是爲了讓 X Server 的背景顯示爲斜紋,不然背景爲純黑色,那就看不出來是否啓動了 X Server。vt8 參數指定將新啓動的 X Server 放到第 8 個虛擬控制檯。:1參數指定新啓動的 X Server 的 display number。啓動 X Server 後的效果以下圖:

按 Ctrl+Alt+F2 回到 display :0,在新啓動的 X Server 中運行一個 GVim 看看效果。運行 GVim 時,使用-display :1參數指定窗口顯示在新啓動的 X Server 上,使用 -geometry參數指定窗口的大小和位置。

再按 Ctrl+Alt+F8 切換到 display :1,看效果。以下:

不知道爲何,在 Ubuntu 18.10 中的虛擬控制檯中切換兩下,新啓動的 X Server 就會崩潰退出。並且切換到虛擬控制檯 8 再切換回來,個人 Ubuntu 桌面的分辨率也變成了 800x600,很是不爽。固然,這裏的展現只是爲了證實能在一臺機器上運行兩個 X Server,能看到效果就行。

遠程鏈接 X Server

前面展現的在一個系統中運行兩個 Xorg 並非很吸引人,畢竟新啓動的 X Server 太醜了,並且 Xorg 的參數一大堆,不是很容易搞。既然 X Client 和 X Server 能夠分佈在不一樣的機器上,那麼,若是咱們可以把別的系統中的 GUI 程序顯示到本地機器中,那才比較過癮。理論上講,若是在前面提到的 CentOS 7 中運行gvim -display 192.168.40.135:0命令(這裏的 192.168.40.135 是 Ubuntu 18.10 系統的內網 IP),就應該能夠把界面顯示到 Ubuntu 18.10 桌面上,反之,若是在 Ubuntu 18.10 中運行gvim -display 192.168.40.130:0命令(這裏的 192.168.40.130 是 CentOS 7 系統的內網 IP),就能夠把界面顯示到 CentOS 7 中。

可是,這是行不通的。行不通的緣由首先是 Xorg 複雜的認證機制。若是沒有認證機制把關,隨便就能讓別的系統把圖形界面甩過來,那桌面上豈不是垃圾窗口滿天飛嗎?其次,Xorg 在啓動時每每會帶上-nolisten tcp參數,禁止接受從 TCP/IP 網絡上傳過來的鏈接請求。要禁用該選項,每每須要去更改 gdm 的配置文件。

我這裏就不折騰這些複雜的認證機制和命令行參數了,我這裏來點簡單的。最簡單的把遠程機器上的圖形界面帶回本地桌面的方式,是使用 SSH 的 X11 Forwarding 功能。該功能用起來很是簡單,只須要在使用ssh命令鏈接遠程機器的時候,加上-X或者-Y參數就能夠了。以下圖,我在 Ubuntu 18.10 中使用ssh -X 192.168.40.130遠程鏈接到 CentOS 7 中,而後再運行gvim命令,該 GVim 窗口就顯示在了 Ubuntu 的桌面中。

反之,若是在 CentOS 7 中使用ssh -X 192.168.40.135遠程鏈接到 Ubuntu 18.10 中,在運行gvim命令,就能夠把 Ubuntu 中的 GVim 顯示到 CentOS 7 的桌面中,以下圖:

SSH 的 X11 Forwarding 是一個很是強大的功能。咱們甚至能夠把 Linux 中的圖形界面顯示到 Windows 中,只須要在 Windows 中運行一個 X Server 便可。我選擇的軟件是 XMing,而後使用 PuTTY 鏈接到 Linux 系統。在 PuTTY 的設置中,開啓 X11 Forwarding 功能,以下圖:

而後能夠把 Linux 桌面中的圖形界面帶入 Windows 桌面,以下圖:

理解 DisplayManager 和 X Window 桌面環境的啓動過程

X Server 的啓動方式有兩種,一種是經過顯示管理器啓動,另外一種是手動啓動。在前面的例子中,我經過直接運行sudo X vt8 :1 -auth /run/user/1000/gdm/Xauthority -retro來啓動了一個 X Server,這就是手動啓動。手動啓動 X Server 的方法還有運行 startx 或者 xinit。手動啓動 X Server 的缺點就是啓動的 X Server 很差看。而顯示管理器啓動的不只有 X Server,還有一大堆的 Client 程序,構成了一個完整的桌面環境,界面固然就漂亮多了。

顯示管理器(Display Manager)是什麼呢?前面我講到 display 就是一個電腦配備的一套鍵盤鼠標和顯示器,那麼顯示管理器就是這一套設備的管理器了。顯示管理器能夠直接管理這些設備,因此它能夠控制 X Server 的運行,由它來啓動 X Server 那是再合適不過了。系統啓動過程是這樣的:內核加載-->init程序運行-->顯示管理器運行--> X Server 運行-->顯示管理器鏈接到 X Server,顯示登陸界面-->用戶登陸後,登陸界面關閉,加載桌面環境。從上面的流程能夠看出,顯示管理器是 X Server 的父進程,它負責啓動 X Server,當 X Server 啓動後,它又變成了 X Server 的一個 Client 程序,鏈接到 X Server 顯示歡迎界面和登陸界面,最後,顯示管理器又是全部桌面環境的父進程,它負責啓動桌面環境須要的其它 Client 程序。

在 Ubuntu 的早期版本中,使用 lightdm 取代了傳統的 xdm、gdm 等顯示管理器。從 Ubuntu 17.10 開始,Ubuntu 放棄了 Unity 桌面而回歸 Gnome 3,則顯示管理器又變回 gdm 了。

可使用不一樣的方法對 X Server 進行配置,前面的例子是直接指定命令行參數。除了指定命令行參數,還可使用環境變量和配置文件。X Server 的配置文件爲通常是 /etc/X11/xorg.conf 或 /etc/X11/xorg.conf.d/ 目錄下的 .conf 文件,固然,配置文件也能夠放在其它的目錄中,具體信息,請參看 man xorg.conf。

若是沒有配置文件,X Server 將在啓動的時候自動檢測硬件,而後生成一個內置的配置。Ubuntu 系統就沒有配置文件。不過不要緊,若是須要使用配置文件的時候,能夠經過 X Server 的 -configure 參數生成一個配置文件,裏面包含當前自動檢測出的配置。若是須要任何個性化的配置,對該文件進行修改便可。

運行嵌套的 X Server

咱們上面運行的 X Server 都是直接佔用了計算機的整個顯示器和鍵盤鼠標,事實上,在現有的圖形界面中,還能夠以窗口模式運行另一個 X Server,稱爲 nested X Server。最經常使用的 nested X Server 是 Xephyr,在 Ubuntu 中能夠經過以下命令安裝它:

sudo aptitude install xserver-xephyr

Xephyr 的使用很是簡單,能夠經過man Xephyr命令查看它的使用手冊。若是輸入Xephyr :1 -screen 1024x768命令,就能夠在現有圖形界面中打開一個窗口模式的 X Server,其中-screen參數用來指定 X Server 顯示區域的大小。之後再啓動 GUI 程序,就能夠經過程序的 -display :1 選項讓程序運行在這個嵌套的 X Server 中,以下圖:

怎麼樣,是否是很好玩呢?除了好玩,還頗有用,好比調試窗口管理器啊、鏈接遠程桌面啊什麼的都用得着。固然,我這裏只是簡單展現一下原來 X Window 還能夠這麼玩。

總結

1.在一個 Linux 系統中存在多個虛擬控制檯,因此能夠啓動多個 X Server;

2.啓動 X Server 的方式有兩種,一種是使用 /usr/bin/X、startx、xinit 手動啓動,一種是經過顯示管理器啓動;

3.遠程計算機鏈接本地的 X Server,須要 X Server 開放 TCP 端口,還要搞定安全認證;

4.若是以爲搞定 X Server 的 TCP 端口和安全認證太麻煩,可使用 SSH 的 X11 Forwarding 功能,遠程鏈接 X Server 超級方便;

5.X Server 的配置,能夠經過命令行參數,能夠經過環境變量,還能夠經過配置文件;

6.能夠在現有的圖形界面下以窗口模式運行嵌套的 X Server,經常使用的軟件是 Xephyr;

7.使用 XMing 和 PuTTY,把 Linux 圖形界面帶入 Windows 不是夢。

求打賞

我對此次寫的這個系列要求是很是高的:首先內容要有意義、夠充實,信息量要足夠豐富;其次是每個知識點要講透徹,不能模棱兩可含糊不清;最後是包含豐富的截圖,讓那些不想裝 Linux 系統的朋友們也能夠領略到 Linux 桌面的風采。若是個人努力獲得你們的承認,能夠掃下面的二維碼打賞一下:

版權申明

該隨筆由京山遊俠在2018年11月01日發佈於博客園,引用請註明出處,轉載或出版請聯繫博主。QQ郵箱:1841079@qq.com

相關文章
相關標籤/搜索