濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Linux折騰記(三):X Window的奧秘

Linux折騰記(三):X Window的奧秘

熱門標(biāo)簽:商戶地圖標(biāo)注 壽光百度地圖標(biāo)注中心網(wǎng)站 新鄭電銷外呼系統(tǒng)線路 電話機(jī)器人哪里有賣的 怎樣給景區(qū)加百度地圖標(biāo)注 河北語音電銷機(jī)器人 地球地圖標(biāo)注方法 樺甸電銷機(jī)器人 河南智能電話機(jī)器人公司

  大名鼎鼎的X Window大家肯定不陌生。都知道它是Unix/Linux下面的窗口系統(tǒng),也都知道它基于Server/Clinet架構(gòu)。在網(wǎng)上隨便搜一搜,也可以找到不少X Window的介紹。有不少文章為了給用戶留一個(gè)直觀的印象,往往先讓系統(tǒng)進(jìn)入純文本界面,然后使用startx來啟動(dòng)圖形界面,或者直接使用X來啟動(dòng)X Server,再然后運(yùn)行一個(gè)xterm來做示范。我覺得以上這些文章對(duì)X Window的理解有限,不夠深入,而且也不夠新。所以,我這里寫一篇《X Window的奧秘》,以最新的Ubuntu-14.04 Desktop為例,展示如何學(xué)習(xí)X Window。

  先說一點(diǎn)題外話。在上一篇《打造屬于自己的Vim》發(fā)表后,評(píng)論中有人讓共享一下配置文件。當(dāng)時(shí)我說:配置文件又不長(zhǎng),自己照著圖片敲一下代碼嘛。結(jié)果這個(gè)“照著圖片敲代碼”的事情我今天自己干了一遍,好在沒花多少時(shí)間,幾分鐘而已。原因是因?yàn)槲医裉煺垓vX Window的時(shí)候,把系統(tǒng)給掛掉了,然后重裝系統(tǒng),然后,就只好再設(shè)置一遍Vim了。

了解自己機(jī)器上的X Window

  X Window其實(shí)是一種規(guī)范,它有很多不同的實(shí)現(xiàn),在Linux系統(tǒng)下最流行的是實(shí)現(xiàn)Xorg和XFree86,微軟Windows系統(tǒng)下也有X Window的實(shí)現(xiàn),蘋果的Mac也是X Window的一種。要了解自己機(jī)器上運(yùn)行的X Window究竟是哪一個(gè),可以使用查看進(jìn)程的ps命令,如下圖:

  從上圖可以看出,Ubuntu 14.04使用的X Window是Xorg。如果使用ps -ef命令,還可以看到Xorg運(yùn)行時(shí)的命令行參數(shù)。

  想了解X Window,下面這些文檔需要看一遍先:

  下面來說一下也許是眾所周知的基礎(chǔ)知識(shí):X Window是一個(gè)分層的架構(gòu),它分為Serve和Client。X Server負(fù)責(zé)圖形界面的顯示,(也負(fù)責(zé)用戶的輸入),而Client程序需要連接到X Server,然后請(qǐng)求X Server繪制圖形界面,同時(shí)從X Server接受用戶的輸入。在桌面系統(tǒng)上,X Server和Client程序往往安裝在同一臺(tái)機(jī)器上,日常使用基本感覺不到它是分層的。但是很顯然,X Server和Client也可以分別運(yùn)行在不同的機(jī)器上,在一臺(tái)機(jī)器上運(yùn)行程序,而在另外一臺(tái)機(jī)器上顯示圖形界面。

  X Window中的Server和Client的概念和我們平時(shí)接觸到的“Server/Client”概念剛好相反。很多熟悉Internet原理的人,第一次接觸X Window的這兩個(gè)概念都會(huì)搞錯(cuò)。比如,我在一臺(tái)本地機(jī)器上運(yùn)行Ubuntu 14.04桌面版,而在另外一臺(tái)遠(yuǎn)程機(jī)器上運(yùn)行CentOS 5.10(純字符界面),當(dāng)我用ssh從Ubuntu連接到CentOS的時(shí)候,Ubuntu是Client,而CentOS是Server。在X Window中,Server偏偏是我面前的這臺(tái)Ubuntu,X Server運(yùn)行在Ubuntu上。我可以在CentOS中運(yùn)行GVim,但是窗口顯示在Ubuntu中,這時(shí),GVim是一個(gè)Client程序,它在遠(yuǎn)程機(jī)器上運(yùn)行,而它的窗口顯示在本地。

