Linux應用環境實戰系列階段性總結

>>>  技術話題—商業文明的嶄新時代  >>> 簡體     傳統

引言

  我使用 Linux 已經有很多年了,最開始接觸 Linux 的時候是從 RedHat 9(沒有 Enterprise),中途換過 N 個不同的發行版。多年前,我在 BlogJava 上面分享 Java 經驗的時候,也偶爾提一提 Linux,如怎么在 Linux 系統上面安裝 JDK、Tomcat、Bugzilla 等內容,也寫了一些自己選擇 Linux 發行版的體會。但是后來我發現,我的體會有一些是錯誤的,比如我因為字體的原因喜歡中科紅旗 Linux,而對 RedHat Enterprise Linux 有一些不公正的評價。于是,我整理 BlogJava 上的博客時,將一些和 Linux 有關的我認為內容有錯誤的隨筆刪除了。這次刪除直接導致我在 BlogJava 上的排名從 30 幾名下降到 50 幾名,又經過一年多的經營,現在也只是勉強進入 50 名之內。

  完全使用 Linux 作為自己的工作環境有很多困難,被 Linux 折磨久了我就有了一些自己的方法。使用這些方法來解決 Linux 中碰到的問題可以說是屢試不爽。因此,從去年 4 月底我完成碩士論文答辯后,就開始將自己折騰 Linux 的心得整理成文,到目前,正好歷時一年。所以,我在這里對這一系列隨筆做一下整理。

