Linux/Unix技術叢書 點選這裡檢視第二章:準備 點選這裡檢視第三章:資料流
Linux哲學
The Linux Philosophy for SysAdmins: And Everyone Who Wants To Be One
[美] 戴維·博特(David Both)著
盧 濤 李 穎 譯

第一部分
導 論
■第1章 Linux哲學簡介
■第2章 準備
本書的第一部分介紹Unix哲學和原始Linux哲學,其中後者直接源自Unix哲學,還會介紹Unix和Linux的開發曆史與參與者,以及這些開發者是如何将起先的Unix哲學和後來的Linux哲學付諸實作的。
我制定自己的哲學的理由和動機在很大程度上是原始Linux哲學在應用于系統管理者時存在一些不足。
書中有一些動手實驗,以實作大多數系統管理者最喜歡的學習類型—從實踐中學習。第一部分将為這些實驗做準備。運作實驗需要Linux計算機應具備的一整套最低配置和一個U盤。
本書中的實驗都設計得很簡短。它們的主要目的是幫助讀者了解系統管理者的Linux哲學。
第1章
Linux哲學簡介
Unix哲學是造就Unix獨特和強大的重要組成部分。關于Unix哲學的文章有很多。Linux哲學本質上與Unix哲學基本相同,因為它直接來自Unix。
最初的Unix哲學主要面向系統開發人員。事實上,由Ken Thompson和Dennis Ritchie上司的Unix開發人員在設計Unix的過程中采取了一種對他們有意義的方法,他們建立規則、指導方針和程式化的方法,然後将它們設計到作業系統的結構中。這對系統開發人員來說效果很好,而且(至少部分)适用于系統管理者。在Mike Gancarz的優秀著作《Unix哲學》中,他編纂了來自Unix作業系統創始人的指導方針集合,後來Gancarz先生又把它更新為《Linux/Unix設計思想》。
Eric S. Raymond的另一本書《Unix程式設計藝術》(The Art of Unix Programming)提供了作者在Unix環境中程式設計的哲學觀點。它也有點像Unix的發展曆史,因為它是作者親身經曆和回憶的。此書也可在網際網路上免費擷取。
我從這三本書中學到了很多東西。它們對Unix和Linux程式員都有巨大的價值。每個Linux程式員、系統管理者和開發營運人員都應該熟讀《Linux/Unix設計思想》以及《Unix程式設計藝術》。
我持續使用計算機的時間超過了45年。直到我開始使用Unix和Linux并開始閱讀有關Unix、Linux和它們共有的通用哲學的一些文章及書籍時,我才了解Linux和Unix世界中的許多事情為什麼會實作成現在的樣子。
在撰寫本書時,我已經使用Unix和Linux工作了20多年,作為系統管理者,Linux哲學對我自己的效率和有效性有巨大貢獻。我一直努力遵循Linux理念開展工作,我的經驗是,不管上司(PHB,Pointy-Haired-Boss)的壓力多大都嚴格遵守它,從長遠來看,這麼做總會帶來好處。
原始的Unix和Linux哲學适用于作業系統的開發人員。雖然系統管理者可以将許多原則應用于他們的日常工作,但仍缺少許多解決系統管理者獨有問題的重要原則。
在我的Unix和Linux職業生涯中,我非常幸運能夠遇到一些優秀的導師。他們幫助我樹立了不怕失敗的信心。因為他們總是讓我自己解決我造成的問題,是以當我遭遇失敗的時候,我從中學到的東西遠超任務正常運作時。這些專家擔任系統管理者的時間比我長許多年,他們從來沒有因為失敗而責備我或懲罰我—他們的信條是,“如果你失敗了,你就學會了。”我學到了很多東西。他們教給我的一個重要部分是Linux哲學,但他們也教會了我他們自己的哲學,那些哲學有助于填補原始哲學的缺失部分。
是以,持續使用Linux和Unix的這麼多年來,我已經制定了自己更直接地應用于系統管理者的日常生活和任務的哲學。我的哲學部分基于最初的Unix和Linux哲學,以及我的導師的哲學。當我決定編寫自己的書,一本針對當今系統管理者需求的書時,我從這些原則開始,但随着寫作的進展,這種哲學的結構和性質變得前所未有的清晰。事實證明,這種哲學與最初的Linux哲學有很大的不同。直到那時我才意識到我們多麼需要一種專門針對系統管理者的新哲學。我把這種新哲學稱為“系統管理者的Linux哲學”。
本書是我創造新哲學的成果,它提供了一種獨特的實踐方法,大家可以藉此成為更好的系統管理者。我的成長離不開社群的培養,而且它幫助我變得更加自信,我想把這本書及其揭示的哲學回饋給社群。
在本書中大部分地方會将“系統管理者的Linux哲學”簡稱為“哲學”。
1.1 我是系統管理者嗎
由于本書适用于系統管理者,是以你需要了解自己承擔的是否是系統管理者工作。維基百科将系統管理者定義為“負責計算機系統(特别是多使用者計算機,例如伺服器)的維護、配置和可靠營運的人員”。根據我的經驗,這個系統可以包括計算機和網絡硬體、軟體、機架和機箱、計算機房或空間等。
典型的系統管理者工作包括大量任務。在小型企業中,系統管理者可能負責與計算機相關的所有事情。在較大的環境中,多個系統管理者可能共同負責保持運作所需的所有任務。在某些情況下,你甚至可能不知道你是系統管理者,你的經理可能隻是簡單地告訴你要開始維護辦公室中的一台或多台計算機—這就會使你成為系統管理者,無論你喜歡與否。
術語“DevOps”用于描述以前互相獨立的開發和營運人員的交集。在過去,這主要是教授系統管理者編寫代碼,但現在的重點轉向教授程式員如何執行營運任務。參與系統管理者任務使得這些人至少在部分時間内也是系統管理者。在思科工作時,我有一個DevOps類型的工作。部分時間我編寫代碼來測試Linux裝置,其餘時間我是這些經過測試的裝置所在實驗室中的系統管理者。在我的職業生涯中,這是一段非常有趣和有益的時間。
下面的清單可以幫助你确定自己是不是系統管理者。如果符合其中的幾條,你就是一名系統管理者。
1)你認為這本書可能很有趣。
2)人們經常要求你幫助他們使用計算機。
3)每天早上檢查伺服器,然後再做其他事情。
4)編寫shell腳本以自動完成簡單的任務。
5)共享shell腳本。
6)你的shell腳本使用開源許可證進行許可。
7)你知道開源意味着什麼。
8)你記錄自己所做的一切。
9)你破解無線路由器以安裝Linux軟體。
10)你發現計算機比大多數人更容易交流。
11)你了解:(){ :|:& };:
12)你認為指令行很有趣。
13)你想完全掌控。
14)你是root使用者。
15)你了解應用于軟體時,“免費”與“自由”之間的差別。
16)你在機架機箱中安裝了計算機。
17)你将标準CPU冷卻風扇更換為散熱更多的風扇。
18)你購買配件并組裝自己的計算機。
19)你為CPU使用液體冷卻。
20)你可以在所有的東西上安裝Linux。
21)你有一個Raspberry Pi連接配接到你的電視。
22)你使用Raspberry Pi作為家庭網絡的防火牆。
23)你運作自己的電子郵件、DHCP、NTP、NFS、DNS或SSH伺服器。
24)你破解了家用計算機,以用更快的速度更換處理器。
25)你已在計算機中更新BIOS。
26)由于經常更換配件,是以将蓋闆從計算機上卸下。
27)ISP提供的路由器處于“直通”模式。
28)你使用Linux計算機作為路由器。
29)其他……
明白了吧。我可以列出更多可能使你成為系統管理者的東西,但那将會有數百個條目。我相信你可以想到更适合你的東西。
1.2 哲學的結構
系統管理者的Linux哲學有三個層次,類似于馬斯洛的需求層次這些層次也通過逐漸提高的領悟水準展現着我們的成長。
底層是基礎層—擔任系統管理者執行最低級的工作需要知道的基本指令和知識。中間層包含在基礎層上建構,并告知系統管理者的日常任務的實用原則。頂層包含滿足系統管理者的更高要求,以及鼓勵并使我們能夠分享知識的原則。
本書由三部分組成,分别對應哲學的三個層次,如圖1-1所示。
哲學的第一層也是最基本的一層,它奠定了基礎。我們将介紹“Linux的真相”、資料流、标準輸入輸出(STDIO)、轉換資料流,以及“一切都是檔案”的含義。随着工作的開展,我們會學到很多新指令,學到如何在簡單的指令行程式中有效地使用它們,以及如何利用一切都是檔案的事實。本書第二部分對這個基礎層進行了詳細探讨。
然後我們開始探索哲學的中間層,在此處,功能成為我們的行動指南。為了更好地利用指令行,我們開始擴充指令行程式,以建立經過測試且可維護的shell程式,我們可以儲存并可以重複使用甚至共享它們。我們成為“懶惰管理者”并開始自動化一切。我們适當地使用Linux檔案系統分層結構并以公開格式存儲資料。哲學的功能部分見第三部分。
在第四部分我們進入哲學的最高層—領悟層。當我們開始不僅僅隻是執行系統管理者任務并完成工作時,我們對Linux設計的優雅性和簡潔性的了解已經完善。我們開始努力優雅地完成自己的工作,保持解決方案簡單,簡化現有但複雜的解決方案,并建立可用且完整的文檔。我們開始隻是為了獲得新知識而探索和實驗。在領悟階段,我們開始将知識和方法傳遞給那些新的專業人員,積極支援我們最喜歡的開源項目。
在現實生活中,哲學的層次很少是泾渭分明的。如何運用和應用哲學的原則可能會因環境、上司、我們的教育訓練水準以及我們目前對哲學的了解而有所不同。
1.3 誰應該讀這本書
如果你是系統管理者或有志于此職業,你應該閱讀本書。如果你至少履行系統管理者的部分職責,即使這不是你的職位,你也應該閱讀本書。如果你在做開發營運工作,你應該閱讀本書。如果你是一台或多台Linux計算機的root使用者,你應該閱讀本書。如果你經常使用和喜歡指令行,你應該閱讀本書。如果你認為指令行既有趣又強大,你應該閱讀本書。下圖中的奶牛也希望你閱讀本書。
如果你想成為本領高強遠超凡人的Linux系統管理者;如果你想成為其他人在出麻煩時轉身求助的系統管理者—那麼這本書适合你。
本書與學習新指令無關。相反,它講述的是使用你應該熟悉的常見和衆所周知的指令在指令行中闡明Linux的底層結構。可以把這本書以及你将在練習中使用的指令當作體檢時醫生用來揭示人體内部的工具,如X射線、CT掃描和核磁共振成像。本書将展示如何使用一些簡單的Linux指令來揭示GNU/Linux的底層結構。
本書旨在揭示和說明指令行的強大功能與靈活性,以及支援這些特征的設計和使用原則。了解如何從Linux指令行中提取最多資訊可以幫助你成為更好的系統管理者。
我假設本書的讀者至少有一整年的Linux指令行界面經驗,最好是使用bash shell,但任何shell都可以。你應該熟悉許多Linux指令。
我期望你已經知道如何使用适當的指令執行大部分的系統管理者工作,并能夠進行調整以使用适當的裝置。是以,當我告訴你,例如,“将U盤挂載在/mnt上”時,你明白我的意思并能夠确定要挂載的裝置檔案,使用mount指令執行挂載,以及根據需要通路已挂載的裝置,以便建立或檢視内容。
你還應該在一台或多台Linux計算機上具有root通路權限,并且至少已執行一些系統管理者任務滿六個月。如果你在家中的一台或多台計算機上安裝了Linux,則符合此要求并應閱讀本書。
1.3.1 但我不滿足這些要求
也許你不符合之前提出的任何要求,但無論你是想成為系統管理者還是有興趣了解系統管理者的Linux哲學,都可以繼續閱讀本書。在這種情況下,我試圖提供足夠的資訊,使你可以執行大多數實驗。如果确實遇到問題,可與當地的Linux使用者組聯系。世界上有很多這種使用者組,我發現這些使用者組的成員往往非常樂于助人。
如果你有興趣了解有關使用Linux指令行和學習系統管理技能的更多資訊,我推薦下面三本書。當你進行本書中的實驗時,它們将成為很好的參考。
1)Pro Linux System Administration; Matotek, Dennis, Turnbull, James, LIEVERDINK, PETER; Apress; ISBN 978-1-4842-2008-5。
2)Beginning the Linux Command Line; van Vugt, Sander; Apress; ISBN 978-1-4302-6829-1。
3)A Practical Guide to Linux Commands, Editors, and Shell Programming Third Edition; Sobell, Prentice Hall; ISBN 978-0-13-308504-4。
這三本書應該能夠讓你學習使用Linux指令行和系統管理。但最好的方法是盡可能多地親自動手。
1.3.2 誰不适合讀這本書
如果你隻是想使用你的網絡浏覽器、發送電子郵件,并且可能使用LibréOffice Writer程式建立一些文檔,并不關心Linux幕後發生的事情,而且是依賴他人來修複你的計算機的問題,那麼本書不适合你。
如果你的唯一目的是要了解進階指令以及如何使用它們—這本身就是一個令人欽佩的目标—本書也不适合你。
1.4 Linux的真相
Linux指令行的驚人功能在最初引自Unix的以下引言中暗示了。它也适用于Linux。
Unix的目的并不是阻止使用者做傻事,因為那樣也會阻止他們做聰明的事情。
—Doug Gwyn
這句話總結了Unix和Linux最重要的事實—作業系統必須信任使用者。隻有通過擴充這種完全的信任度,才能讓使用者充分利用作業系統所能提供的全部功能。這個事實适用于Linux,因為它作為Unix的直接後繼者而傳承。
1.5 限制性作業系統
保護使用者免受其擁有的能力損害的作業系統是從下面的基本假設開始設計的,即使用者不夠聰明或知識不夠淵博,進而無法信任他們擁有計算機實際可以提供的全部功能。這些作業系統是限制性的,并具有通過設計強制執行這些限制的使用者界面—指令行和圖形。這些限制性的使用者界面迫使普通使用者和系統管理者進入一個沒有窗戶的封閉房間,然後關門并将其鎖上。上鎖的房間阻止了他們做任何Gwyn先生提到的那些聰明的事情。
這種限制性作業系統的指令行界面提供相對較少的指令,對任何人可能采取的可能行為提供事實上的限制。一些使用者覺得這很舒服。但有些人(包括我)不會這麼認為。
1.6 Linux是開放和免費的
Linux從一開始就設計為開放和免費的,因為使用者和系統管理者應該在自己的領域内對作業系統的所有方面進行完全通路。結果是我們可以用Linux做那些非常聰明的事情。開放和免費還有其他含義,例如免費Libré開源軟體(FLOSS)和免費啤酒,但該讨論适用于其他書籍。
即使是最有經驗的使用者在使用Linux時也可能做“傻事”。我的經驗是,利用開放型作業系統提供的全部功能,可以更輕松地從我自己不那麼罕見的愚蠢中恢複。我發現大多數時候,幾條指令就可以解決問題,甚至無須重新開機。有幾次,我不得不切換到較低的運作級别來解決問題。隻有在很少的情況下,才需要啟動到恢複模式來編輯我故意損壞的配置檔案,這會導緻嚴重的問題,包括無法啟動。需要了解Linux的基本理念、結構和技術,以便能夠充分釋放其能力,尤其是當事情被弄糟時。隻需要對系統管理者知識有所了解,就可以充分發揮Linux的潛力。
1.7 真正的知識
任何人都可以記住或學習指令和程式,但死記硬背出來的東西不是真正的知識。如果沒有掌握Linux的哲學以及在Linux的優雅結構和實作中展現這一點的相應知識,就不可能應用正确的指令作為工具來解決複雜的問題。我見過一些Linux知識淵博的聰明人卻無法解決一個相對簡單的問題,因為他們不了解表象下面結構的優雅。
作為系統管理者,我在許多工作中的部分責任是協助雇用新員工。我參加了許多技術面試,面試過一些通過了許多微軟認證并且有漂亮履歷的人。我也參加了許多尋找Linux技能人才的面試,但很少有應聘者獲得認證。這是因為當時微軟認證是最重要的,但Linux資料中心尚在早期發展階段,很少有應聘者獲得Linux認證。
我們通常在面試的一開始詢問用于确定申請人知識限制的問題。然後會提出更有趣的問題,這些問題會測試他們通過問題推理找到解決方案的能力。我注意到一些非常有趣的結果。很少有Windows證書所有者可以通過我們提供的方案來進行推理,而很大一部分Linux應聘者卻都可以做到這一點。
我認為上述結果部分是因為獲得Windows證書依賴于記憶而不是實際的操作經驗,還因為Windows是一個封閉系統,這阻礙着系統管理者真正了解它的工作原理。我認為Linux應聘者做得更好,因為Linux在多個層面上是開放的,其邏輯和原理可用于識别并解決任何問題。任何使用Linux一段時間的系統管理者都必須了解Linux的體系結構,并且在應用知識、邏輯和原理來解決問題方面擁有相當豐富的經驗。
1.8 啟示
本書大部分内容都是在Linux指令行中進行的,但這些内容與指令本身無關。在本書中,如果你知道如何闡明Linux的底層結構之美,就可以用指令作為工具來展示這種美。本書将展示如何使用這些常用指令來探索這種美,進而幫助你實作領悟。
本書中的所有指令,除了少數之外,都是你應該已經熟悉的指令。本書将使你能夠使用這些常用指令來探索Linux的底層,并自己發現Linux的真相。
這會很有趣!