Linux 戰略或生態圈是什麼?

weixin_34208283發表於2017-11-15

姓名:李鴻彬

學號:16040520011

轉載自https://www.zhihu.com/question/38070637,有刪節

【嵌牛導讀】通常我們說Linux,是說Linux Kernel,這個東西在The Linux Kernel Archives這個網站上維護。但老實說,Linux在什麼網站上維護是個很無所謂的問題,Linux的版本管理引領了一個時代,稱為“分散式版本管理”,區別於傳統的“中心式版本管理”

【嵌牛鼻子】[Linux和GNU/Linux] 【商業公司的加入】 【Android】【Linux的維護模型】

【嵌牛提問】Linux 戰略或生態圈是什麼?

【嵌牛正文】作者:in nek

[Linux和GNU/Linux]

傳統中心式的版本管理,管理工具本身已經決定了哪個是中心,因為只有中心上才有所有的歷史記錄,其他人手上只有某個時刻的形態(revision,snapshot),而Linux的管理措施是,你從某個點上取下一個版本,這個版本就具有所有歷史記錄,從物理形態上說,它和原始的那個管理中心沒有任何區別。

所以,今天你從http://kernel.org上通過git取一個最新版本出來,然後你出來聲稱,這才是Linux Kernel的開發中心,這沒有任何問題。

但事實當然不是這樣,因為這個中心除了依靠定義,還依靠開發者的認同,你一個人的世界,一個人開發,你說你那個是中心,這沒有問題,但Linux是一大群人一起做的開發,你沒有辦法讓所有人都加入這個陣營,你那個就不是中心。它可以是你個人的中心,也可以是你開的那個公司的中心,但它不是行業的中心。

這個時候你是否開始明白Linus Torvards的強大了?無論是Intel、Google還是HP、Qualcomm,這些公司多麼強大,大家認可的中心是Linus Torvards個人電腦上的那個分支。

我在知乎上得贊最多的是這個回答:《道德經》講了什麼?為什麼它廣受推崇? - in nek 的回答。但也許大家不知道,我其實對討論“國學”話題是沒有太大興趣的,我描述那個模型,是因為我需要借它的概念來描述Linux的程式碼維護模型而已。

Linux走到今天,是一個“人心”模型,Linus Torvards得到所有人的認同,不是因為他個人的開發能力有多強(再強也強不過這麼多公司養的一大群Fellow吧?),而是他代表了所有人(這個圈子的開發者)的利益。他才最大程度地“合道”。理解這一點,你才會明白Linux的維護策略和發展方法。Linus對這個問題是有清晰的認知的,大家可以去看他的自傳《Just For Fun》,裡面對他的維護哲學有很明白的表述的。

好了,我們偏題太遠。我們接著談Linux這個詞語的語義。我們說,Linux是個Kernel,這和我們一般大眾的理解的範圍有所不同,我們總是把Linux和Windows並列,但Linux這個詞語在開發者看來,它只是核心,就相當於Windows的System32目錄下的那個ntoskrnl.exe那個檔案,滄海一慄,它是一個完整的作業系統中最核心的那部分程式碼(所以叫核心麼:))

Linus最初開發Linux的時候,也就是覺得有必要開發一個真正實用的(對比Minix,一個教學用的系統),不需要購買的,可以用於他的PC的一個小系統。他已經有一些基本的外部工具了(當時Unix世界已經有不少人在開發開源的工具了,但大家並沒有核心),所以他需要的是一個可以把他的PC驅動起來的核心,於是,他就開始開發了他的核心。在這個核心釋出以後,一直立志推動自由軟體運動的GNU專案的領導者Richard Stallman對它發生了興趣。