使用 Linux 的一些困難和解決方法

  完全使用 Linux 進行工作和娛樂是非常困難的。所以有很多 Linux 反對陣營的人就直接說,你們那些所謂的 Linux 用戶,也不過是把它當成玩具而已,玩一玩再刪掉,有什么意義呢?這真的是一個問題,對于普通用戶來說,使用 Linux 的難度還是太大了,即使有很先進的圖形界面(如Gnome、KDE)也不行。就算是程序猿們,使用 Linux 也要經過很多波折,而且需要很大的耐心,才能最終把 Linux 從玩具變成神器。大家沒有把 Linux 當成日常使用的工具,并不是 Linux 系統或者 Linux 系統下的軟件不能夠勝任我們的工作,而是被使用 Linux 的困難嚇倒了。

  舉例說明,由于 Linux 是一個很“優秀”的多任務多用戶操作系統,“優秀”就意味著嚴格,在 Linux 系統中由于用戶權限的限制,有些事情干起來就不是那么方便。所以,使用 Linux 系統的第一步就是要了解 Linux 系統的用戶管理方面的知識。第二步需要了解的是 Linux 的文件管理,雖然沒有像 Windows 中的 C 盤 D 盤這樣的盤符概念,但是文件和目錄以樹形組織起來還是比較容易理解的,難就難在 Linux 系統中,每一個文件或目錄都有其所屬的用戶、用戶組,并且具有不同的權限位,所以要學習 Linux 系統還要學習它的文件管理。第三步要了解的就是 Linux 系統的任務管理,怎么運行一個程序,怎么讓程序在后臺執行,怎么向一個程序發送信號等等。可以這么說,Linux 絕對是一個面向專家的系統,對普通用戶,它有著天然的壁壘,圖形界面做得再好,也無法跨越普通用戶和專家之間的鴻溝。

  再來說說圖形界面。Linux 有非常多的桌面環境可以使用,如 Gnome、KDE、Xface 等等,但是這些桌面環境也不是完全沒有問題。什么界面不好看、字體不美觀、沒有相應的顯卡驅動等等問題不一而足。而且這些桌面系統也并不是永遠那么穩定,極有可能哪天你安裝一個軟件包或者卸載一個軟件包后,圖形界面就進不去了,如果你不會在字符界面下配置網絡,無法重新修復相應的軟件包,就只剩下重裝系統這一條路了。

  但是話說回來,博客園中的用戶都是程序員,是不會被我上面說的那一點點困難嚇倒的。即使有問題,我們也要征服它。我在剛使用 Linux 的時候,碰到問題總是不知道到哪里找答案,有些東西書上沒有,網絡上也難以查到,查到的信息有時候也很過時。還有時候,我按照書上或網絡上的方法下載安裝一個軟件包,卻不知道這個軟件包的文件都放到文件系統的哪個地方了,程序在哪里、文檔在哪里、配置文件又在哪里呢?經過多年的使用,我總結了《玩轉Linux系統的方法論》,按照這些方法論,Linux 中的問題基本上都可以迎刃而解。

  下一個問題,就是 Linux 下的默認圖形界面不夠美觀。如果一個系統看起來不順眼,估計大家是沒有心情繼續用下去的。Fedora 默認主題就很丑,Ubuntu 倒是做得不錯。我拿到 Fedora 系統后,第一件事就是換主題、換背景。Linux 系統下的字體配置也很成問題,新安裝的系統上網、辦公都很不舒服。因此,我總結了《Linux桌面系統字體配置要略》、《在Ubuntu 14.10中借用Windows的字體》、《桌面美化那點事兒》,一步一步將 Linux 打造成自己順手順眼的工作環境。有時候,我們還要切換到字符界面進行工作,所以我總結了《全網絡最正確的讓Linux開機進入字符界面的方法及設置FrameBuffer分辨率的方法》,這也是屬于讓 Linux 看起來更順眼更舒服的范疇。

  Linux 系統的圖形界面是基于 X Window 的,所以對 X Window 也要有一定的了解。我又花時間探討了《X Window的奧秘》。為了防止圖形系統被玩壞了無法恢復,我研究了《我該如何備份系統》,不過在實際應用中,因為我總是不斷更新系統,所以我只備份了我的一些配置文件和工作文件。然后,對于安裝顯卡驅動,我也有自己的總結《Fedora 21安裝Nvidia驅動以及失敗后的補救方法》。

  在 Linux 系統下工作,需要一個好的輸入法和編輯器吧。我在 Fedora 中使用 Intelligent PinYin 輸入法,這個輸入法已經很不錯了,在 Ubuntu 中有更好用的搜狗輸入法,當然不能錯過,請看這里《在Ubuntu 14中使用搜狗拼音輸入法》。然后,對于文本編輯器,我選擇 Vim。Vim 要配到讓自己順手才行,所以有了這篇《打造屬于自己的Vim》。

  然后就是編程了,C 語言是 Linux 系統的母語,所以完善的 C 語言編程環境自然是必不可少。由于 C 語言相當簡單,很多時候使用 Vim 就足夠了,于是就有了《感悟GNU C以及將Vim打造成C/C++的半自動化IDE》。有一段時間,我非常熱衷于編寫自己的操作系統內核,自制操作系統需要從 16 位的實模式寫起,然后再讓 CPU 進入保護模式。幾乎所有的書和網絡教程一提到 16 位實模式代碼,都使用 NASM 編譯器。我偏偏喜歡 GCC,為了不使用 NASM,我有了這一篇《使用GCC和GNU Binutils編寫能在x86實模式運行的16位代碼》。這也進一步說明,使用 C 語言編程,除了 GCC,Binutils 也是一個很重要的工具包。除此之外,Gnu autotools 也是很重要的工具包,我在這一篇《使用Eclipse和Gnu Autotools管理C/C++項目》中進行了展示。

  除了 C 語言,腳本語言在 Linux 中的地位也很重要。這一篇《Bash腳本編程語言中的美學與哲學》總結了我對 Bash 語言的領悟。另外,從我的隨筆分類中可以看出,我有時是需要寫一些和數學、數值計算有關的東西的,要寫這些東西,必須要有適當的工具,關于工具的內容我后面再總結,但是這一篇《適合數值計算的語言需要具備什么樣的特色》,要歸納到我對編程語言的理解這個類別中。

  然后就是和寫文章、發博客、繪圖、數學公式有關的一些工具了。它們是《優秀的文本化編輯思想大碰撞(Markdown、LaTeX、MathJax)》、《再來說說LaTeX》、《數值計算和符號計算》,以及前面提到的《適合數值計算的語言需要具備什么樣的特色》。當然,還有畫圖工具《發博客必備的五大圖片處理神器》。

  最后,目前的虛擬化技術如火如荼,再加上我折騰 Linux 系統有時也需要用到虛擬機,所以對 Linux 系統下的幾個主流虛擬機進行了探討。它們是《虛擬機體驗之QEMU篇》、《虛擬機體驗之KVM篇》、《虛擬機體驗之VirtualBox篇——性能強大的經典架構》、《虛擬機體驗之Xen篇——令人腦洞大開的奇異架構》。有時不想用虛擬機,就想辦法把不同的 Linux 發行版安裝到一臺電腦上,像這樣《在同一個硬盤上安裝多個Linux發行版及Fedora 21初體驗》。

