Linux 桌面玩家指南:09. X Window 的奥秘
特別說明:要在我的隨筆后寫評論的小伙伴們請注意了,我的博客開啟了 MathJax 數(shù)學(xué)公式支持,MathJax 使用$標(biāo)記數(shù)學(xué)公式的開始和結(jié)束。如果某條評論中出現(xiàn)了兩個$,MathJax 會將兩個$之間的內(nèi)容按照數(shù)學(xué)公式進行排版,從而導(dǎo)致評論區(qū)格式混亂。如果大家的評論中用到了$,但是又不是為了使用數(shù)學(xué)公式,就請使用\$轉(zhuǎn)義一下,謝謝。
想從頭閱讀該系列嗎?下面是傳送門:
- Linux 桌面玩家指南:01. 玩轉(zhuǎn) Linux 系統(tǒng)的方法論 【約 1.1 萬字,22 張圖片】
- Linux 桌面玩家指南:02. 以最簡潔的方式打造實用的 Vim 環(huán)境 【約 0.97 萬字,7 張圖片】
- Linux 桌面玩家指南:03. 針對 Gnome 3 的 Linux 桌面進行美化 【約 0.58 萬字,32 張圖片】
- Linux 桌面玩家指南:04. Linux 桌面系統(tǒng)字體配置要略 【約 1.2 萬字,34 張圖片】
- Linux 桌面玩家指南:05. 發(fā)博客必備的圖片處理和視頻錄制神器 【約 0.25 萬字,14 張圖片】
- Linux 桌面玩家指南:06. 優(yōu)雅地使用命令行及 Bash 腳本編程語言中的美學(xué)與哲學(xué) 【約 1.4 萬字,16 張圖片】
- Linux 桌面玩家指南:07. Linux 中的 Qemu、KVM、VirtualBox、Xen 虛擬機體驗 【約 0.95 萬字,31 張圖片】
- Linux 桌面玩家指南:08. 使用 GCC 和 GNU Binutils 編寫能在 x86 實模式運行的 16 位代碼 【約 0.6 萬字,17 張圖片】
前言
大名鼎鼎的 X Window 大家肯定不陌生。都知道它是 Unix/Linux 下面的窗口系統(tǒng),也都知道它基于 Server/Clinet 架構(gòu)。在網(wǎng)上隨便搜一搜,也可以找到不少 X Window 的介紹。有不少文章為了給用戶留一個直觀的印象,往往先讓系統(tǒng)進入純文本界面,然后使用 startx 來啟動圖形界面,或者直接使用 X 來啟動 X Server,再然后運行一個 xterm 來做示范。我覺得以上這些文章對 X Window 的理解有限,不夠深入。所以,我這里寫一篇《X Window 的奧秘》,以最新的 Ubuntu-18.10 Desktop 為例,展示如何學(xué)習(xí) X Window。
10 月是一個比較開心的月份。在這個月中,陸續(xù)發(fā)布了最新的 Ubuntu 18.10 和 Fedora 29,還有人在我的博客中問關(guān)于 CentOS 7 的問題。CentOS 7 固然是一個優(yōu)秀的發(fā)行版,但并不是作為桌面系統(tǒng)的首選,Gnome 的版本太舊,官方倉庫中的軟件包也不夠豐富,美化起來比較困難。在這一篇中,我要展示遠程連接 X Server 的操作,需要兩個外觀差距稍微大一點的 Linux 桌面系統(tǒng),所以選擇了 CentOS 7 和 Ubuntu 18.10。
Ubuntu 18.10 這次外觀大變樣,使用了 Yaru 主題,下面的截圖展示了其中 Terminal 和 GVim 的外觀:
而 CentOS 7 默認的外觀實在太丑,所以我給他換上了最流行的 adapta-gtk-theme 和 paper-icon-theme,下面的截圖展示了其中 Terminal 和 GVim 的外觀:
這兩種風(fēng)格應(yīng)該是比較好區(qū)分的,在后文中,很容易通過外觀來判斷一個 GUI 程序究竟來自于哪一個系統(tǒng)。
了解自己機器上的 X Window
X Window 其實是一種規(guī)范,它有很多不同的實現(xiàn),在 Linux 系統(tǒng)下最流行的是實現(xiàn) Xorg 和 XFree86,微軟 Windows 系統(tǒng)下也有 X Window 的實現(xiàn),蘋果的 Mac 也是 X Window 的一種實現(xiàn)。要了解自己機器上運行的 X Window 究竟是哪一個,可以使用查看進程的ps命令,如下圖:
從上圖可以看出,Ubuntu 18.10 使用的 X Window 是 Xorg。如果使用ps -ef命令,還可以看到 Xorg 運行時的命令行參數(shù)。
想了解 X Window,下面這些文檔需要看一遍先:
下面來說一下也許是眾所周知的基礎(chǔ)知識:X Window 是一個分層的架構(gòu),它分為 Serve 和 Client。X Server 負責(zé)圖形界面的顯示,(也負責(zé)用戶的輸入),而Client 程序需要連接到 X Server,然后請求 X Server 繪制圖形界面,同時從 X Server 接受用戶的輸入。在桌面系統(tǒng)上,X Server 和 Client 程序往往安裝在同一臺機器上,日常使用基本感覺不到它是分層的。但是很顯然,X Server 和 Client 也可以分別運行在不同的機器上,在一臺機器上運行程序,而在另外一臺機器上顯示圖形界面。
X Window 中的 Server 和 Client 的概念和我們平時接觸到的“Server/Client”概念剛好相反。很多熟悉 Internet 原理的人,第一次接觸 X Window 的這兩個概念都會搞錯。比如,我在一臺本地機器上運行 Ubuntu 18.10 桌面版,而在另外一臺遠程機器上運行 CentOS 7(純字符界面),當(dāng)我用 ssh 從 Ubuntu 連接到 CentOS 的時候,Ubuntu 是 Client,而 CentOS 是 Server。在 X Window 中,Server 偏偏是我面前的這臺 Ubuntu,X Server 運行在 Ubuntu 上。我可以在 CentOS 中運行 GVim,但是窗口顯示在 Ubuntu 中,這時,GVim 是一個 Client 程序,它在遠程機器上運行,而它的窗口顯示在本地。
理解 display 和虛擬控制臺
前面提到網(wǎng)上很多介紹 X Window 的文章都是先讓系統(tǒng)進入字符界面,然后手動啟動一個 X Server。其實這完全沒有必要,因為在同一臺機器上完全可以運行多個 X Server,只需要讓每個 X Server 的 display 不同即可。那么 display 究竟是什么呢?
在 X Window 中,可以通過hostname:display_number.screen_number來指定一個屏幕。可以這樣理解:一臺計算機可以有多個 display,一個 display 可以有多個屏幕。所以,display 相當(dāng)于是計算機配備的一套輸入輸出設(shè)備,一般情況下,一臺電腦只配一套鍵盤鼠標(biāo)和一個顯示器,特殊情況下,可以配多個顯示器。
現(xiàn)在問題出來了,我的電腦只有一套鍵盤鼠標(biāo)和一個顯示器,也就是只有一個 display,那又怎么能運行多個 X Server 呢?那是因為在 Linux 中,還有虛擬控制臺這樣的高級特性。只需要同時按下 Ctrl+Alt+F1、Ctrl+Alt+F2、...、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 參數(shù),因為可以省略掉 hostname 和 screen_number,所以可以用:0,:1這樣的格式來指定 display。在我的機器上,本來就有一個 X Server 在運行,display :0 已經(jīng)被占用了,所以我使用 sudo X vt8 :1 -auth /run/user/1000/gdm/Xauthority -retro 來在 display :1 上再運行一個 X Server,如下圖:
其中的 -retro 參數(shù)是為了讓 X Server 的背景顯示為斜紋,否則背景為純黑色,那就看不出來是否啟動了 X Server。vt8 參數(shù)指定將新啟動的 X Server 放到第 8 個虛擬控制臺。:1參數(shù)指定新啟動的 X Server 的 display number。啟動 X Server 后的效果如下圖:
按 Ctrl+Alt+F2 回到 display :0,在新啟動的 X Server 中運行一個 GVim 看看效果。運行 GVim 時,使用-display :1參數(shù)指定窗口顯示在新啟動的 X Server 上,使用 -geometry參數(shù)指定窗口的大小和位置。
再按 Ctrl+Alt+F8 切換到 display :1,看效果。如下:
不知道為什么,在 Ubuntu 18.10 中的虛擬控制臺中切換兩下,新啟動的 X Server 就會崩潰退出。而且切換到虛擬控制臺 8 再切換回來,我的 Ubuntu 桌面的分辨率也變成了 800x600,非常不爽。當(dāng)然,這里的展示只是為了證明能在一臺機器上運行兩個 X Server,能看到效果就行。
遠程連接 X Server
前面展示的在一個系統(tǒng)中運行兩個 Xorg 并不是很吸引人,畢竟新啟動的 X Server 太丑了,而且 Xorg 的參數(shù)一大堆,不是很容易搞。既然 X Client 和 X Server 可以分布在不同的機器上,那么,如果我們能夠把別的系統(tǒng)中的 GUI 程序顯示到本地機器中,那才比較過癮。理論上講,如果在前面提到的 CentOS 7 中運行g(shù)vim -display 192.168.40.135:0命令(這里的 192.168.40.135 是 Ubuntu 18.10 系統(tǒng)的內(nèi)網(wǎng) IP),就應(yīng)該可以把界面顯示到 Ubuntu 18.10 桌面上,反之,如果在 Ubuntu 18.10 中運行g(shù)vim -display 192.168.40.130:0命令(這里的 192.168.40.130 是 CentOS 7 系統(tǒng)的內(nèi)網(wǎng) IP),就可以把界面顯示到 CentOS 7 中。
但是,這是行不通的。行不通的原因首先是 Xorg 復(fù)雜的認證機制。如果沒有認證機制把關(guān),隨便就能讓別的系統(tǒng)把圖形界面甩過來,那桌面上豈不是垃圾窗口滿天飛嗎?其次,Xorg 在啟動時往往會帶上-nolisten tcp參數(shù),禁止接受從 TCP/IP 網(wǎng)絡(luò)上傳過來的連接請求。要禁用該選項,往往需要去更改 gdm 的配置文件。
我這里就不折騰這些復(fù)雜的認證機制和命令行參數(shù)了,我這里來點簡單的。最簡單的把遠程機器上的圖形界面帶回本地桌面的方式,是使用 SSH 的 X11 Forwarding 功能。該功能用起來非常簡單,只需要在使用ssh命令連接遠程機器的時候,加上-X或者-Y參數(shù)就可以了。如下圖,我在 Ubuntu 18.10 中使用ssh -X 192.168.40.130遠程連接到 CentOS 7 中,然后再運行g(shù)vim命令,該 GVim 窗口就顯示在了 Ubuntu 的桌面中。
反之,如果在 CentOS 7 中使用ssh -X 192.168.40.135遠程連接到 Ubuntu 18.10 中,在運行g(shù)vim命令,就可以把 Ubuntu 中的 GVim 顯示到 CentOS 7 的桌面中,如下圖:
SSH 的 X11 Forwarding 是一個非常強大的功能。我們甚至可以把 Linux 中的圖形界面顯示到 Windows 中,只需要在 Windows 中運行一個 X Server 即可。我選擇的軟件是 XMing,然后使用 PuTTY 連接到 Linux 系統(tǒng)。在 PuTTY 的設(shè)置中,開啟 X11 Forwarding 功能,如下圖:
然后可以把 Linux 桌面中的圖形界面帶入 Windows 桌面,如下圖:
理解 DisplayManager 和 X Window 桌面環(huán)境的啟動過程
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 程序,構(gòu)成了一個完整的桌面環(huán)境,界面當(dāng)然就漂亮多了。
顯示管理器(Display Manager)是什么呢?前面我講到 display 就是一個電腦配備的一套鍵盤鼠標(biāo)和顯示器,那么顯示管理器就是這一套設(shè)備的管理器了。顯示管理器可以直接管理這些設(shè)備,所以它可以控制 X Server 的運行,由它來啟動 X Server 那是再合適不過了。系統(tǒng)啟動過程是這樣的:內(nèi)核加載-->init程序運行-->顯示管理器運行--> X Server 運行-->顯示管理器連接到 X Server,顯示登錄界面-->用戶登錄后,登錄界面關(guān)閉,加載桌面環(huán)境。從上面的流程可以看出,顯示管理器是 X Server 的父進程,它負責(zé)啟動 X Server,當(dāng) X Server 啟動后,它又變成了 X Server 的一個 Client 程序,連接到 X Server 顯示歡迎界面和登錄界面,最后,顯示管理器又是所有桌面環(huán)境的父進程,它負責(zé)啟動桌面環(huán)境需要的其它 Client 程序。
在 Ubuntu 的早期版本中,使用 lightdm 取代了傳統(tǒng)的 xdm、gdm 等顯示管理器。從 Ubuntu 17.10 開始,Ubuntu 放棄了 Unity 桌面而回歸 Gnome 3,則顯示管理器又變回 gdm 了。
可以使用不同的方法對 X Server 進行配置,前面的例子是直接指定命令行參數(shù)。除了指定命令行參數(shù),還可以使用環(huán)境變量和配置文件。X Server 的配置文件為一般是 /etc/X11/xorg.conf 或 /etc/X11/xorg.conf.d/ 目錄下的 .conf 文件,當(dāng)然,配置文件也可以放在其它的目錄中,具體信息,請參看 man xorg.conf。
如果沒有配置文件,X Server 將在啟動的時候自動檢測硬件,然后生成一個內(nèi)置的配置。Ubuntu 系統(tǒng)就沒有配置文件。不過沒關(guān)系,如果需要使用配置文件的時候,可以通過 X Server 的 -configure 參數(shù)生成一個配置文件,里面包含當(dāng)前自動檢測出的配置。如果需要任何個性化的配置,對該文件進行修改即可。
運行嵌套的 X Server
我們上面運行的 X Server 都是直接占用了計算機的整個顯示器和鍵盤鼠標(biāo),事實上,在現(xiàn)有的圖形界面中,還可以以窗口模式運行另外一個 X Server,稱為 nested X Server。最常用的 nested X Server 是 Xephyr,在 Ubuntu 中可以通過如下命令安裝它:
sudo aptitude install xserver-xephyrXephyr 的使用非常簡單,可以通過man Xephyr命令查看它的使用手冊。如果輸入Xephyr :1 -screen 1024x768命令,就可以在現(xiàn)有圖形界面中打開一個窗口模式的 X Server,其中-screen參數(shù)用來指定 X Server 顯示區(qū)域的大小。以后再啟動 GUI 程序,就可以通過程序的 -display :1 選項讓程序運行在這個嵌套的 X Server 中,如下圖:
怎么樣,是不是很好玩呢?除了好玩,還很有用,比如調(diào)試窗口管理器啊、連接遠程桌面啊什么的都用得著。當(dāng)然,我這里只是簡單展示一下原來 X Window 還可以這么玩。
總結(jié)
1.在一個 Linux 系統(tǒng)中存在多個虛擬控制臺,所以可以啟動多個 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 的配置,可以通過命令行參數(shù),可以通過環(huán)境變量,還可以通過配置文件;
6.可以在現(xiàn)有的圖形界面下以窗口模式運行嵌套的 X Server,常用的軟件是 Xephyr;
7.使用 XMing 和 PuTTY,把 Linux 圖形界面帶入 Windows 不是夢。
求打賞
我對這次寫的這個系列要求是非常高的:首先內(nèi)容要有意義、夠充實,信息量要足夠豐富;其次是每一個知識點要講透徹,不能模棱兩可含糊不清;最后是包含豐富的截圖,讓那些不想裝 Linux 系統(tǒng)的朋友們也可以領(lǐng)略到 Linux 桌面的風(fēng)采。如果我的努力得到大家的認可,可以掃下面的二維碼打賞一下:
版權(quán)申明
該隨筆由京山游俠在2018年11月01日發(fā)布于博客園,引用請注明出處,轉(zhuǎn)載或出版請聯(lián)系博主。QQ郵箱:1841079@qq.com
posted on 2019-03-09 09:48 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/10499560.html
總結(jié)
以上是生活随笔為你收集整理的Linux 桌面玩家指南:09. X Window 的奥秘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 民族记忆剧情介绍
- 下一篇: 第三代试管婴儿的费用是多少钱