這裡又要偏一下題了,不少人可能對自由軟體運動有誤解,覺得它的理想是讓軟體不要錢。但英語中free是有兩個含義的,一個對應我們中文的“免費”,另一個對應我們中文的“自由”。自由軟體運動提倡的是後者,不是前者,請注意,不是前者。前者是給自由軟體運動潑汙水。自由是基於權利的:你把軟體賣給我了,卻不給我原始碼,我自己的軟體,為什麼我不能修改它的行為?——所以,請把原始碼一起給我,讓我有修改軟體的邏輯。我不評價這種觀點對不對,但Anyway,我們得首先搞清楚Stallman的訴求。

為了實現他的理想,Stallman召集了更多的人,要實現(不是開發,也就是說,如果有人肯提供程式碼,他就把這個東西接納進來)一個自由的作業系統,這個作業系統包括所有必須的Unix工具,而且所有程式碼開源。這個專案就叫GNU,GNU是一個遞迴的定義,它叫GNU is not Unix。很有點程式設計師調侃的意思。GNU專案開發了很多的工具,包括一個稱為Mach的作業系統核心。Mach是個很學院派的設計,採用了業界最先進的“微核心”架構理念(估計要被人K:我個人認為所有的微核心都是學院派的意淫,我分析過QNX和NT的商用模型和程式碼,所有這些系統,等他們成功商用的時候,他們都在相當程度上背叛了他們初衷,原因參考這裡:Linux 為什麼還要堅持使用單核心? - in nek 的回答),所以這個系統一直開發得半死不活,Stallman等不了,看著Linux的發展勢頭,他就直接去了找Linus,兩人一拍即合,所以就有了GNU/Linux。

其實Stallman和Linus是兩個很不一樣的人,前者更注重理想,後者則更注重解決問題。所以,加入GNU專案後,Linus就更注重讓程式碼和GNU的工具整合,比如很多作業系統自身不好解決的問題,就可以放到GNU的gcc工具鏈中解決。這種策略迅速讓GNU的各種專案之間互相抱團,形成了更大的圈子。Stallman看起來就更注重讓人們注意到Linux和GNU/Linux這兩個名字是不同的,前者是作業系統核心,後者才是一個包括所有工具的“作業系統”。

看起來,Linus是個更務實的人,Stallman是個更務虛的人。但我個人不是這樣看,我認為他們都是務實的人,只是工作在不同的層面。這就好比一個1000開發人員的公司的CTO,如果專職寫程式碼,這就不叫務實。

無論兩人初衷和策略如何吧,反正通過GNU運動的抱團,GNU/Linux的生態鏈迅速壯大,讓它有了爭雄的底子。

【商業公司的加入】

但僅僅通過自由軟體運動是不夠的,這個世界都是一樣的人,一個圈子有1000人,一個圈子有1000000人,然後你說第一個圈子能開發出一個比第二個圈子更好的軟體,這是中二少年或者看戲閒人才有的想法。

在GNU/Linux實力大幅增強的時候,IBM從中看到了機會,當時大型機市場初現萎縮的趨勢,在硬體裝置的可靠性逐步提高,伺服器更大規模使用後,低端的PC伺服器給IBM這種傳統大型伺服器廠家帶來很大的挑戰,微軟的霸主地位又吃掉了這個市場的大部分利潤,所以IBM決定扶持Linux。這是Linux從2.2.x版本升級到2.4.x版本的核心動力,IBM幾乎是不計成本地把他在大型伺服器上得到的那些商業級的經驗大量向Linux灌輸,現在Linux用得到處都是的關鍵無鎖技術RCU,就是IBM貢獻的結果。這個事情當時是非常震撼的,即使IBM做得非常低調,多家Unix版權的擁有者都跳起來告IBM和Linux,說侵犯了他們的版權,跳得最歡的是SCO了,SCO和IBM擴日持久的訴訟,是那幾年我們做行業跟蹤的最大八卦了:)當然,今天我們都已經知道了,戲裡才有奇蹟,這個世界沒有那麼多奇蹟,和藍色巨人對抗的結果就是一個死字。這個事情終究以SCO的破產落幕了。