我眼中的Linux哲學總綱

  《Unix 編程藝術》這本書中,對 Unix 編程哲學的總綱總結為“K.I.S.S”,即Keep it simple, stupid。對這個說法,我深深地不以為然。當然,你可以認為這是 Unix 環境編程的哲學,而不是類 Unix 系統本身的哲學。事實上,一個系統中的程序如何設計,往往也影響到這個系統如何使用。例如,Linux 系統中的程序設計時往往只讓自己做到最少的功能,并通過管道和其它程序配合使用,從編程的哲學來講,這就叫只做一件事并做好,從用戶的角度來講,他就需要學習很多小工具,并將這些工具配合起來使用。正是由于將各種工具搭配使用可以有各種各樣的組合方式,充滿了創造性,所以,也就充滿了樂趣。另外,每一個小工具都是做得那么精湛,因此它們的生命期會很長,從用戶的角度來講,就是學會一項技能以后,很長一段時間不會過時。另外一個例子就是 Linux 程序設計時的最小立異原則,它們幾乎遵循同樣的命令行參數、配置文件語法、正則表達式語法等等,從用戶的角度來看,這個系統就會顯得很整齊劃一,有時候不用看文檔,猜都能猜到某些工具怎么使用。

  既然我不贊同 Linux 的哲學是“K.I.S.S”,那么我的答案是什么呢?我認為,Linux 哲學的總體綱領是“交流和共享”。這要從 Unix 和 Linux 以及和 Gnu 的歷史說起。Unix 剛誕生的時候,是不允許當作商業產品出售的,為了交流,Unix 系統的源碼是完全公開的,很多人都向 AT&T 實驗室索要 Unix 的源碼。那時候,Ken 伯伯是一包一包的磁盤往外寄,但是他毫無怨言,還在每一個包裹里附上一張紙條,上寫“愛你的Ken”。交流和共享的回報就是全世界那么多的聰明人為 Unix 系統添磚加瓦,然后 Unix 系統飛速發展。至于 Unix 版本的分裂和最后標準的形成這樣的過程我就不寫了。再來說 Linux,其內核誕生之初便放到網絡上和大家交流,然后借助網絡協作飛速發展。Gnu 就更加不用說了,那是開源界的鼻祖,交流和共享是它的立身之本。我覺得“K.I.S.S”這個原則應該是有點過時了,如果按人年計算,Linux 的工作量已超過幾千萬人年,它一點也不 Simple,一點也不 Stupid。相反,它還有那么一點 Complex,而且還很 Brilliant,它的復雜會把某些人拒之門外,它閃光的思想又會把另外一些人緊緊吸引。(這里不僅是指 Linux 內核,而是指整個 Linux 系統,包括其中的各種軟件。)

  其它的哲學應該都是從“交流和共享”這個總綱延伸而來的。其中一個結果就是在 Linux 系統下有著海量的軟件、編程工具可以使用。因為每個人都可以向 Linux 貢獻自己的東西嘛。而且 Linux 也是非常鼓勵大家開發自己行業領域的專業軟件,鼓勵大家設計適用于各種場景的專用編程語言。所以使用 Linux,你一定會有一種感覺,那就是一座大大的寶藏就放在自己眼前,入寶山怎么可能空手而歸呢?另外一個結果就是在 Linux 系統中展現了很多非常閃光的思想,因為交流,那些不好的東西慢慢就被淘汰了,留下的,自然就是精粹。