理解display和虛擬控制臺(tái)

  前面提到網(wǎng)上很多介紹X Window的文章都是先讓系統(tǒng)進(jìn)入字符界面,然后手動(dòng)啟動(dòng)一個(gè)X Server。其實(shí)這完全沒有必要,因?yàn)樵谕慌_(tái)機(jī)器上完全可以運(yùn)行多個(gè)X Server,只需要讓每個(gè)X Server的display不同即可。那么display究竟是什么?

  在X Window中,可以通過hostname:display_number.screen_number來指定一個(gè)屏幕??梢赃@樣理解:一臺(tái)計(jì)算機(jī)可以有多個(gè)display,一個(gè)display可以有多個(gè)屏幕。所以,display相當(dāng)于是計(jì)算機(jī)配備的一套輸入輸出設(shè)備,一般情況下,一臺(tái)電腦只配一套鍵盤鼠標(biāo)和一個(gè)顯示器,特殊情況下,可以配多個(gè)顯示器。

  現(xiàn)在問題出來了,我的電腦只有一套鍵盤鼠標(biāo)和一個(gè)顯示器,也就是只有一個(gè)display,那又怎么能運(yùn)行多個(gè)X Server呢?那是因?yàn)樵贚inux中,還有虛擬控制臺(tái)這樣的高級(jí)特性。只需要同時(shí)按下Ctrl+Alt+F1、Ctrl+Alt+F2、...、Ctrl+Alt+F7,就可以在不同的虛擬控制臺(tái)中進(jìn)行切換。在Ubuntu 14.04中,虛擬控制臺(tái)1到6運(yùn)行的getty,也就是字符界面,虛擬控制臺(tái)7運(yùn)行的是Xorg。(Fedora中不一樣,虛擬控制臺(tái)1運(yùn)行的是圖形界面,其它的是字符界面。)

  我們可以直接運(yùn)行X Server程序來啟動(dòng)X Server。/usr/bin/X和Xorg都是X Server程序。其實(shí)/usr/bin/X是Xorg的符號(hào)鏈接,用哪一個(gè)都是一樣的。

  啟動(dòng)X Server的時(shí)候可以指定display參數(shù),因?yàn)榭梢允÷缘鬶ostname和screen_number,所以可以用:0,:1這樣的格式來指定display。在我的機(jī)器上,本來就有一個(gè)X Server在運(yùn)行,display :0已經(jīng)被占用了,所以我使用sudo X :1 -retro來在display :1上再運(yùn)行一個(gè)X Server,如下圖:

  其中的-retro參數(shù)是為了讓X Server的背景顯示為斜紋,否則背景為純黑色,那就看不出來是否啟動(dòng)了X Server。啟動(dòng)X Server后的效果如下圖:

  按Ctrl+Alt+F7回到display :0,再用ps命令看一下,會(huì)發(fā)現(xiàn)系統(tǒng)中有兩個(gè)Xorg在運(yùn)行,一個(gè)運(yùn)行在虛擬控制臺(tái)7,一個(gè)運(yùn)行在虛擬控制臺(tái)8。如下圖:

  在新啟動(dòng)的X Server中運(yùn)行一個(gè)GVim看看效果。運(yùn)行GVim時(shí),使用-display :1參數(shù)指定窗口顯示在新啟動(dòng)的X Server上,使用-geometry參數(shù)指定窗口的大小和位置。然后按Ctrl+Alt+F8切換虛擬控制臺(tái),看效果。命令見上圖,程序運(yùn)行效果見下圖:

