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

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

特別說明:要在我的隨筆后寫評論的小伙伴們請注意了,我的博客開啟了 MathJax 數學公式支持,MathJax 使用$標記數學公式的開始和結束。如果某條評論中出現了兩個$,MathJax 會將兩個$之間的內容按照數學公式進行排版,從而導致評論區格式混亂。如果大家的評論中用到了$,但是又不是為了使用數學公式,就請使用\$轉義一下,謝謝。

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

  • Linux 桌面玩家指南:01. 玩轉 Linux 系統的方法論 【約 1.1 萬字,22 張圖片】
  • Linux 桌面玩家指南:02. 以最簡潔的方式打造實用的 Vim 環境 【約 0.97 萬字,7 張圖片】
  • Linux 桌面玩家指南:03. 針對 Gnome 3 的 Linux 桌面進行美化 【約 0.58 萬字,32 張圖片】
  • Linux 桌面玩家指南:04. Linux 桌面系統字體配置要略 【約 1.2 萬字,34 張圖片】
  • Linux 桌面玩家指南:05. 發博客必備的圖片處理和視頻錄制神器 【約 0.25 萬字,14 張圖片】
  • Linux 桌面玩家指南:06. 優雅地使用命令行及 Bash 腳本編程語言中的美學與哲學 【約 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 下面的窗口系統,也都知道它基于 Server/Clinet 架構。在網上隨便搜一搜,也可以找到不少 X Window 的介紹。有不少文章為了給用戶留一個直觀的印象,往往先讓系統進入純文本界面,然后使用 startx 來啟動圖形界面,或者直接使用 X 來啟動 X Server,再然后運行一個 xterm 來做示范。我覺得以上這些文章對 X Window 的理解有限,不夠深入。所以,我這里寫一篇《X Window 的奧秘》,以最新的 Ubuntu-18.10 Desktop 為例,展示如何學習 X Window。

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 的外觀:
16576-20181031150630510-1566358116.png

而 CentOS 7 默認的外觀實在太丑,所以我給他換上了最流行的 adapta-gtk-theme 和 paper-icon-theme,下面的截圖展示了其中 Terminal 和 GVim 的外觀:
16576-20181031150743167-253533407.png

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

了解自己機器上的 X Window

X Window 其實是一種規范,它有很多不同的實現,在 Linux 系統下最流行的是實現 Xorg 和 XFree86,微軟 Windows 系統下也有 X Window 的實現,蘋果的 Mac 也是 X Window 的一種實現。要了解自己機器上運行的 X Window 究竟是哪一個,可以使用查看進程的ps命令,如下圖:
16576-20181031151318912-642586678.png

從上圖可以看出,Ubuntu 18.10 使用的 X Window 是 Xorg。如果使用ps -ef命令,還可以看到 Xorg 運行時的命令行參數。

想了解 X Window,下面這些文檔需要看一遍先:
16576-20181031151836068-826947610.png

下面來說一下也許是眾所周知的基礎知識: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+F1、Ctrl+Alt+F2、...、Ctrl+Alt+F7,就可以在不同的虛擬控制臺中進行切換。在 Ubuntu 18.10 中,虛擬控制臺 3 到 6 運行的是 agetty,也就是字符界面,虛擬控制臺 2 運行的是 Xorg。(Fedora 中不一樣,虛擬控制臺 1 運行的是圖形界面,其它的是字符界面。)如下圖:
16576-20181031153336308-133929108.png

我們可以直接運行 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,如下圖:
16576-20181031165906337-115987151.png

其中的 -retro 參數是為了讓 X Server 的背景顯示為斜紋,否則背景為純黑色,那就看不出來是否啟動了 X Server。vt8 參數指定將新啟動的 X Server 放到第 8 個虛擬控制臺。:1參數指定新啟動的 X Server 的 display number。啟動 X Server 后的效果如下圖:
16576-20181031165337027-1818856858.png

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