我這一系列隨筆中展現出的Linux哲學

  在我的這一個系列中,首先揭示的 Linux 哲學就是它的透明性和可用性。《Linux 就是這個范兒》這本書里面說 Linux 有四大笨,分別是:萬般皆文本,隨處用腳本,規律無處尋,配置亂生根。我認為,這“四大笨”正是 Linux 透明性的體現,但是要改一個字,不是“規律無處尋”,而是“規律有處尋”。下面我來一一論證。

  首先來說萬般皆文本。在 Linux 系統中,不管是保存數據還是程序之間通訊,首選純文本格式。一提到純文本格式,大家首先想到的困難會有兩點,其一是占用的存儲空間比較大,其二是文本的解析比較困難。但是和二進制的存儲格式相比,純文本最大的優點就是適合人類閱讀。在 Linux 系統中,很多程序都是基于行來解析文本文件的,甚至包括那些版本控制工具,它們也是基于行的比較來體現代碼的變化。富文本格式往往也傾向于使用純文本的方式來進行編輯和保存,只是需要在進行顯示或打印的時候,再通過特定的工具轉化成多媒體格式。在我的這一系列隨筆中,這兩篇《優秀的文本化編輯思想大碰撞(Markdown、LaTeX、MathJax)》、《再來說說LaTeX》可以說是對這一個哲學進行了闡釋。另外,進程間通訊也是純文本占優勢,因為那些專用的基于二進制的協議實在是太不透明了,開發和調試都很困難,也不是很健壯。以前在 Windows 下編程時,COM 和 DCOM 都研究過,寫 Java 的時候,也在 RMI 方面下過功夫,現在,仍然有很多編程語言在搞對象的序列化和反序列化,這些都是基于二進制的,不透明。后來逐漸接觸到 JSON、XML,以及面向服務編程是用到的 SOAP 協議,才深深體會到純文本格式的優美。其實目前網絡上的用戶層通訊協議,比如 HTTP 協議之類的,都是基于文本行的。

  其次來說說隨處用腳本。關于腳本編程我這里不多講,這里只說腳本帶來的好處。腳本的壞處大家也可以馬上想到,那就是運行速度確實不怎么樣。但是腳本的好處是顯而易見的,那就是邏輯清晰、便于閱讀。腳本就是一個純文本,隨便找個編輯器打開就可以閱讀,如果有超級用戶權限也可以隨意修改。在我的這個系列中,《Bash腳本編程語言中的美學與哲學》總結了我對 Bash 語言的領悟。而且有很多時候,我是通過閱讀腳本來理解問題和解決問題的,如這一篇《全網絡最正確的讓Linux開機進入字符界面的方法及設置FrameBuffer分辨率的方法》,通過閱讀 lightdm 的啟動腳本來找出讓 Ubuntu 進入字符界面的方法,還有這一篇《探索Linux系統的啟動過程》,通過閱讀 lsinitrd 腳本來找到解包 initramfs 文件的方法。

  然后來看規律有處尋。對于 Linux 新手來說,有時確實有點摸不著頭腦,感覺似乎找不到任何規律。事實上,Linux 下的軟件的文檔是非常完善的。幾乎每一個程序都有相應的手冊頁,使用man命令就可以閱讀,如果是 Gnu 出品的,可能還有info文檔。另外,幾乎每一個程序都可以帶--help選項。例如在《Fedora 21安裝Nvidia驅動以及失敗后的補救方法》這一篇中,我通過帶--help選項運行從 NVIDIA 官網下載的安裝文件,就得到了怎么把該安裝文件解包的方法。除了手冊頁,還有很多軟件提供的文檔是 PDF 格式的,也有辦法把它們找出來,如《再來說說LaTeX》這一篇和《虛擬機體驗之VirtualBox篇——性能強大的經典架構》這一篇,找出文檔后,軟件的使用就不再是無規律可循了。

  最后來分析配置亂生根的問題。配置文件、環境變量、命令行參數是我們定制軟件行為的三駕馬車。Linux 中有一個很討厭的哲學——提供機制而不是策略,為什么說它討厭呢,我后面再講。在 Linux 中,一個軟件可以有很多選項,可以表現出各種各樣的行為,這些都要靠配置文件、環境變量、命令行參數進行定制。配置文件本身是純文本格式的,閱讀和修改都不是問題,其透明性是很好的,主要問題是“亂生根”,有時候根本不知道配置文件放在什么地方、文件名叫什么。這個問題也不是沒辦法解決,使用《玩轉Linux系統的方法論》中介紹的方法,很容易找到某個軟件包的配置文件都放在什么地方。

  其實和透明性相關的還有一個硬貨,那就是源代碼。Linux 可以說是開源軟件的代表,內核及其系統下的軟件都是開源的,源代碼可以隨意獲得和閱讀。但是能隨意閱讀源代碼就說明透明性一定好嗎?那不見得,因為源代碼太復雜了,就算讓你隨便讀也不一定讀得懂。所以我碰到問題后,首先考慮的是讀文檔,而不是讀代碼。Linux 內核的源碼目錄我也是經常逛,但是主要還是以讀文檔居多,基本沒讀代碼,最多也就是看了那基本經典的專著之后進代碼瞅一眼,驗證驗證而已。有時候源代碼也可以提供一些參考,比如 OpenGL 編程,不知道它和 X Window 如何交互的話,看一看 freeglut 的代碼還是很有收獲的。在《玩轉Linux系統的方法論》這一篇中,我有介紹獲取源碼包的方法。

  我這一個系列的隨筆可以說是用最好的方式展現了 Linux 的透明性。掌握了我這一系列博客中提到的方法,在 Linux 系統中碰到任何困難,都可以找到解決方法。換一種說法,其實 Linux 系統本來對用戶就是非常透明的,一點都沒有遮遮掩掩,如果你用不好 Linux,那是因為你水平還不夠,而我的這一系列隨筆就是教大家怎樣去看穿它。

  說完透明性再來說說可用性。通過前面的闡釋可以看出 Linux 系統是非常透明的,所有困難都可以克服。另外一個問題就是 Linux 真的可以滿足我們日常工作、娛樂的所有要求嗎?也就是說,Linux 真的具有可用性嗎?我覺得我的這一系列隨筆就是對這個問題最好的回答。在這一系列隨筆中,我展示了在 Linux 桌面環境中,我的日常工作是沒有問題的,不管是編程、畫圖還是做數學工作,很多軟件都非常優秀,功能強大、運行穩定且界面美觀。在我沒有展示的領域,如寫論文、做幻燈也是沒有問題的,LibreOffice 很強大,和 MS Office 一樣好用,上淘寶、登網銀也沒有問題,因為它們的插件都支持 Linux 系統下的 Firefox 瀏覽器。如果不要圖形界面,其在服務器領域占有的市場比例更是遙遙領先,這個可用性就不需要我來廢話了,大家心知肚明。

  在我的這一系列隨筆中,有幾篇還展示了 Linux 中某些軟件前后端分離的策略以及其帶來的優勢。使用 Linux 系統有兩種方式,那就是 CLI 和 GUI。你即可以選擇字符界面,也可以選擇圖形界面,它們各有優勢。字符界面通過輸入命令來執行程序,通過腳本和管道讓許多工具配合工作,如果用得好,可以獲得非常高的效率。而且字符界面的程序非常適合進行腳本化和自動化,如開機啟動某任務、定時啟動某任務等等。圖形界面的優勢呢?就是使用起來非常方便,有豐富的菜單提示,用鼠標點點畫畫就可以完成工作,但是要完成批量任務或定時任務就不是那么方便了。也不是沒有解決辦法,MS Office 提供的宏就是一種解決辦法,Photoshop 也可以錄制動作生成 Action 然后回放。這說明不管是在 Linux 環境還是在非 Linux 環境,用戶對自動化的需求都是一樣的。

  有些工作非使用圖形界面不可,比如畫圖和在虛擬機中運行具有圖形界面的客戶機;有另外一些工作則把圖形界面當成累贅,比如在沒有圖形界面的服務器中使用虛擬機,并且要有開機自動啟動、定時啟動、遠程管理、批量化管理這些功能。要解決這個沖突,Linux 中廣泛采用的是前后端分離的策略。在《數值計算和符號計算》中,我介紹的 Octave、Maxima 等軟件,就都有在其命令行的版本上,加上了一個 GUI 封裝的圖形化版本。還有《虛擬機體驗之VirtualBox篇——性能強大的經典架構》中介紹的 VirtualBox 虛擬機,就是一個經典的前后端分離架構,VirtualBox 的圖形界面就是對其命令行工具的 GUI 封裝。

