特別說明:要在個人隨筆後寫評論的小夥伴們請注意了,個人博客開啓了 MathJax 數學公式支持,MathJax 使用
$
標記數學公式的開始和結束。若是某條評論中出現了兩個$
,MathJax 會將兩個$
之間的內容按照數學公式進行排版,從而致使評論區格式混亂。若是你們的評論中用到了$
,可是又不是爲了使用數學公式,就請使用\$
轉義一下,謝謝。html
什麼狀況下適合玩 Linux 桌面
個人這一個系列是講 Linux 桌面的。Linux 系統開源、開放、穩定性強、軟件豐富且性能頗高,在服務器領域佔據了至關大的市場份額,可是在桌面領域,市場佔有率仍是很是低。我爲何把寫做的重點放在 Linux 桌面呢?那是由於 Linux 服務器系統每每提供比較詳細的文檔,例如這個 Ubuntu官方文檔,而 Linux 桌面的文檔和教程卻至關缺少,網上也只能找到一些零散的資料,這些資料每每內容陳舊,跟不上 Linux 桌面的發展,大部分又不能講明白其背後的原理。因此我決定,將我多年使用 Linux 桌面的心得與體會拿出來與你們分享。喜歡的朋友請點贊。linux
什麼狀況下適合使用 Linux 桌面呢?首先,固然是程序員羣體。這是由 Linux 特性決定的,無論怎麼說,Linux 畢竟仍是一個專家系統和玩家系統,它的門檻比較高,就算是有圖形化的桌面環境,沒有必定的基礎也玩不轉。並且就算是有基礎懂電腦,也必須得要有一個愛折騰的心,不然,極容易走上從入門到放棄的道路。Linux 對普通用戶門檻高,可是對程序員卻至關友好。不少編程工具幾乎都是開箱即用的,例如 C/C++、Python、Java 啥的,還有最流行的 LAMP 組合(Linux+Apache+MySQL+PHP),因爲目前的 Linux 發行版都有維護很好的軟件源,因此當須要某些編程工具的時候,一條sudo apt-get install
命令就能夠搞定整個工具鏈的安裝。不少狀況下,程序員的成果須要部署到服務器上運行,因此直接在和服務器同源的 Linux 系統下開發和測試,會更加方便。另外,Linux 系統中充斥着各類各樣的微型語言,像正則表達式、Shell腳本、sed和awk、JavaScript、宏語言(tex、m4)、標記語言(Markdown、xml、css)等,這些語言會出如今使用 Linux 系統的整個過程當中,經過這些語言,能夠學到各類閃光的思想,熟練使用這些語言,能夠極大地提升咱們使用電腦的效率。git
另一個適合使用 Linux 桌面系統的人羣就是裝 B 犯,就像我這樣的。雖然 Windows 系統好用,可是爛大街了不是嗎?在你們都用 Windows 的時候,我忽然掏出來一個裝着 Linux 桌面的筆記本,是否是 B 格爆棚?多年前,我使用 Linux 系統是偏心字符界面的。裝 B 神器啊,無論是別人看起來仍是本身看起來,都顯得特別的高大上。固然,字符界面用起來那也是至關舒服的,不過只是曾經。爲何這麼說呢,那是由於在 14 寸或 17 寸,分辨率限於 1024*768 的時代,使用字符界面,字體不大不小,也沒有刺眼的強光,眼睛看着很是舒服。但是,自從液晶屏、高分屏時代來臨以後,這種舒服感就一去不復返了。緣由何在?字過小。好比在我這個 15.6 寸 1920*1080 的 Dell XPS 15 上,使用純字符界面根本無法看,必須使用 15pt 到 16pt 的 Dejavu Sans Mono 字體,眼睛看着才舒服。如今網絡上,仍然有不少人問怎麼把 Linux 設置成啓動後自動進入字符界面這樣的問題,我很想告訴他們:拉倒吧,仍是使用圖形界面靠譜。對於確實沒有圖形界面的服務器系統,仍是老老實實使用 ssh 遠程鏈接吧。程序員
在圖形界面下,使用 gnome-terminal 依然能夠模擬全字符界面,只要按一個 F11 鍵全屏便可。還能夠設置爲半透明背景,看起來更拉風。以下圖,這個是用的 Vim,在我這一系列的後續隨筆中,確定會有一篇專門講 Vim 的:正則表達式
即便不是程序員,Linux 桌面也確實是能夠用來工做的。寫論文、作 PPT、講課都不在話下,我已經用 Linux 桌面工做十幾年了。個人筆記本電腦是 Dell XPS 15,系統是 Ubuntu 16.04,用的軟件是 LibreOffice,無論是寫論文,仍是作 PPT 課件,或者鏈接到大屏幕上進行 PPT 展現,都毫無壓力。並且,Linux 還能夠切換工做區,我能夠在一個工做區中全屏播放 PPT,而後按一個快捷鍵,就切換到另外一個工做區,使用非播放狀態的 LibreOffice 教別人怎麼作 PPT。不得不認可,最好用的辦公軟件仍是 Microsoft 的 Office 2016,可是在 Linux 下,只能使用 LibreOffice 或者 WPS。這幾個辦公軟件我都用過,得益於我不怕困難的精神,無論使用哪款辦公軟件,我都可以圓滿地完成個人工做。其實仔細想一想,不少人使用 Word 時,也只是把它當成一個高配版的寫字板,而 Excel 也只不過當成一個格子紙而已,並不必定須要最強功能的 Office 軟件。至於更高級的數據處理需求,又怎麼可以可貴倒咱們程序員呢,Python 和 Java 可不是吃素的。shell
在專業人士面前,使用 Linux 桌面也不掉價。我有個朋友,華科大的博士,南洋理工的博士後,目前在西班牙作研究。前段時間他回國,咱們坐着聊了一聊。他作的是數值計算和數據可視化方面的研究,模擬腫瘤生長什麼的,論文發了很多,其中有一個計算,聽說使用 128 核的服務器跑了一個多月。我羨慕得不得了,這樣的項目和資源,我是不可能接觸到的,這輩子都不可能了。我要看他的成果,他掏出了 MacBook Pro,給我看他的論文。咱們聊,用什麼寫論文啊?他說用 LaTeX。我說哎呀,LaTeX 我也會啊,不過基本不用,國內仍是 Word 用得多。而後他給我演示 LaTeX,結果中文碰到困難了,說在國外作研究寫論文,用的全是英文,沒碰到中文的問題啊。這時,我掏出個人 Dell XPS 15,說你看你看,我用的 TexLive 全家桶,使用 XeLaTeX 引擎,直接支持 Unicode 字符集和 UTF-8 編碼,中文不是問題,哦對了,你在國內寫文章的話,還有六種字體少不了,分別是宋體、楷體、黑體、仿宋、隸書和幼圓,你須要借用一下。而後再聊用什麼編輯工具,我說我用 TexWorks,他說他用 TexStudio,還一再強調 TeXStudio 好用。我說那好,我也裝一個吧。而後sudo aptitude install texstudio
,一條命令一分鐘搞定。編程
這裏我反覆提到 Dell XPS 15,真的不是打廣告,這款筆記本顏值真的是不輸的,哪怕他用的是蘋果。其實我使用的已是幾年前的產品了,等我有了錢,必定買一個最新款的帶 4K 屏的 XPS 15,以證明我之前說的,只要屏幕分辨率夠高,字體渲染就不是事兒。而後我和我朋友接着聊,聊到數值計算的語言,我說我主要用 Octave 和 Python,他說哎呀,Octave 我知道,就是那個和 Matlab 語法如出一轍的開源版本吧,我說是呀,而後給他簡單演示了一下。聊到數據可視化,他說他們用的是 NASA 出品的 ParaView,而後給我演示了一下。我說這玩意兒不錯,要錢嗎?他說不要錢,開源的。我說你等我一下,而後我sudo aptitude search paraview
,一看,軟件倉庫中還真有,再而後,sudo aptitude install paraview
,又是一條命令一分鐘搞定。接着聊,我說你這論文中的圖片不錯啊,都是計算生成的嗎?他說不全是,你看這個概念圖,是我老闆用 InkScape 畫的。我說 InkScape 我也會用呃,不過沒有你老闆畫得這麼漂亮,你老闆功力真深厚啊。接着給他展現了一下我係統中的 InkScape,雖然沒有他老闆用得好,可是比我朋友強,由於他根本不會用。我說除了 InkScape,我還會用 GIMP,P 圖嘛,仍是咱們中國人強一點。ubuntu
聊着聊着,他說你這本子不錯啊,用的什麼系統啊,怎麼感受比個人蘋果還溜呢?我說是 Ubuntu,Linux 的一個發行版。他說 Linux 他知道,他們實驗室雖然清一色的蘋果,可是服務器上跑的是 Fedora。我笑了,Fedora 我多熟啊,雖然我和個人這個朋友之間,差了不止十個博士後的距離,可是 Linux 桌面系統讓我收穫了滿滿的優越感。vim
Linux 桌面系統的特色和現狀
固然,Linux 桌面系統並非百分之百的好,它仍是有不少問題的,也仍是有不少困難的。在不少方面,它真的仍是比不過 Windows,特別是在如今 Windows 10 日新月異、新功能愈來愈多的狀況下。可是 Linux 桌面絕對是一個值得一玩的系統。目前,Linux 桌面是個什麼現狀呢?
首先,我以爲 Linux 發行版分化嚴重。Linux 發行版太多了,什麼 ElementaryOS、ArcLinux、LinuxMint、Ubuntu、Fedora、Deepin、Zorin-OS 不一而足。除了發行版的分化外,還有桌面環境的分化,最大的兩家分別是 Gnome 和 KDE,除此以外,還有 Xfce、Cinnamon、LXDE 等,而 Gnome 又分 Gnome 3 和 Gnome 2,還有至關多的人,停留在 Gnome 2 的時代不肯意升級,還把 Gnome 3 批評得體無完膚。Ubuntu 一直到 17.10 以前,都是使用本身開發的 Unity 桌面,雖然漂亮,可是也是對 Linux 桌面的一種分化。而後,Ubuntu 忽然宣佈放棄 Unity 桌面,迴歸 Gnome 3,這也算是一件好事。如今,使用最新版的 Ubuntu 和最新版的 Fedora,終於沒有太大的差異了,都是使用 Gnome 3 做爲桌面,即便其界面風格不一樣,可是使用思路和美化思路是同樣的。在之後的隨筆中,我只使用 Ubuntu 進行截圖和舉例,除非對於某些問題須要其它版本進行對比。
其次,Linux 桌面默認圖形界面不夠美觀。若是一個系統看起來不順眼,估計你們是沒有心情繼續用下去的。安裝以後看一眼再卸載這種事不少人也沒少幹。有字體問題、主題問題、桌面壁紙問題、顯卡驅動問題等等。安裝 Linux 系統後,必須得很是有耐心地進行設置和美化,才能將它變成一個用起來舒服的系統。在這一篇以後,我可能須要使用至少兩篇的篇幅來說 Linux 桌面的美化和字體,固然,仍是使用最新的 Ubuntu 發行版。並且 Linux 桌面光靠社區的力量,進步太慢了,Gnome 3 都有好多年了吧。還有 Wayland,提出概念也有好多年了,到如今還不能算是百分百成熟。而微軟的 Windows 10 近幾年日新月異,功能愈來愈強大,界面愈來愈美觀,Windows 10 下的 Linux 子系統有了,到我寫這篇隨筆的時候,Windows 10 也能支持多個工做區了。
最後,就是生產力工具並非很容易找。前面說過,Linux 系統對程序員很友好。這個友好主要表現爲編程語言多,開箱即用,但並不表明針對這些語言的 IDE 工具也完美。開源的工具雖多,可是比起 Microsoft 的宇宙最強 IDE——Visual Studio 來講,一個能打的都沒有。Vim 雖好,可是也不可能靠這一個錘子敲遍全天下全部的釘子啊。不少時候,我不得不尋找閉源的、甚至是收費的商業軟件來進行工做。例如,Eclipse 寫 Java 是不錯,可是對 JavaScript 的支持就太差了,直到 2016 年過了一半才支持到 ECMAScript 5 不說,尚未智能提示。好在微軟出了個 Visual Studio Code,該編輯器使用 electron 開發,JavaScript 是它的母語,因此它對 JavaScript 的支持是很完美的。可是若是寫 Python,用 VS Code 的話,智能提示就又很差了,因此,我不得不上 PyCharm,你們知道,JetBrains 的全家桶是要收費的。再例如,想找一個可視化的網頁設計工具,開源領域像 Dreamweaver 這樣的一個都沒有,每次找工具,推薦的都是 BlueFish,而其實 BlueFish 最多隻能算一個支持 HTML 語言和 CSS 語言的文本編輯器,一點所見即所得的功能都沒有。
我選擇 Linux 系統的原則
Linux 的發行版這麼多、桌面環境也這麼多,咱們究竟應該選擇哪個呢?我選擇的是 Ubuntu,在我寫這篇隨筆的時候,它的最新版本是 18.04,不過 18.10 快出來了。Ubuntu 已經放棄了 Unity 桌面,迴歸到 Gnome 3了。另外,我偶爾用一用 Fedora,目前最新的是 Fedora 28,估計 Fedora 29 也快出了,我選擇的依然是 Gnome 3 版本。
是否是 Gnome 3 必定就是最優秀的呢?不必定。從美觀的角度看,Gnome 3 不是最漂亮的,從功能的角度看,Gnome 3 也不是最強大的,從輕量級的角度看,Gnome 3 也不是運行速度最快的。那我爲何會選擇它呢?我主要是從這樣幾個方面考慮。首先,市場佔有率要大,這樣,用這個版本的人就多,有問題也更容易被發現和修復。其次,要善於擁抱新技術、新觀點,雖然 Gnome 2 的桌面可能用起來更順手,某些程度上可能更漂亮,還可使用 Compiz 進行美化和加速,可是我認爲這在某些程度上也會形成 GUI 程序的分裂,改 GUI 主題的時候,既要考慮 GTK2,又要考慮 GTK3,若是整個系統都是 Gnome 3,底層庫都是 GTK 3 的話,則整個系統會更加統一。我我的認爲技術路線要專注,避免分化。再說,若是長期不能擁抱新技術的話,很容易落伍。
選擇了 Gnome 3,就要去發掘它的優勢。首先是在使用上,要充分了解 Gnome Shell 的特色和設計思路,熟記快捷鍵,知道按下 Super 鍵就能夠喚出 OverView 界面,知道按下 Ctrl+Alt+↑ 或者 Ctrl+Alt+↓ 能夠切換工做區,並且 Gnome 3 具備動態工做區的功能,當你把現有的工做區都佔用的話,它會自動建立一個新的工做區。還要去 Gnome 3 的官網看一看,特別是開發者中心看一看文檔,就會發現,Gnome Shell 桌面環境只是冰山露在水面上的一角,在界面之下,還有一個完整的技術鏈,除了 GTK,還有文件處理庫、多媒體庫、文檔排版庫、矢量繪圖庫、XML 和 XLST 解析庫、Webkit2GTK 庫等等。還有各類語言綁定,除了 C/C++,還可使用 JavaScript、Python、Vala 等語言開發 GUI 程序。特別是 JavaScript 和 CSS,是咱們編寫 gnome-shell-extension 和 gnome-shell-theme 的重要工具。
再說一次,我主要使用的是 Ubuntu 的最新版本,偶爾使用 Fedora。到目前爲止,它們的技術路線基本重合了,只有界面風格、軟件包管理工具等少許差異了,在這兩個發行版之間切換,基本不須要額外的學習成本。另外,這兩個版本背後都有大公司支持,維護的軟件倉庫質量可靠。橫向比較的話,能夠了解不一樣流派 Linux 發行版的區別,縱向比較,能夠了解不一樣年代的技術特色。例如,Fedora 是 Red Hat 公司支助的,新技術的試驗場,版本更新快,和 Ubuntu 差很少都是每半年一個版本。而 Red Hat 公司的 Enterprise Linux 則追求穩定,更新很慢,約兩年一個版本。Redhat Enterprise Linux 5 就是一個很老的版本,它在技術選型上和最新的 Fedora 就有很大的差異。
爲了比較不一樣年代發行版、以及不一樣流派發行版在技術選型方面的差別,我同時安裝瞭如下發行版。首先,是 CentOS 5.10,它表明的是比較老的 Redhat Enterprise Linux 發行版。這裏須要說一下,Redhat Enterprise Linux 是商業版本,須要購買受權,而 CentOS 是它的社區複製版,能夠無償使用,他們的內容是同樣的。下圖是CentOS 5.10:
下圖是稍微新一點的 CentOS 6.11:
下圖是最新的 CentOS 7:
下圖是最最新的 Fedora 28:
下圖是 Ubuntu 18.04:
從上面幾個圖能夠看出,越老的版本,其界面越醜。CentOS 7 的發佈時間和 Fedora 21 的發佈時間是差很少的,可是界面仍是醜多了。只能說,Redhat Enterprise Linux 的重點仍是服務器版本,根本就沒有對桌面作任何美化,無論什麼年代,老是把桌面環境作成一坨翔。
玩轉 Linux 系統的方法論
前面說了,Linux 系統是一個具備必定門檻的專家系統,使用 Linux 仍是有必定難度的。就算是有圖形界面的桌面系統,也並不能徹底消除這些障礙。在這裏,我結合我本身多年使用 Linux 系統的經驗,談一談玩轉 Linux 系統的方法論。
0一、從教科書開始學習,可是要注意與時俱進
如何使用 Linux 是一門比較系統的學問,因此教科書是頗有必要看那麼幾本的。我最開始學習 Linux,是十幾年前,那時每天抱着一本《Redhat Linux 9寶典》啃,看清楚哦,是 Linux 9,而不是 Enterprise Linux 9。從那個版本後,Redhat 開始發行 Enterprise Linux,每兩年一個版本,如今已經到第 7 版了。我後來也相繼買了很多 Linux 方面的書,以下圖,是我書櫃一角的照片:
能夠看到,那些書都是以第 5 版爲藍本進行講解的。如今看來,這些內容應該過期了。目前市面上還有很多比較優秀的入門書籍,像《鳥哥的Linux私房菜館》、《Linux就該這樣學》,都可以與時俱進,它們都有針對 CentOS 7 的最新版。
除此以外,我再給你們推薦幾本優秀的書籍。先看這兩本:
這兩本書重點講的是全字符界面的 Linux,講得特別好,特別系統。沒有侷限於哪個特定的發行版,可是它裏面講的知識在每個 Linux 發行版中均可以用到。對文件、用戶、權限、Shell、管道這些知識講得特別深刻。就是經過這兩本書,我學會了使用man
命令。這兩本書還包含一些我從未在別的 Linux 書籍中看到過的知識點,例如 tty。其實咱們在使用鍵盤和屏幕操做 Linux 的時候,系統的響應模式是在不斷變化的。有時,咱們輸入文字,立刻能夠獲得回顯,像輸入命令的時候;有時,咱們輸入文字,徹底沒有回顯,像輸入密碼的時候;有時,咱們輸入一行文字,按 Enter 鍵後,系統才執行咱們的命令;有時,只要敲一個字符,不須要按 Enter,就會當即獲得系統的響應,。以上這一切,都是由 tty 控制的。上面兩本書,就講到了 Linux 中的stty
命令和 tty 編程。
除了教科書,咱們還能夠從 Linux 系統編程的角度去揣摩 Linux 系統的用法,因此下面幾本書也值得讀一讀:
Linux 內核和內核模塊的知識也很重要,也有助於咱們對 Linux 桌面系統的理解。能夠讀一讀下面這幾本書:
軟件技術無時無刻不在進步,教科書上的知識也有過期的時候,因此咱們必定要可以改變思想,擁抱新的變化。舉幾個常見的經典的例子。①如何使 Linux 系統開機後直接進入字符模式,不啓動圖形界面?教科書上的回答是:修改/etc/inittab
文件,將運行級別更改成 3。然而,這個回答只適用於 Redhat Enterprise Linux 5 及以前的老版本,由於它們的 init 使用的是 SysVinit 程序,而最新的幾個發行版,它們的 init 使用的是 systemd,因此,正確的作法是sudo systemctl set-default multi-user.target
。②如何修改啓動菜單,如何開啓 Framebuffer,如何設置 Framebuffer 的分辨率?教科書上的回答是直接修改/boot/menu.lst
文件。然而,新的發行版已經再也不使用 Grub Legacy 了,而是使用 Grub2,在 Grub2 中,正確的作法是先修改/etc/default/grub
文件,而後再使用grub2-mkconfig
命令生成配置文件,Ubuntu 還提供了update-grub
命令,更加方便。
還有字體的進步。從上面展現的圖片能夠看出,早期的 CentOS 5 中,字體發虛比較厲害,並且沒有好的黑體字。在早期的 Linux 版本中,字體配置也很複雜。後來,好用的黑體字愈來愈多,先有 Droid Sans Fallback,再有文泉驛系列,如今又有思源黑體。而字體的配置,基本上也被 Fontconfig 這個軟件包統一了。在後面的隨筆中,我會有一篇專門講 Linux 桌面中的字體配置,將 Linux 桌面打形成一個養眼的系統。
0二、使用一個命令時,要知道該命令屬於哪一個軟件包
使用 Linux 時,本質是經過運行 Linux 下的軟件來完成工做的。要作什麼,運行相應的命令就能夠了。而相同的命令,有可能屬於不一樣的軟件包,不一樣的軟件包,就會有不一樣的策略、不一樣的文檔。因此,知道一個命令屬於哪一個軟件包是咱們要學會的基本功。
仍是之前面提到的 init 程序爲例進行講解。先回顧一下 Linux 系統的啓動過程:開機 → BIOS 啓動 → BIOS 加載硬盤 MBR 中的 Grub → Grub 加載 Linux 內核和 initrd 鏡像文件到內存中 → Grub 將控制權交給 Linux 內核,Linux 內核開始執行,進行初始化 → Linux 內核將控制權交給 init 程序 → init 程序負責啓動後面的全部後臺服務軟件和前臺界面軟件。那麼 init 程序怎麼啓動系統中那麼多的服務和軟件的呢?若是要增長開機啓動的服務或者減小開機啓動的服務應該怎麼辦呢?若是要中止某項服務或重啓某項服務應該怎麼辦呢?這些功能取決於 init 所在的軟件包提供的策略、腳本和命令行工具。因此知道 init 程序屬於哪一個軟件包很是重要。
怎麼找到一個程序屬於哪一個軟件包呢?這個要因包管理軟件而制宜。我上面介紹的系統能夠分爲兩個流派,一個是 Red Hat 流派,包括 CentOS 和 Fedora,它們使用 rpm 包管理軟件。一個是 Debian 流派,這裏就是指 Ubuntu,它使用 dpkg 包管理軟件。先看 CentOS 5,運行 which init
能夠看到 init 程序的路徑是/sbin/init
,而後使用rpm -qf /sbin/init
命令,能夠看到它所屬的軟件包是 SysVinit。這是一個很是經典的軟件包,不少 Linux 教程上都會講。回憶一下 RedHat EL 5 以前的系統,要讓某個服務在系統啓動時運行,咱們須要把一些腳本文件放到/etc/rc.d/init.d
目錄中,而後在相應的/etc/rc.d/rcX.d
目錄中創建符號連接,而且這些腳本的命名還有講究,腳本前的數字表明腳本啓動或中止時的順序什麼的。同時,RedHat EL 5 以前的系統還提供了幾個工具來簡化咱們的工做,它們是service
命令和chkconfig
命令。
到稍微新一點的 CentOS 6,用和前面徹底相同的流程來了解一下 init 程序。運行which init
,獲得它的路徑是/usr/sbin/init
,再運行rpm -qf /usr/sbin/init
,能夠看到它所屬的軟件包是 upstart。在老一點的 Ubuntu 版本,例如 Ubuntu 14.04 中,init 也是屬於upstart
軟件包。這個軟件包相比 SysVinit 是有進步的,能夠這麼理解,在 SysVinit 時期,只能主動運行或中止服務腳本,而在 upstart 時期,能夠經過捕捉硬件或內核發出的信號,動態地啓動或中止服務腳本,並且這些服務在運行的時候,還能夠發出信號,以便激活或中止其它的服務。upstart 教科書上講得少,並且其管理工具每每設計得和 SysVinit 兼容,因此每每被學習 Linux 的人忽略。
在最新的 Ubuntu 18.04 和 Fedora 28 中,init 又屬於哪一個軟件包呢?Fedora 28 是 Redhat 流派的,因此其考察方法同前。Ubuntu 使用 dpkg 包管理軟件,其考察流程是這樣的:運行which init
,獲得路徑/sbin/init
,再運行dpkg -S /sbin/init
,獲得其軟件包是 systemd。從前面的截圖可知,Fedora 28 的 init 程序也是屬於 systemd。知道一個軟件屬於哪一個軟件包,咱們纔好作功課,不是嗎?在這裏,咱們能夠用搜索引擎搜 systemd 關鍵字,也能夠在系統中使用man systemd
查看它的文檔。
經過文檔可知,systemd 啓動後,先根據default.target
配置文件中的規則初始化系統。其實default.target
是一個連接,若是它連接到multi-user.target
,則啓動字符界面,若是它連接到graphical.target
,則啓動圖形界面。這個和傳統的 SysVinit 中的運行級別有必定的類似性。systemd 中的 target 不少,它和傳統的 SysVinit 中的運行級別對應關係以下:
SysVinit中的運行級別 | systemd中的 target | 意義 |
---|---|---|
0 | runlevel0.target, poweroff.target | 關閉系統。 |
1, s, single | runlevel1.target, rescue.target | 單用戶模式。 |
2, 4 | runlevel2.target, runlevel4.target, multi-user.target | 用戶定義/域特定運行級別。默認等同於 3。 |
3 | runlevel3.target, multi-user.target | 多用戶,非圖形化。用戶能夠經過多個控制檯或網絡登陸。 |
5 | runlevel5.target, graphical.target | 多用戶,圖形化。一般爲全部運行級別 3 的服務外加圖形化登陸。 |
6 | runlevel6.target, reboot.target | 重啓。 |
emergency | emergency.target | 緊急 Shell。 |
SysVinit 和 systemd 軟件包都有管理系統服務的功能,可是它們提供的命令是不一樣的,其對好比下:
SysVinit 命令 | Systemd 命令 | 意義 |
---|---|---|
service foo start | systemctl start foo.service | 用來啓動一個服務 (並不會重啓現有的)。 |
service foo stop | systemctl stop foo.service | 用來中止一個服務 (並不會重啓現有的)。 |
service foo restart | systemctl restart foo.service | 用來中止並啓動一個服務。 |
service foo reload | systemctl reload foo.service | 當支持時,從新裝載配置文件而不中斷等待操做。 |
service foo condrestart | systemctl condrestart foo.service | 若是服務正在運行那麼重啓它。 |
service foo status | systemctl status foo.service | 彙報服務是否正在運行。 |
ls /etc/rc.d/init.d/ | systemctl list-unit-files --type=service | 用來列出能夠啓動或中止的服務列表。 |
chkconfig foo on | systemctl enable foo.service | 在下次啓動時或知足其餘觸發條件時設置服務爲啓用。 |
chkconfig foo off | systemctl disable foo.service | 在下次啓動時或知足其餘觸發條件時設置服務爲禁用。 |
chkconfig foo | systemctl is-enabled foo.service | 用來檢查一個服務在當前環境下被配置爲啓用仍是禁用。 |
chkconfig –list | systemctl list-unit-files --type=service | 輸出在各個運行級別下服務的啓用和禁用狀況。 |
chkconfig foo –list | ls /etc/systemd/system/*.wants/foo.service | 用來列出該服務在哪些運行級別下啓用和禁用。 |
chkconfig foo –add | systemctl daemon-reload | 當您建立新服務文件或者變動設置時使用。 |
telinit 3 | systemctl isolate multi-user.target | 改變至多用戶運行級別。 |
在使用了 systemd 的系統中,電源管理也是由 systemd 接管的。systemd 電源管理的命令以下:
命令 | 操做 |
---|---|
systemctl reboot | 重啓機器 |
systemctl poweroff | 關機 |
systemctl suspend | 掛起 |
systemctl hibernate | 休眠 |
systemctl hybrid-sleep | 混合休眠模式(同時休眠到硬盤並掛起) |
systemd 自帶日誌服務 journald,而且用二進制格式保存全部日誌信息,用戶使用journalctl
命令來查看日誌信息。
不少人可能很是想了解 systemd 在系統啓動時啓動了哪些服務?這些服務的啓動順序如何?每一個服務啓動花費了多少時間?若是單純去查看 systemd 的文檔和各個服務的腳本,是很是難以搞清楚以上問題的。幸虧 systemd 提供了一個很是好的分析工具 systemd-analyze,它能夠幫咱們分析各個服務啓動的順序、時間等。這樣運行該程序
systemd-analyze plot > init.svg
就能夠以圖形化的形式展現各服務啓動的時間軸了,以下圖:
0三、瞭解進程
在前面,我講到了 Linux 系統的啓動過程,可是講到 init 就噶然而止了。init 以後呢?咱們的 Linux 桌面系統如此複雜,它又是由哪些軟件組成的呢?這些軟件之間是什麼關係呢?誰先啓動、誰後啓動?誰管理誰?誰佔用鼠標、鍵盤和顯示器?要用好 Linux 桌面,這些關係最好都梳理清楚了,咱們能夠經過分析系統中的進程來回答以上問題。
瞭解系統中的進程,能夠經過ps
命令,ps
命令具備不少不一樣的選項,我也是記不住的,可是不要緊,使用man ps
就能夠查看它的文檔。若是認真學過前面的教材,特別是編程手冊的話,就會對進程的一些概念,例如,什麼父進程、子進程、殭屍進程的概念,什麼進程組、進程ID、組ID的概念,有更深入的理解。使用ps -ejH | less
命令的效果以下圖:
另一個命令pstree
,能夠顯示系統中的進程樹,以下圖:
經過以上命令的輸出,可讓咱們對本身的系統有一個大概的瞭解。能夠看到,有一些進程之間的關係是並列的,彼此之間沒有父子關係,像系統中的各類服務進程。有一些進程具備嚴格的父子關係,像 systemd 就是全部其它進程的父進程,並且 systemd 的 PID 是 1。還能夠看出,systemd 負責啓動 GDM,GDM 負責啓動 XServer 或 Wayland,GDM 也負責啓動 Gnome Shell。經過這些信息,就能夠大體分析出一個桌面系統由哪些組件組成,功力深厚的話,就能夠本身定製 Linux 桌面系統。
說到 GDM,我就多談幾句。之前我使用 Linux 桌面的時候,老是有一個誤區:認爲只有 XServer 啓動後,纔可以訪問到圖形系統,不然只能訪問字符界面。隨着對 Linux 的認識逐步加深,才發現即便在 XServer 啓動以前,圖形界面也是無處不在的。例如,Grub 的系統啓動菜單,能夠是圖形化的,還能夠經過改背景和主題進行美化。再例如在 Linux 初始化過程當中,有一個 PlyMouth 軟件,能夠直接經過內核的 DRM 模塊訪問圖形硬件,從而顯示一個圖形化的啓動界面和進度條,同理,PlyMouth 也是能夠經過更改主題進行美化的。最後,當 Linux 初始化完成後,會給咱們顯示一個讓咱們登陸的圖形界面,這就是 DM(Display Manager),這個 DM 既是 XServer 的父進程,負責啓動 XServer,又是一個 XClient,給出圖形化的登陸接口。登陸成功後,它又是 Gnome Shell 的父進程,負責啓動 Gnome Shell。我花了很長時間才理解什麼是 DM (Display Manager,顯示管理器),才把它和 Linux 桌面系統中的窗口管理器(Window Manager)區分開來。之前 Ubuntu 使用的 DM 是 lightdm,如今迴歸 Gnome 3 後,就統一使用 Gnome 的 GDM 了。我後面會有一篇隨筆專講 X Window,到時候再詳細講解 Display 的概念,理解了 Display,再理解 Display Manager 就不難了。還有,即便在純字符界面下,也是可使用 FrameBuffer 得到圖形功能的,我後面也會有一篇隨筆,專講 Grub二、字符界面、FrameBuffer。
0四、學會查找和管理軟件包
前面提到了使用一個命令時,怎麼找出這個命令屬於哪一個軟件包,並針對該軟件包進行學習。這裏反過來,若是知道一個軟件包的名字,咱們應該怎樣找到它、安裝它,安裝以後,怎麼知道它安裝到了文件系統中的什麼地方,怎麼知道這個軟件包還提供哪些別的命令。
比較幸運的是,目前流行的 Linux 發行版都有比較好的軟件包管理工具,並且有官方維護得比較好的軟件倉庫。例如,在 Ubuntu 中,可使用 apt 來安裝軟件倉庫中的軟件包。我喜歡用 apt 更高層次的一個包裝 aptitude,因此安裝完系統後,我老是先使用sudo apt-get install aptitude
安裝 aptitude,之後統一使用 aptitude 管理軟件包。以下圖:
使用sudo aptitude search
查找軟件包,使用sudo aptitude install
安裝軟件包,使用sudo aptitude source
下載某個軟件包的源代碼,使用sudo aptitude purge
刪除軟件包。在 RedHat 流派的 Linux 發行版中,也有專用的包管理軟件,Fedora 21 以前是yum
,以後是dnf
。用法都是大同小異,我就不具體講了。必要時可使用man dnf
查看它的文檔。
安裝某個軟件包後,要可以找出文件都散落在系統中的哪些地方。可使用dpkg -L
命令來完成該工做。
0五、善於閱讀軟件的文檔
要善於閱讀軟件的文檔。在 Linux 中,閱讀文檔很是方便,幾乎全部命令,均可以使用man
命令來查看它的命令行參數。一樣,對於複雜的軟件,使用man
也能夠學到很是系統的知識。以下圖,我在學習 Bash 的時候,使用man bash
命令閱讀它的官方文檔:
我學習 FontConfig 的時候,也是靠man fonts.conf
來學習關於字體配置的語法的,以下圖:
對於一些 GNU 提供的軟件,有時提供的是 Info 格式的文檔,可使用info
命令閱讀。下面是我學習 Grub 時的截圖,使用info grub
就能夠調出來。
有時候,我也會找一些 PDF 格式的文檔,把它們下載到手機中,空閒時間讀一讀,很是方便。GNU Manuals Online 就是一個不錯的地方,我常常在裏面找 PDF 格式的文檔下載,GCC、Octave、Bash、Grub 的文檔,這裏都有。還有,當我安裝完 TexLive 全家桶後,也有海量的 PDF 文檔,對 LaTeX 有興趣的朋友不妨讀一讀。
0六、必要時參考軟件的源代碼
有時候,文檔並非萬能的,像某些軟件的文檔不夠完善啦,或者咱們本身的需求超越了文檔描述的範疇啦等狀況。這時,咱們能夠直接參看軟件的源代碼,這就是開源系統的優點。源代碼有各類各樣的,有 C 語言的,也有 Bash 腳本語言的,還有 XML、CSS、JavaScript 的。這篇隨筆的第一張截圖,展現的就是使用 Vim 閱讀 Linux 內核的源代碼。
有些軟件是編譯好的,因此咱們須要額外下載它的源代碼包,下載源代碼包可使用sudo aptitude source
命令。例如,在學習使用 OpenGL 的時候,必須使用 X Window 的 glx 擴展,可是 glx 的文檔又語焉不詳,怎麼辦呢?這時我就想到了 freeglut 這個庫,能夠參考一下這個庫是如何實現的嘛。先使用sudo aptitude search freeglut
搜一下,發現官方倉庫裏面確實有 freeglut,並且軟件包的名字是 freeglut3,而後使用sudo aptitude source freeglut3
命令就能夠把它下載下來了。使用 Vim 閱讀它的代碼,我就不截圖了。
須要注意的是,Linux 內核源代碼是單獨打包的,因此要下載 Linux 內核的源代碼的話,須要使用sudo aptitude install linux-source
命令。
Linux 系統中還有一些功能是由腳本提供支持的,這些軟件的源代碼讀起來更加方便。例如,製做 initrd 鏡像文件的工具就是 Bash 腳本,在 Ubuntu 系統中,它在文件系統中的位置是/usr/sbin/mkinitramfs
,使用 Vim 就能夠閱讀,以下圖:
FontConfig 的配置文件是 XML 格式的,分別是/etc/fonts/fonts.conf
文件和/etc/fonts/conf.d/
目錄下的全部文件。也能夠直接使用 Vim 進行閱讀和修改,以下圖:
最後,來看看 Gnome Shell 用來定義外觀的 gnome-shell-theme 和 gnome-shell-extension。前者是 CSS 文件,後者是 JavaScript 程序。固然,這個 JavaScript 是專用於 Gnome 3 的 GJS,這裏能夠查看它的 wiki:GJS: Javascript Bindings for Gnome
進入/usr/share/gnome-shell
目錄,能夠看到這裏有theme
目錄和extensions
目錄,分別看一下里面有哪些內容,以下圖:
使用sudo vim /usr/share/gnome-shell/theme/gnome-shell.css
命令,能夠查看這個 CSS 文件,以下圖:
最後再來學習一下 Gnome Shell 的擴展怎麼寫,這裏選擇一個最簡單的 Hide Activities,就是掩藏左上角的那個「活動」按鈕。進入/usr/share/gnome-shell/extensions/Hide_Activities@shay.shayel.org
目錄,使用 Vim 查看 extension.js,以下圖:
能夠看到,這個 Extension 很是的簡單,其中的function enable()
和function disable()
是一個 Extension 最基本的框架,並且它也只是調用了indicator.container.hide()
和indicator.container.show()
方法。咱們能夠先學這個簡單的 Extension,再學別的複雜一點的 Extension,再結合 GJS 的 wiki 和 GTK 的文檔,很容易就能夠學會怎麼編寫 Gnome Shell 的 Extension。
0七、嚴重問題可查看 Log
這個就屬於比較高級的技巧了,主要在出現嚴重問題的時候用。例如,圖形界面啓動不了啊、系統崩潰啊之類的,實在找不到緣由了,就去看看這些軟件輸出的 Log。這種事情我也不是常常碰到。因此這裏就不深刻展開了。
總結
玩轉 Linux 系統的方法論,主要包含如下內容:
- 從教科書開始學習,可是要注意與時俱進。
多讀書,系統學習 Linux 的基礎知識。多思考,想明白命令背後的根本原理。多實踐,緊跟最新的 Linux 發行版不掉隊。 - 使用一個命令時,要知道該命令屬於什麼軟件包
充分認識到 Linux 的功能是由衆多的軟件構建起來的。使用一個命令時,要知道這個命令屬於什麼軟件包,再用軟件包的名稱做爲關鍵字去作功課。需使用到which
和dpkg -S
。 - 瞭解進程。
使用ps
命令和pstree
命令查看進程和進程之間的關係。經過系統中有哪些進程及這些進程之間的管理來分析複雜系統的構成。 - 學會查找和管理軟件包
充分利用 Linux 發行版官方維護的軟件倉庫。使用sudo aptitude search
查找軟件包,使用sudo aptitude install
安裝軟件包,使用dpkg -L
命令查看軟件包安裝後散落在文件系統的什麼位置。 - 善於閱讀軟件的文檔
遇到困難記得使用man
、info
等命令。空閒時間能夠利用手機閱讀 PDF 格式的文檔進行學習。 - 必要時參考軟件的源代碼
編譯過的軟件包,可使用sudo aptitude source
命令下載源代碼。腳本語言或標記語言編寫的軟件,可直接閱讀它的代碼。 - 嚴重問題可查看Log
高級技巧,我也沒用過幾次。圖形系統啓動不了或者系統崩潰的時候用。
版權申明
該隨筆由京山遊俠在2018年09月03日發佈於博客園,引用請註明出處,轉載或出版請聯繫博主。QQ郵箱:1841079@qq.com