再按 Ctrl+Alt+F8 切換到 display :1,看效果。如下:
16576-20181031165708595-2035219253.png

不知道為什么,在 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 的桌面中。
16576-20181031231134863-1850551184.png

反之,如果在 CentOS 7 中使用ssh -X 192.168.40.135遠程連接到 Ubuntu 18.10 中,在運行gvim命令,就可以把 Ubuntu 中的 GVim 顯示到 CentOS 7 的桌面中,如下圖:
16576-20181031235719661-1031243835.png

SSH 的 X11 Forwarding 是一個非常強大的功能。我們甚至可以把 Linux 中的圖形界面顯示到 Windows 中,只需要在 Windows 中運行一個 X Server 即可。我選擇的軟件是 XMing,然后使用 PuTTY 連接到 Linux 系統。在 PuTTY 的設置中,開啟 X11 Forwarding 功能,如下圖:
16576-20181031235957621-749634410.png

然后可以把 Linux 桌面中的圖形界面帶入 Windows 桌面,如下圖:
16576-20181101000035156-1573758396.png

理解 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 中,如下圖:
16576-20181101000928719-1452715133.png

怎么樣,是不是很好玩呢?除了好玩,還很有用,比如調試窗口管理器啊、連接遠程桌面啊什么的都用得著。當然,我這里只是簡單展示一下原來 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 桌面的風采。如果我的努力得到大家的認可,可以掃下面的二維碼打賞一下:
16576-20180831154735325-1276475036.png

版權申明

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

posted on 2019-03-09 09:48 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/10499560.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387285.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387285.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387285.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Storm教程1理論介紹

流式計算的歷史: 早在7、8年前諸如UC伯克利、斯坦福等大學就開始了對流式數據處理的研究,但是由于更多的關注于金融行業的業務場景或者互聯網流量監控的業務場景,以及當時互聯網數據場景的限制,造成了研究多是基于對傳統數據庫處理的流式化&…

梯度下降原理及Python實現

梯度下降算法是一個很基本的算法,在機器學習和優化中有著非常重要的作用,本文首先介紹了梯度下降的基本概念,然后使用python實現了一個基本的梯度下降算法。梯度下降有很多的變種,本文只介紹最基礎的梯度下降,也就是批…

dagger2的初次使用

一、使用前準備 1、打開app的build.gradle文件: 頂部停用apt插件: //添加如下代碼,應用apt插件 apply plugin: com.neenbedankt.android-apt dependencies中添加依賴: //Dagger2compile com.google.dagger:dagger:2.4apt com.goog…

Storm教程2安裝部署

Storm 安裝部署 部署Storm集群需要依次完成的安裝步驟: 1.安裝jdk6及以上版本;   2. 搭建Zookeeper集群;   3. 安裝Storm依賴庫;   4. 下載并解壓Storm發布版本;   5. 修改storm.yaml配置文件;   6…

matplotlib一些常用知識點的整理,