GNU/Linux終於憑著這個機會走到了行業的主流道路上,Linux終於成為行業的中堅力量。

一樣的故事發生在Win-tel聯盟的分裂,Intel也開始大幅提高對Linux裝置的支援,這樣一步步走來,我們就眼看著大部分外設的驅動,從僅支援Windows,跑到同時支援Windows和Linux,再到首先支援Linux,然後才支援Windows,乃至不支援Windows。這就是抱團的力量。

當然,這種情況更多發生在伺服器市場,桌面市場找不到好的商業模式,這個問題則不明顯。其實這個過程中,Windows做了一個非常成功的運作,他們首先和所有銀行合作,解決了網銀支付的問題,這種問題,沒有人可以和Windows對抗(包括Mac),這一局奠定了Windows在個人使用者市場的地位(我知道你們還有其他理由,比如遊戲等,但這個理由才是最硬的,但無所謂啦,所有條件都只是一部分事實,我們關注的是我們整個討論的邏輯鏈),直到最近幾年移動網際網路的興起,才讓銀行支付很大程度上和Windows解綁。

【Android】

然後就是Google的Android。Android這個東西外行有很多誤解,我在這裡給大家一個比較簡單的名稱空間。Android大概可以包括5個部分,從上到下,包括這些幾個:

應用:就是我們平時看到是微信啊,高德地圖啊這些apk,apk可能是Google自己寫的(比如Android內建的“照片”之類的),但更多是第三方寫的,大量的第三方軟體如何使用Android,控制了Google如何發展Android,但反過來,Google也控制了這些第三方軟體的發展。

Android框架:這包括所有的提供給應用的基礎設施,就相當於GNU/Linux外面包的一大堆工具,這裡請大家不要和Android自身定義的Framework混淆了,Android的程式碼介紹中,Framework只包括Java部分,我這裡不這樣分,以便讀者聚焦,這個部分包括一個Java虛擬機器,提供給Apk的Java庫(原來的Framework部分),為了讓這個Java庫跑得更快的C++寫的其他庫。這些程式碼的版權是Apache版權,簡單說,既可以開源,也可以公開。Google的宣傳中,經常說Android是Apache版權,是Google認為,這個部分才是Android,你也可以認為這是狹義的Android,而包括其他部分的是廣義的Android。很大程度上Android框架其實是一個類似Windows的圖形介面那樣的而一個“應用”,只是這個應用很大,大到使用者都直接和它接觸。

HAL:硬體抽象層。不少人望文生義,以為這是“使用者態驅動”,或者“驅動的抽象”。這是錯誤的,HAL是底層作業系統和Android框架的介面層。驅動仍是底層作業系統的事。簡單說,我的Android框架需要一個照相的介面,我定義我自己怎麼調你底層作業系統,作業系統上要適配出一個庫來提供介面給我,這個庫,就叫HAL

作業系統支援庫:Bionic。作業系統核心都需要通過一種特殊的技術,稱為“系統呼叫”去使用,但我們平時程式設計序都使用函式呼叫,這個部分提供作業系統呼叫的封裝,這個庫最基礎的部分稱為libc,我們平時程式設計中常用的如malloc啊,printf啊之類的呼叫,都在這裡提供,GNU/Linux提供的那個libc,就叫glibc。顯而易見,承載了Stallman的理想,glibc是LGPL版權的。Google不想被這個版權繫結,他們基於BSD的libc重新開發了一個libc,這個libc就叫Bionic,也是apache版權的。

作業系統核心:最後就是Linux了,Android使用Linux核心,提供驅動的支援。