遠(yuǎn)程連接X Server

  如果能讓遠(yuǎn)程機(jī)器上的GVim也把窗口顯示在本地機(jī)器的屏幕上,那就比較過癮了。所以,使用ssh連接到CentOS-5.10,然后使用gvim -display ubuntu-14:1命令,希望將GVim顯示到Ubuntu的display :1上。由于是遠(yuǎn)程連接,所以hostname不能省略,需寫成ubuntu-14:1,也可以使用IP地址,寫成192.168.1.103:1。如下圖:

  很可惜,連接失敗。

  失敗的原因是遠(yuǎn)程訪問X Server需要安全認(rèn)證。這個(gè)可以理解,就像登陸郵箱需要輸入用戶名和密碼一樣,如果X Server不要認(rèn)證就可以隨便連接的話,那豈不是桌面上垃圾窗口滿天飛?安全認(rèn)證的方式有很多種,具體請(qǐng)參考man Xsecurity。安全認(rèn)證可以使用xhost和xauth這兩個(gè)程序來進(jìn)行,具體使用方法參考它們的文檔。

  先用xhost來授權(quán),這個(gè)比較簡(jiǎn)單。為了運(yùn)行xhost,需要在X Server上有一個(gè)終端,所以運(yùn)行一個(gè)xterm,如下圖:

  在xterm中輸入sodu xhost +192.168.1.109,這樣,CentOS-5.10中運(yùn)行的GUI程序都可以連接到這個(gè)新開啟的X Server了。如下圖:

  在CentOS-5.10中運(yùn)行GVim,如下圖:

  窗口顯示在Ubuntu中,如下圖:

  新啟動(dòng)的X Server界面比較丑陋,我們還是想讓遠(yuǎn)程機(jī)器上的GUI程序直接顯示在Ubuntu的桌面環(huán)境中。所以,指定display為:0,如下圖:

  結(jié)果很不幸,無法打開display。連接不上,為什么呢?是安全認(rèn)證的問題嗎?不是,是lightdm的問題,請(qǐng)繼續(xù)往下看。

