Linus說(shuō)“Just for fun”,而我要說(shuō)“Just for 折騰”。想知道我是怎樣折騰Linux的,請(qǐng)看下面這個(gè)截圖:
![](/d/20211018/95c2d15d353aa0d86787c10fd5f9e9f1.gif)
從這個(gè)截圖可以看出,我為了“折騰”Linux系統(tǒng),在我的電腦上安裝的5個(gè)不同的發(fā)行版。它們分別是Ubuntu 14.04桌面版、CentOS 5.10、CentOS 6.5、Fedora 20和一個(gè)Ubuntu 14.04 Server版。在以上所有系統(tǒng)中,只有Ubuntu 14.04桌面版和Fedora 20開(kāi)啟了GUI,其它的幾個(gè)系統(tǒng)都使用字符界面。上面的截圖就是我在Ubuntu 14.04桌面版中,使用ssh遠(yuǎn)程連接到另外四個(gè)系統(tǒng)時(shí)的情形。
關(guān)于字符界面和圖形界面
多年前,我使用Linux系統(tǒng)是偏愛(ài)字符界面的。裝B神器啊,不管是別人看起來(lái)還是自己看起來(lái),都顯得特別的高大上。當(dāng)然,字符界面用起來(lái)那也是相當(dāng)舒服的,不過(guò)只是曾經(jīng)。為什么這么說(shuō)呢,那是因?yàn)樵?4寸或17寸,分辨率限于1024*768的時(shí)代,使用字符界面,字體不大不小,也沒(méi)有刺眼的強(qiáng)光,眼睛看著非常舒服??墒牵詮囊壕?、高分屏?xí)r代來(lái)臨之后,這種舒服感就一去不復(fù)返了。原因何在?字太小。比如在我這個(gè)21.5寸1920*1080的液晶顯示器上,使用純字符界面根本沒(méi)法看,即使開(kāi)啟FrameBuffer也沒(méi)辦法把字體變漂亮。在我的顯示器上,必須使用15pt到16pt的Dejavu Sans Mono字體,眼睛看著才舒服?,F(xiàn)在在網(wǎng)絡(luò)上,仍然有很多人問(wèn)怎么把Linux設(shè)置成啟動(dòng)后自動(dòng)進(jìn)入字符界面這樣的問(wèn)題,我很想告訴他們:拉倒吧,還是使用圖形界面靠譜。對(duì)于確實(shí)沒(méi)有圖形界面的服務(wù)器系統(tǒng),還是老老實(shí)實(shí)使用ssh遠(yuǎn)程連接吧。
在圖形界面下,使用gnome-terminal依然可以模擬全字符界面,只要按一個(gè)F11鍵全屏即可。甚至可以設(shè)置半透明背景,看起來(lái)更拉風(fēng)。如下圖:
![](/d/20211018/6253290ae4fff45919b0e672ed1fec04.gif)
Fedora 20的圖形界面也不錯(cuò),如下圖,在圖形界面下使用Vim和GVim都很清爽:
![](/d/20211018/16678ad41930444f9847da362b8dd735.gif)
為什么要裝這么多不同的發(fā)行版
都是Linux,為什么要裝這么多的發(fā)行版呢?那是因?yàn)橄到y(tǒng)和系統(tǒng)之間是不一樣的。不同流派的發(fā)行版不一樣,同樣流派的發(fā)行版,老系統(tǒng)和新系統(tǒng)也不一樣。還是以上面提到的那個(gè)經(jīng)典問(wèn)題“怎么把Linux設(shè)置成啟動(dòng)后自動(dòng)進(jìn)入字符界面”為例。對(duì)于這個(gè)問(wèn)題,教科書(shū)式的回答是:將/etc/inittab文件中的啟動(dòng)級(jí)別修改為3。但是,我可以很負(fù)責(zé)任地說(shuō):教科書(shū)過(guò)時(shí)了。
我最早是從Red Hat Linux 9開(kāi)始接觸Linux的,那時(shí),天天抱著一本《Red Hat Linux 9 寶典》啃。很顯然,這本書(shū)現(xiàn)在已經(jīng)是古董級(jí)了,因?yàn)镽ed Hat后來(lái)就開(kāi)始做Enterprise Linux,每?jī)赡暌粋€(gè)版本,現(xiàn)在已經(jīng)到了Enterprise Linux 6,馬上就要出第7版了。在我安裝的這些系統(tǒng)中,CentOS等同于Red Hat Enterprise Linux,F(xiàn)edora是Red Hat新技術(shù)的試驗(yàn)場(chǎng),所以他們是一個(gè)流派的,F(xiàn)edora 20比CentOS 5、CentOS 6新,Ubuntu則是另外一個(gè)流派,每半年出一個(gè)新版本,我用的是目前的最新版。
我想,我們中的很多人學(xué)習(xí)Linux都是從Red Hat開(kāi)始的吧。就像我家里總有那么幾本經(jīng)典教材,如下圖(我書(shū)柜一角的照片):
![](/d/20211018/41aa70e7c9a6a75e55cdc9b211dc970e.gif)
對(duì)于前面提到的那個(gè)經(jīng)典問(wèn)題,教科書(shū)式的回答僅適用于CentOS 5及其之前的版本,其它的系統(tǒng)則各有各的方法。我將在后面講述方法論的時(shí)候詳細(xì)說(shuō)明。
折騰Linux系統(tǒng)的方法論
要想在Linux江湖中暢行無(wú)阻,光靠幾本入門(mén)書(shū)是遠(yuǎn)遠(yuǎn)不夠的,還得掌握適當(dāng)?shù)姆椒āN业姆椒ㄕ撊缦拢?/p>
1.在使用一個(gè)命令的時(shí)候,最好要知道它屬于哪個(gè)軟件包;
2.會(huì)查找和安裝軟件包,安裝軟件包后,要能夠找出文件都安裝到哪里了;
3.要會(huì)閱讀軟件的文檔;
4.實(shí)在不行了,那就看源代碼吧。
使用我的方法論還是得有一定的Linux基礎(chǔ)(比如如何進(jìn)行用戶(hù)管理、文件管理等,以及了解Linux究竟是個(gè)什么樣的系統(tǒng)這樣的基本哲學(xué)問(wèn)題),所以教科書(shū)還是很有必要讀那么幾本的。過(guò)了基礎(chǔ)階段,折騰Linux其實(shí)就是折騰Linux系統(tǒng)下的各種軟件,這個(gè)時(shí)候,掌握正確的方法論尤其重要。
舉例說(shuō)明
還是以前面提到的經(jīng)典問(wèn)題為例,究竟怎么樣才能讓Linux系統(tǒng)啟動(dòng)后自動(dòng)進(jìn)入字符界面呢?按我的方法論,我們還是得從軟件分析起。Linux系統(tǒng)的內(nèi)核加載完畢后,第一個(gè)執(zhí)行的進(jìn)程是init,是進(jìn)入字符界面還是進(jìn)入圖形界面,當(dāng)然是init說(shuō)了算。不同的系統(tǒng),啟動(dòng)的第1個(gè)進(jìn)程都叫init,可此init等于彼init嗎?所以,1.我們要找到這個(gè)init屬于哪個(gè)軟件包;2.找到這個(gè)軟件包的文件都安裝在文件系統(tǒng)的哪些位置,這個(gè)軟件包還包含哪些程序,包含哪些文檔;3.閱讀這個(gè)軟件包的文檔(當(dāng)然,首先利用搜索引擎對(duì)該軟件包做一些功課是必須的);4.實(shí)在不行就閱讀源代碼吧。
在Red Hat流派的系統(tǒng)(CentOS、Fedora)中,軟件的包管理器是RPM。先看CentOS 5.10,首先,使用which init命令,可以查出init的完整路徑為/sbin/init;然后使用rpm -qf /sbin/init命令,可以查出init程序所在的軟件包為SysVinit;最后,使用rpm -ql SysVinit命令,就可以看到這個(gè)軟件包里面還有哪些程序、哪些文檔以及它們分別位于文件系統(tǒng)的什么地方了,如下圖:
![](/d/20211018/98deedbdc14130917d98cd7dde07a91a.gif)
而Ubuntu屬于另外一個(gè)流派。它的包管理器為dpkg。在Ubuntu中,首先,使用which init命令,可以查出init的完整路徑為/sbin/init;然后使用sudo dpkg -S /sbin/init命令,可以查出init程序所在的軟件包為upstart;最后,使用sudo dpkg -L upstart命令,就可以看到這個(gè)軟件包里面還有哪些程序、哪些文檔以及它們分別位于文件系統(tǒng)的什么地方了,如下圖:
![](/d/20211018/7eff3d49ea5f70b1b42e3c2db9edc7aa.gif)
用同樣的方法研究一下CentOS 6.5,發(fā)現(xiàn)其init程序也是屬于upstart軟件包,如下圖:
![](/d/20211018/08a7659a3c212006fb975dff831d97e3.gif)
究竟是什么樣的優(yōu)勢(shì)使得upstart軟件包取代了傳統(tǒng)的SysVinit軟件包呢?很顯然,有了以上信息,我們?cè)贕oogle上以u(píng)pstart、SysVinit作為關(guān)鍵字搜索一下又有何難。另外,還會(huì)有更先進(jìn)的軟件包取代upstart嗎?讓我們看看Fedora 20用的什么,如下圖:
![](/d/20211018/7c4f353cf66af9b876d2aa5988ef2b13.gif)
原來(lái)Fedora 20用的是systemd。使用cat /etc/inittab命令可以顯示inittab文件里面的內(nèi)容,從其提示可以看出Runlevel的概念早已無(wú)影無(wú)蹤。由此可見(jiàn),inittab、RunLevel都不是Linux本身的哲學(xué),只是軟件層面的定義而已。
查找和安裝軟件包
使用Ubuntu、CentOS、Fedora等Linux發(fā)行版有一個(gè)很省心的地方,那就是它們都具有官方的軟件包倉(cāng)庫(kù),只需要一個(gè)命令,就可以從倉(cāng)庫(kù)中查找、安裝相應(yīng)的軟件包。Ubuntu系統(tǒng)使用的是apt-get或aptitude,Red Hat流派的系統(tǒng)使用的是yum。如下圖,在Ubuntu中使用aptitude查找軟件包:
![](/d/20211018/d91c9f715f3e725258d20c4d3b15974d.gif)
在CentOS 5中使用yum查找軟件包:
![](/d/20211018/28af447e620854fcc81bf4633e8c6eba.gif)
怎么查看軟件的文檔
Linux就是一座寶藏,其中有汗牛充棟的精心編寫(xiě)的文檔,一輩子都學(xué)不完。要發(fā)掘這座寶藏,有兩把鑰匙必不可少,它們就是man和info。比如,想學(xué)習(xí)bash編程,可以嘗試輸入man bash來(lái)查看bash的文檔,如下圖(后面的截圖都是將gnome-terminal全屏后的效果,完全模擬全文本界面,沒(méi)有設(shè)置半透明背景):
![](/d/20211018/6309499d058e6f5aecc161d49efcaa25.gif)
而對(duì)于GNU出品的軟件,往往都提供info格式的文檔,可以通過(guò)info命令閱讀。例如,想了解Grub怎么安裝和配置,可以輸入info grub查看其文檔,如下圖:
![](/d/20211018/da298d7231954dfae11ab8d742fad7c6.gif)
需要提一下,在Ubuntu中,很多軟件的文檔是單獨(dú)打包的,可以通過(guò)aptitude search命令搜索,通過(guò)aptitude install命令安裝相應(yīng)的文檔包。有些軟件的文檔可能不是man格式或info格式,而是html格式或pdf格式,這時(shí),可以通過(guò)前面提到的方法找到這些文件都安裝在文件系統(tǒng)的什么地方,然后使用相應(yīng)的閱讀器打開(kāi)閱讀。
閱讀源代碼
通過(guò)查找軟件包、無(wú)所不能的搜索引擎和精心編寫(xiě)的文檔,我們基本上可以解決Linux系統(tǒng)下絕大部分的問(wèn)題。只有極少數(shù)情況下,可能需要閱讀源代碼。
在Ubuntu系統(tǒng)下,可以通過(guò)sudo apt-get source命令獲取某一個(gè)包的源代碼。比如要想學(xué)習(xí)getty是怎么寫(xiě)的,想看它的代碼,使用如下圖命令:
![](/d/20211018/5d8aff95e5d38aa3a375c3817cdb7be0.gif)
在Ubuntu中,Linux內(nèi)核的源代碼是特例,它單獨(dú)打包??梢允褂萌缦旅钏阉鲀?nèi)核的源代碼:
![](/d/20211018/fecb99f3eb066be7f0ee972a345658cc.gif)
yum自己并沒(méi)有下載安裝源代碼包的功能。
但是yum-utils軟件包中的yumdownloader工具可以讓人下載源代碼包。命令為yumdownloader --source package-name。下載的源代碼包是.src.rpm格式。如果只想閱讀源代碼,而不是想重新編譯源代碼的話(huà),可以使用rpm2cpio命令和cpio命令對(duì)該源代碼包進(jìn)行解包。截圖如下:
![](/d/20211018/4e6041901537dd4be7c89f5d1104c6ef.gif)
![](/d/20211018/0df08aa8cf9de5485d0cd317949ea1d2.gif)
源代碼下載和安裝后,如果僅僅只是閱讀,使用Vim足以。在“Linux江湖”的后續(xù)系列中,我肯定會(huì)有一篇如何折騰Vim的博文,所以不在這里繼續(xù)啰嗦。
總結(jié)
掌握了以上方法論,當(dāng)在Linux中碰到困難時(shí),即使沒(méi)有書(shū)本或別人的指導(dǎo),也可以通過(guò)自己的努力找到解決問(wèn)題的辦法。前面提到的命令如下:
Ubuntu系統(tǒng):
which
dpkg -S
dpkg -L
aptitude search
aptitude install
apt-get source
man
info
CentOS、Fedora系統(tǒng):
which
rpm -qf
rpm -ql
yum list
yum install
yumdownloader --source
rpm2cpio
cpio
man
info