本文作為學習過程中對matplotlib一些常用知識點的整理,方便查找。 強烈推薦ipython 無論你工作在什么項目上,IPython都是值得推薦的。利用ipython --pylab,可以進入PyLab模式,已經導入了matplotlib庫與相關軟件包(例如…

JAVA課程09

package 月份輸出;import java.util.*;public class 月份輸出 {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc new Scanner(System.in);int s sc.nextInt();String a[] {"January","February","March&q…

Storm教程3編程接口

Spouts Spout是Stream的消息產生源,Spout組件的實現可以通過繼承BaseRichSpout類或者其他Spout類來完成,也可以通過實現IRichSpout接口來實現。 需要根據情況實現Spout類中重要的幾個方法有: open方法 當一個Task被初始化的時候會調用此…

梳理操作系統概論

1、用一張圖總結操作系統的結構、功能特征、采用的技術和提供服務方式等。 2、用一張圖描述CPU的工作原理。 3、用一張圖描述系統程序與應用程序、特權指令與非特權指令、CPU狀態、PSW及中斷是如何協同工作的? 轉載于:https://www.cnblogs.com/ljgljg/p/10503190.ht…

機器學習01簡介

Machine Learning 是人工智能的核心,主要使用歸納、綜合而不是演繹。 讓計算機模擬人類行為,以獲取新的知識或技能 重新組織已有的知識結構使之不斷改善自身性能 一個程序能從經驗 E 中學習,解決任務 T,達到性能度量值P&#xf…

位置指紋法的實現(KNN)

基本原理 位置指紋法可以看作是分類或回歸問題(特征是RSS向量,標簽是位置),監督式機器學習方法可以從數據中訓練出一個從特征到標簽的映射關系模型。kNN是一種很簡單的監督式機器學習算法,可以用來做分類或回歸。 對于…

室內定位系列 ——WiFi位置指紋(譯)

摘要 GPS難以解決室內環境下的一些定位問題,大部分室內環境下都存在WiFi,因此利用WiFi進行定位無需額外部署硬件設備,是一個非常節省成本的方法。然而WiFi并不是專門為定位而設計的,傳統的基于時間和角度的定位方法并不適用于WiFi…

機器學習02線性回歸、多項式回歸、正規方程

單變量線性回歸(Linear Regression with One Variable) 預測器表達式: 選擇合適的參數(parameters)θ0 和 θ1,其決定了直線相對于訓練集的準確程度。 建模誤差(modeling error)&a…

最大乘積

給定一個無序數組,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間復雜度:O(n),空間復雜度:O(1) def solve():n input()a input().split()for i in range(len(a)):a[i] in…

機器學習03Logistic回歸

邏輯回歸 (Logistic Regression) 目前最流行,使用最廣泛的一種學習算法。 分類問題,要預測的變量 y 是離散的值。 邏輯回歸算法的性質是:它的輸出值永遠在 0 到 1 之間。 邏輯回歸模型的假設是: 其中&a…

基礎架構系列匯總

為了方便查找,把基礎架構系統文章按時間正序整理了一下,記錄如下: 1. 基礎架構之日志管理平臺搭建及java&net使用 2. 基礎架構之日志管理平臺及釘釘&郵件告警通知 3. 基礎架構之分布式配置中心 4. 基礎架構之分布式任務平臺 5. 基礎架…

CNN理解比較好的文章

什么是卷積神經網絡?為什么它們很重要? 卷積神經網絡(ConvNets 或者 CNNs)屬于神經網絡的范疇,已經在諸如圖像識別和分類的領域證明了其高效的能力。卷積神經網絡可以成功識別人臉、物體和交通信號,從而為機…

Windows 安裝Angular CLI

1、安裝nvm npm cnpm nrm(onenote筆記上有記錄) 參考:https://blog.csdn.net/tyro_java/article/details/51232458 提示:如果發現配置完后,出現類似“npm不是內部命令……”等信息。 可采取如下措施進行解決—— 檢查環…

機器學習04正則化

正則化(Regularization) 過擬合問題(Overfitting): 如果有非常多的特征,通過學習得到的假設可能能夠非常好地適應訓練集 :代價函數可能幾乎為 0), 但是可能會不能推廣到…

Adaboost算法

概述 一句話概述Adaboost算法的話就是:把多個簡單的分類器結合起來形成個復雜的分類器。也就是“三個臭皮匠頂一個諸葛亮”的道理。 可能僅看上面這句話還沒什么概念,那下面我引用個例子。 如下圖所示: 在D1這個數據集中有兩類數據“”和“-”…

Codeforces 408D Long Path (DP)

題目: One day, little Vasya found himself in a maze consisting of (n??1) rooms, numbered from 1 to (n??1). Initially, Vasya is at the first room and to get out of the maze, he needs to get to the (n??1)-th one. The maze is organized as fol…