理解lightdm和X Window桌面環(huán)境的啟動(dòng)過程

  X Server的啟動(dòng)方式有兩種,一種是通過顯示管理器啟動(dòng),另一種是手動(dòng)啟動(dòng)。在前面的例子中,我通過直接運(yùn)行/usr/bin/X :1來啟動(dòng)了一個(gè)X Server。直接啟動(dòng)X Server的方法還有運(yùn)行startx或者xinit。手動(dòng)啟動(dòng)X Server的缺點(diǎn)就是啟動(dòng)的X Server不好看。而顯示管理器啟動(dòng)的不僅有X Server,還有一大堆的Client程序,構(gòu)成了一個(gè)完整的桌面環(huán)境,界面當(dāng)然就漂亮多了。

  顯示管理器(Display Manager)是什么呢?前面我講到display就是一個(gè)電腦配備的一套鍵盤鼠標(biāo)和顯示器,那么顯示管理器就是這一套設(shè)備的管理器了。顯示管理器可以直接管理這些設(shè)備,所以它可以控制X Server的運(yùn)行,由它來啟動(dòng)X Server那是再合適不過了。系統(tǒng)啟動(dòng)過程是這樣的:內(nèi)核加載-->init程序運(yùn)行-->顯示管理器運(yùn)行-->X Server運(yùn)行-->顯示管理器連接到X Server,顯示登錄界面-->用戶登錄后,登錄界面關(guān)閉,加載桌面環(huán)境。從上面的流程可以看出,顯示管理器是X Server的父進(jìn)程,它負(fù)責(zé)啟動(dòng)X Server,當(dāng)X Server啟動(dòng)后,它又變成了X Server的一個(gè)Client程序,連接到X Server顯示歡迎界面和登錄界面,最后,顯示管理器又是所有桌面環(huán)境的父進(jìn)程,它負(fù)責(zé)啟動(dòng)桌面環(huán)境需要的其它Client程序。

  在Ubuntu 14.04中,使用lightdm取代了傳統(tǒng)的xdm、gdm等顯示管理器。簡(jiǎn)單來說,就是由lightdm負(fù)責(zé)啟動(dòng)X Server和其它的X程序。不知道為什么,lightdm在啟動(dòng)X Server的時(shí)候,給X Server加上了-nolisten tcp參數(shù),所以遠(yuǎn)程計(jì)算機(jī)就沒有辦法連接到Ubuntu的桌面了。(從第1張圖片可以看到該參數(shù)。)

  下一步的目標(biāo)就是更改lightdm的配置,去掉這個(gè)-nolisten tcp參數(shù)。不過要達(dá)成這個(gè)目標(biāo)還真是艱難啊,我的系統(tǒng)掛掉然后重裝就是在這里折騰出來的。在這里我要狠狠滴吐槽一下freedesktop.org,在X Window所用的軟件中,freedesktop.org貢獻(xiàn)很大,比如lightdm、xft、fontconfig、freetype都是這個(gè)組織貢獻(xiàn)的,可是,你就不能把文檔寫詳細(xì)點(diǎn)嗎?不僅是lightdm的文檔不行,xft、freetype的文檔也都不行。

  lightdm的man page非常簡(jiǎn)略,使用sudo dpkg -L lightdm也找不出該軟件包中有價(jià)值的東西。沒辦法,另辟蹊徑吧。在使用sudo dpkg -L lightdm查看該軟件包的文件時(shí),發(fā)現(xiàn)它的log文件放在/var/log/lightdm文件夾下,過去看看:

  終于,從log文件中看到了lightdm啟動(dòng)的全過程。首先,看到它從哪幾個(gè)目錄加載配置文件,接著,看到它啟動(dòng)X Server。從下圖光標(biāo)所在的行可以看到X Server啟動(dòng)的所有參數(shù),包括-nolisten tcp選項(xiàng)。

  繼續(xù)看log文件,下面光標(biāo)所在的行顯示lightdm怎么啟動(dòng)gnome-session:

  同時(shí),我發(fā)現(xiàn)/etc/lightdm/目錄下沒有l(wèi)ightdm.conf文件,而/usr/share/doc/lightdm/目錄下有一個(gè)lightdm.conf.gz文件,把該文件當(dāng)文檔看了一下,發(fā)現(xiàn)里面果然就是lightdm的配置的解釋。趕快將該文件復(fù)制到/etc/lightdm/目錄下并解壓,如下圖:

  然后用Vim編輯/etc/lightdm/lightdm.conf文件,將xserver-allow-tcp=false一行前面的注釋去掉,并且改為xserver-allow-tcp=true。如下圖:

  最后,重啟系統(tǒng)。再用ps查看進(jìn)程,發(fā)現(xiàn)-nolisten tcp選項(xiàng)已經(jīng)沒有了。

搞定xauth

  搞定了-nolisten tcp之后,要想從遠(yuǎn)程計(jì)算接連接到Ubuntu桌面,還是需要安全認(rèn)證。在前面的例子中,我使用了xhost。xhost是最簡(jiǎn)單的認(rèn)證方式。在這里我要試一下別的認(rèn)證方式,比如MIT-MAGIC-COOKIE-1。如上圖,先使用xauth list命令查看一下當(dāng)前的授權(quán)記錄,發(fā)現(xiàn)只有一條,而且display是ubuntu-14/unix:0,很顯然,這是一個(gè)本地授權(quán),所以需要使用xauth add命令添加一個(gè)使用ip地址的授權(quán),后面的key照抄就行了。最后,使用xauth extract和xauth merge配合管道和ssh將該授權(quán)記錄合并到CentOS-5.10中。

  在CentOS-5.10中啟動(dòng)GVim,指定display為192.168.1.103:0,GVim窗口就出現(xiàn)在了Ubuntu中。如下圖:

