Linus說“Just for fun”,而我要說“Just for 折騰”。想知道我是怎樣折騰Linux的,請看下面這個截圖:
從這個截圖可以看出,我為了“折騰”Linux系統,在我的電腦上安裝的5個不同的發行版。它們分別是Ubuntu 14.04桌面版、CentOS 5.10、CentOS 6.5、Fedora 20和一個Ubuntu 14.04 Server版。在以上所有系統中,只有Ubuntu 14.04桌面版和Fedora 20開啟了GUI,其它的幾個系統都使用字符界面。上面的截圖就是我在Ubuntu 14.04桌面版中,使用ssh遠程連接到另外四個系統時的情形。
關於字符界面和圖形界面多年前,我使用Linux系統是偏愛字符界面的。裝B神器啊,不管是別人看起來還是自己看起來,都顯得特別的高大上。當然,字符界面用起來那也是相當舒服的,不過只是曾經。為什麼這麼說呢,那是因為在14寸或17寸,分辨率限於1024*768的時代,使用字符界面,字體不大不小,也沒有刺眼的強光,眼睛看著非常舒服。可是,自從液晶屏、高分屏時代來臨之後,這種舒服感就一去不復返了。原因何在?字太小。比如在我這個21.5寸1920*1080的液晶顯示器上,使用純字符界面根本沒法看,即使開啟FrameBuffer也沒辦法把字體變漂亮。在我的顯示器上,必須使用15pt到16pt的Dejavu Sans Mono字體,眼睛看著才舒服。現在在網絡上,仍然有很多人問怎麼把Linux設置成啟動後自動進入字符界面這樣的問題,我很想告訴他們:拉倒吧,還是使用圖形界面靠譜。對於確實沒有圖形界面的服務器系統,還是老老實實使用ssh遠程連接吧。
在圖形界面下,使用gnome-terminal依然可以模擬全字符界面,只要按一個F11鍵全屏即可。甚至可以設置半透明背景,看起來更拉風。如下圖:
Fedora 20的圖形界面也不錯,如下圖,在圖形界面下使用Vim和GVim都很清爽:
都是Linux,為什麼要裝這麼多的發行版呢?那是因為系統和系統之間是不一樣的。不同流派的發行版不一樣,同樣流派的發行版,老系統和新系統也不一樣。還是以上面提到的那個經典問題“怎麼把Linux設置成啟動後自動進入字符界面”為例。對於這個問題,教科書式的回答是:將/etc/inittab文件中的啟動級別修改為3。但是,我可以很負責任地說:教科書過時了。
我最早是從Red Hat Linux 9開始接觸Linux的,那時,天天抱著一本《Red Hat Linux 9 寶典》啃。很顯然,這本書現在已經是古董級了,因為Red Hat後來就開始做Enterprise Linux,每兩年一個版本,現在已經到了Enterprise Linux 6,馬上就要出第7版了。在我安裝的這些系統中,CentOS等同於Red Hat Enterprise Linux,Fedora是Red Hat新技術的試驗場,所以他們是一個流派的,Fedora 20比CentOS 5、CentOS 6新,Ubuntu則是另外一個流派,每半年出一個新版本,我用的是目前的最新版。
我想,我們中的很多人學習Linux都是從Red Hat開始的吧。就像我家裡總有那麼幾本經典教材,如下圖(我書櫃一角的照片):
對於前面提到的那個經典問題,教科書式的回答僅適用於CentOS 5及其之前的版本,其它的系統則各有各的方法。我將在後面講述方法論的時候詳細說明。
折騰Linux系統的方法論要想在Linux江湖中暢行無阻,光靠幾本入門書是遠遠不夠的,還得掌握適當的方法。我的方法論如下:
1.在使用一個命令的時候,最好要知道它屬於哪個軟件包;
2.會查找和安裝軟件包,安裝軟件包後,要能夠找出文件都安裝到哪裡了;
3.要會閱讀軟件的文檔;
4.實在不行了,那就看源代碼吧。
使用我的方法論還是得有一定的Linux基礎(比如如何進行用戶管理、文件管理等,以及了解Linux究竟是個什麼樣的系統這樣的基本哲學問題),所以教科書還是很有必要讀那麼幾本的。過了基礎階段,折騰Linux其實就是折騰Linux系統下的各種軟件,這個時候,掌握正確的方法論尤其重要。
舉例說明還是以前面提到的經典問題為例,究竟怎麼樣才能讓Linux系統啟動後自動進入字符界面呢?按我的方法論,我們還是得從軟件分析起。Linux系統的內核加載完畢後,第一個執行的進程是init,是進入字符界面還是進入圖形界面,當然是init說了算。不同的系統,啟動的第1個進程都叫init,可此init等於彼init嗎?所以,1.我們要找到這個init屬於哪個軟件包;2.找到這個軟件包的文件都安裝在文件系統的哪些位置,這個軟件包還包含哪些程序,包含哪些文檔;3.閱讀這個軟件包的文檔(當然,首先利用搜索引擎對該軟件包做一些功課是必須的);4.實在不行就閱讀源代碼吧。
在Red Hat流派的系統(CentOS、Fedora)中,軟件的包管理器是RPM。先看CentOS 5.10,首先,使用which init命令,可以查出init的完整路徑為/sbin/init;然後使用rpm -qf /sbin/init命令,可以查出init程序所在的軟件包為SysVinit;最後,使用rpm -ql SysVinit命令,就可以看到這個軟件包裡面還有哪些程序、哪些文檔以及它們分別位於文件系統的什麼地方了,如下圖:
而Ubuntu屬於另外一個流派。它的包管理器為dpkg。在Ubuntu中,首先,使用which init命令,可以查出init的完整路徑為/sbin/init;然後使用sudo dpkg -S /sbin/init命令,可以查出init程序所在的軟件包為upstart;最後,使用sudo dpkg -L upstart命令,就可以看到這個軟件包裡面還有哪些程序、哪些文檔以及它們分別位於文件系統的什麼地方了,如下圖:
用同樣的方法研究一下CentOS 6.5,發現其init程序也是屬於upstart軟件包,如下圖:
究竟是什麼樣的優勢使得upstart軟件包取代了傳統的SysVinit軟件包呢?很顯然,有了以上信息,我們在Google上以upstart、SysVinit作為關鍵字搜索一下又有何難。另外,還會有更先進的軟件包取代upstart嗎?讓我們看看Fedora 20用的什麼,如下圖:
原來Fedora 20用的是systemd。使用cat /etc/inittab命令可以顯示inittab文件裡面的內容,從其提示可以看出Runlevel的概念早已無影無蹤。由此可見,inittab、RunLevel都不是Linux本身的哲學,只是軟件層面的定義而已。
查找和安裝軟件包 使用Ubuntu、CentOS、Fedora等Linux發行版有一個很省心的地方,那就是它們都具有官方的軟件包倉庫,只需要一個命令,就可以從倉庫中查找、安裝相應的軟件包。Ubuntu系統使用的是apt-get或aptitude,Red Hat流派的系統使用的是yum。如下圖,在Ubuntu中使用aptitude查找軟件包:
在CentOS 5中使用yum查找軟件包:
Linux就是一座寶藏,其中有汗牛充棟的精心編寫的文檔,一輩子都學不完。要發掘這座寶藏,有兩把鑰匙必不可少,它們就是man和info。比如,想學習bash編程,可以嘗試輸入man bash來查看bash的文檔,如下圖(後面的截圖都是將gnome-terminal全屏後的效果,完全模擬全文本界面,沒有設置半透明背景):
而對於GNU出品的軟件,往往都提供info格式的文檔,可以通過info命令閱讀。例如,想了解Grub怎麼安裝和配置,可以輸入info grub查看其文檔,如下圖:
需要提一下,在Ubuntu中,很多軟件的文檔是單獨打包的,可以通過aptitude search命令搜索,通過aptitude install命令安裝相應的文檔包。有些軟件的文檔可能不是man格式或info格式,而是html格式或pdf格式,這時,可以通過前面提到的方法找到這些文件都安裝在文件系統的什麼地方,然後使用相應的閱讀器打開閱讀。
閱讀源代碼通過查找軟件包、無所不能的搜索引擎和精心編寫的文檔,我們基本上可以解決Linux系統下絕大部分的問題。只有極少數情況下,可能需要閱讀源代碼。
在Ubuntu系統下,可以通過sudo apt-get source命令獲取某一個包的源代碼。比如要想學習getty是怎麼寫的,想看它的代碼,使用如下圖命令:
在Ubuntu中,Linux內核的源代碼是特例,它單獨打包。可以使用如下命令搜索內核的源代碼:
yum自己並沒有下載安裝源代碼包的功能。
但是yum-utils軟件包中的yumdownloader工具可以讓人下載源代碼包。命令為yumdownloader --source package-name。下載的源代碼包是.src.rpm格式。如果只想閱讀源代碼,而不是想重新編譯源代碼的話,可以使用rpm2cpio命令和cpio命令對該源代碼包進行解包。截圖如下:
源代碼下載和安裝後,如果僅僅只是閱讀,使用Vim足以。在“Linux江湖”的後續系列中,我肯定會有一篇如何折騰Vim的博文,所以不在這裡繼續啰嗦。
總結掌握了以上方法論,當在Linux中碰到困難時,即使沒有書本或別人的指導,也可以通過自己的努力找到解決問題的辦法。前面提到的命令如下:
Ubuntu系統:
which
dpkg -S
dpkg -L
aptitude search
aptitude install
apt-get source
man
info
CentOS、Fedora系統:
which
rpm -qf
rpm -ql
yum list
yum install
yumdownloader --source
rpm2cpio
cpio
man
info