Linux之得和Linux之失

  Linux 還有一個很討厭的哲學,那就是提供機制而不提供策略,而且這個策略還被很多人追捧,對于這一點,我是持反對意見的。提供機制而不提供策略的幾個典型例子,一是系統啟動時的初始化,Linux 只決定內核初始化完成后將控制權交給/init程序,至于/init程序怎么啟動其它的服務、怎么進入系統,就看各個發行版各顯神通了。二是 X Window 圖形界面的實現,只提供機制,不提供策略,在不同的發行版中,可以使用不同的窗口管理器,編程也可以使用不同的圖形工具包。

  那么這是優點還是缺點呢?不好說。支持者認為這是優點,因為可以隨時更換策略,所以這些機制的生命期特別的長。就拿 X Window 來說,已經有 30 多年的歷史了,但是依然沒有被淘汰,每次只要換個窗口管理器,又可以生龍活虎好多年。支持者的另外一個觀點就是只提供機制而不提供策略,可以給用戶提供更加豐富的定制空間,正如 X Window,可供用戶選擇的桌面環境就有 Gnome、KDE、XFace、Enlightment 等等一大堆,還有 Ubuntu,硬是在 Gnome 的基礎上再次開發,寫出了一個 Unity 桌面。

  我認為,它的缺點也很明顯。其中一個缺點就是這個策略明顯地造成了 Linux 發行版的分化。現在的 Linux 發行版太多了,每一個都搞一套自己的啟動機制,每一個都搞一個自己的軟件包管理機制,每一個都說自己的策略怎么好怎么好,最終,想選擇 Linux 的用戶被逼成了選擇障礙綜合征,不知道怎么選,只好拋棄 Linux。即使是同一個廠家或同一個社區的發行版,也分成不同的桌面定制版,而且有時候,有些軟件專為某種桌面定制,在其它的桌面環境中運行效果就很差或者很不穩定,這造成了 Linux 用戶的分裂,同時也造成了 Linux 新手學習上的困難,因為技能樹的分支太多了,不知道怎么攀。

  版本分化還不是 Linux 占領市場最大的問題。最大的問題還是出在提供機制而不是提供策略上,因為當 Linux 允許用戶自己指定策略的時候,往往也意味著用戶必須得自己指定策略。Linux 系統的發行者沒有為大家提供一個可以讓大部分人都滿意的預先定制好的策略,相反,而是只提供基本可用的系統。幾個比較明顯的例子,我裝完系統后,首先要做的事就是重新配置字體、選擇系統主題,對于常用的工具如 Vim 之類的,還要自己修改它的配置文件。最終的結果,就是剛接觸 Linux 的用戶,如果不是專家或者特別有耐心,很快就知難而退,放棄了。

  曾經有一段時間,字體的配置方法也是很分化的,使用不同的圖形界面包(如QT、GTK)編寫的軟件,使用的字體配置方法都不一樣,所以要改系統的字體,得改好幾個地方的配置文件。這個問題也導致如果一個為 KDE 編寫的程序如果運行在 Gnome 桌面上,界面往往會比較丑陋,反之亦然。幸好,正如我在某一篇隨筆里說的,字體配置方法被 FontConfig 統一了,這為我們最終用戶省了很多事。也證明,Linux 中的提供機制而不是策略的哲學帶來的 Linux 的分化還是很有弊端的。還是合而為一比較方便,而且最終也是分久必合,如 init 系統即將被 systemd 統一。

總結

  這一篇隨筆只是對我這一年中所寫的 Linux 應用環境實戰系列隨筆的一個總結,順便闡釋了一下從我的隨筆中能夠看出來的 Linux 的透明性、可用性。這一系列隨筆沒有多少編程方面的東西,主要展示的是方法論和工具論。最后,如果你早就被 Linux 深深吸引住了,但是又無法說出吸引你的究竟是什么,那么我推薦你讀一下《Unix 編程藝術》,這本書雖然很老了,但是讀完之后確實是會有巨大的收獲。


原文地址:http://www.cnblogs.com/youxia/p/linux-philosophy.html


dotNET跨平臺 2015-08-23 08:48:45

[新一篇] 馮侖:創業就是失去現在要未來,從95%的人變成5%

[舊一篇] 專訪前C#編譯器組首席工程師Eric Lippert
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表