X Server的配置

  可以使用不同的方法對(duì)X Server進(jìn)行配置,前面的例子是直接指定命令行參數(shù)。除了指定命令行參數(shù),還可以使用環(huán)境變量和配置文件。X Server的配置文件為一般是/etc/X11/xorg.conf或/etc/X11/xorg.conf.d/目錄下的.conf文件,當(dāng)然,配置文件也可以放在其它的目錄中,具體信息,請(qǐng)參看man xorg.conf。

  如果沒有配置文件,X Server將在啟動(dòng)的時(shí)候自動(dòng)檢測(cè)硬件,然后生成一個(gè)內(nèi)置的配置。Ubuntu系統(tǒng)就沒有配置文件。不過沒關(guān)系,如果需要使用配置文件的時(shí)候,可以通過X Server的-configure參數(shù)生成一個(gè)配置文件,里面包含當(dāng)前自動(dòng)檢測(cè)出的配置。如果需要任何個(gè)性化的配置,對(duì)該文件進(jìn)行修改即可。

現(xiàn)有的圖形界面中可以運(yùn)行嵌套的X Server

  我們上面運(yùn)行的X Server都是直接占用了計(jì)算機(jī)的整個(gè)顯示器和鍵盤鼠標(biāo),事實(shí)上,在現(xiàn)有的圖形界面中,還可以以窗口模式運(yùn)行另外一個(gè)X Server,稱為nested X Server。最常用的nested X Server是Xephyr,在Ubuntu中可以通過如下命令安裝它:


復(fù)制代碼
代碼如下:

sudo aptitude install xserver-xephyr

  Xephyr的使用非常簡(jiǎn)單,可以通過 man Xephyr 命令查看它的使用手冊(cè)。如果輸入 Xephyr :1 命令,就可以在現(xiàn)有圖形界面中打開一個(gè)窗口模式的X Server,如下圖:

  以后再啟動(dòng)GUI程序,就可以通過程序的-display選項(xiàng)讓程序運(yùn)行在這個(gè)嵌套的X Server中,如下圖:

  怎么樣,是不是很好玩呢?除了好玩,還很有用,比如調(diào)試窗口管理器啊、連接遠(yuǎn)程桌面啊什么的都用得著。當(dāng)然,我這里只是簡(jiǎn)單展示一下原來X Window還可以這么玩。

總結(jié):

  1.在一個(gè)Linux系統(tǒng)中存在多個(gè)虛擬控制臺(tái),所以可以啟動(dòng)多個(gè)X Server;

  2.啟動(dòng)X Server的方式有兩種,一種是使用/usr/bin/X、startx、xinit手動(dòng)啟動(dòng),一種是通過顯示管理器啟動(dòng);

  3.Ubuntu使用的顯示管理器是lightdm,這是一個(gè)比較新的、輕量級(jí)的顯示管理器,但是文檔不夠詳細(xì);

  4.遠(yuǎn)程計(jì)算機(jī)連接本地的X Server,需要X Server開放TCP端口,還要搞定安全認(rèn)證;

  5.X Server的配置,可以通過命令行參數(shù),可以通過環(huán)境變量,還可以通過配置文件;

  6.可以在現(xiàn)有的圖形界面下以窗口模式運(yùn)行嵌套的X Server,常用的軟件是Xephyr;

  7.我的《玩轉(zhuǎn)Linux系統(tǒng)的方法論》中介紹的方法不夠用,還要加上兩條:①使用ps命令查看進(jìn)程;②查看程序啟動(dòng)的log文件。

標(biāo)簽:淄博 楚雄 忻州 荊州 阜陽 來賓 迪慶 遼陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux折騰記(三):X Window的奧秘》,本文關(guān)鍵詞  Linux,折騰,記,三,Window,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux折騰記(三):X Window的奧秘》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Linux折騰記(三):X Window的奧秘的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    彭州市| 岳阳县| 龙胜| 乌兰浩特市| 黄大仙区| 都江堰市| 宜丰县| 五常市| 永宁县| 丰都县| 兰考县| 微博| 萨嘎县| 开阳县| 尚志市| 贵州省| 文成县| 定西市| 阜新市| 登封市| 荔浦县| 广西| 陇川县| 赤峰市| 元朗区| 明水县| 阿拉善左旗| 仙桃市| 庆云县| 宁武县| 墨竹工卡县| 曲阳县| 巴青县| 天柱县| 高碑店市| 孟村| 木里| 庐江县| 凤冈县| 吉隆县| 兴业县|