所以讀者可以明白,你說Android也是一個Linux,這話不對。但你說Android和Linux沒有關係,這也不對。實際上,Android的框架設計上,是可以換一個作業系統(核心)的,比如你換成FreeBSD,然後修改HAL和Bionic這兩層的實現,你就可以實現一個新的Android平臺。但現實是這樣做成本很高。因為Android用到的各個SoC廠家的驅動,包括各種屏,Modem,Wifi的驅動,都是為Linux寫的,Linux代表一個合作的中心,換掉這個合作的中心,你就放棄到這一個大腿,你就需要自己維護一條更粗的大腿。

說這麼多,是想讓大家都明白,Linux已經超出GNU/Linux的範圍,被廣泛使用者各種新的實踐中。Linux的力量,正來自這種“眾人之所欲”,大家都靠著Linux的生態圈在討生活。

【Linux的維護模型】

如果你對http://kernel.org有所瞭解,你會知道Linux的維護策略有點類似我在這裡談的Android的第一把刀:如何理解Google的Android戰略? - in nek 的回答。也就是“唯快不破”,Linux比Android還快得多。你可以用下面的資料體會一下:

Linux2個半月升級一次版本,每個版本大概最終修改10000個PatchSet(你可以認為是一個使用者可以感知的特性),我們算每個PatchSet捲入的程式碼是100行,這就有100萬行的“文字”要看。而且不是抒情小說的行哦,是偵探小說的行哦。每行都要動腦的哦。而我們一般工程師的開發效率是每天25-50行程式碼。就算不算設計和測試,純寫程式碼,也不過是200-400行(那些喜歡把相同邏輯拷貝100遍的垃圾工程師的輸出不算,那種程式碼是要被Linus當眾羞辱的),這樣算來,即使Linus每天不眠不休看這些程式碼,他也看不完。

所以Linus實際有一批核心維護者,他們負責每個子系統的維護,比如網路子系統,維護者就是David S. Miller,如果你的網路卡驅動需要修改,你就不用找Linus,你找Dave就好了,你把你要修改的補丁準備好,發給David,抄送給所有受影響的郵件列表和相關人員(這些東西都可以在你準備好補丁後,通過執行Linux程式碼中的指令碼來得到),David會Review這些程式碼,如果他沒有意見,其他人也不在這個過程中跳出來找你麻煩,他就會把你的程式合入他的分支。Linus每隔一段時間,就會告訴所有的二級維護者,告訴他們現在可以合入程式碼了,這些二級維護者就會準備他們給Linus的分支,讓Linus一次把所有程式碼收進去。

Linus開始收程式碼的過程稱為Open Windows,有兩個星期,程式碼上去,進行簡單的修整(如果不行就拋棄那個補丁,反正一定要能跑),最後就會進入RC(預釋出)週期,Linus不斷髮布RC0, RC1這樣的版本,讓不同的子分支的人提意見,只要意見有道理,對應的修改就會被刪除。這樣經過7個星期,RC7以後,一個新的Linux核心版本就會發布。

一般來說,大部分發行版(包括如Android這樣的版本)不會立即使用最新的Linux核心,因為用於商業,頻繁的改動既不利於質量的可靠性,也不利於使用者介面的穩定性。但大部分的發行版都會在開發新版本的時候,升級到一個較新的Linux核心的版本上。

正如我們前面說的,Linux快速的改動,是所有廠商都背離不起的,比如你是做伺服器的,你只是做了硬體,最多就寫一些驅動,但你是否支援使用者使用Xen呢?Xen的新特性是基於最新的Linux核心寫的,你不升級到最新的核心,你怎麼保證使用者可以用Xen呢?反過來是一樣的,你是Xen的供應商,你停留在一個固定的核心版本上,但伺服器的供應商都支援最新的核心,那你要支援這些新的硬體嗎?這樣的互相制約下,大家都要千方百計把程式碼放到Linux中了,Linux就成為一個標準組織了。

這就是Linux的生態,它是一個OS的中心標準,是所有主流廠商合作的平臺,它已經吸夠了力量,短時間內,如果技術沒有巨大的變化,已經沒有人可以摧毀它了。

相關文章