29 年超 100 萬次 commit,Linux 內核何以發展至今?

2020-12-23 開源中國

1991 年,21 歲的芬蘭大學生 Linus Torvalds 寫下第一行 Linux 內核代碼時,多半沒有想到它會成長為今天這樣的龐然大物。

當年 8 月 25 日,Torvalds 在 Minix Usenet 新聞組裡發了一封帖子,稱自己正在做一個自由的作業系統,「就是個興趣愛好,不會搞得像 GNU 那麼大那麼專業」。

事情的發展顯然遠超他的預期,如今小到傳感器,大到超級計算機,從智慧型手機、手錶、汽車等日常用品到太空飛行器等設備,Linux 內核的身影已無處不在。

隨著迄今為止最大版本 Linux Kernel 5.8 於今年 8 月初的發布,Linux 內核已擁有超過 2 萬名貢獻者,歷史 commit 數超過 100 萬次,迎來一個新的裡程碑。

上周恰逢 Linux 29 周年紀念日,Linux 基金會發布了一份詳盡的 Linux 內核報告,涵蓋了自 1991 年 9 月 17 日首次發布以來,到 2020 年 8 月 2 日最新版本的 Linux 內核歷史。

版本控制:從 BitKeeper 到 Git

Linux 基金會從 2008 年開始每年發布 Linux 內核報告,但此前一直難以將其發展過程完整串聯起來。

今年,藉助 Daniel German 博士的 cregit 工具,他們成功追溯到了第一個版本,Linux 內核的發展時間線變得清晰。根據版本控制方式,可大致分為以下三個階段:

pre-version control(前版本控制):1991 年 9 月 - 2002 年 2 月 4 日BitKeeper:2002 年 2 月 4 日 - 2005 年 4 月 15 日Git:2005 年 4 月 16 日至今版本控制對社區協作能力影響重大,這在 2000 年代初是一件令人頗為苦惱的事情。使用版本控制系統,也就是 BitKeeper 之前,貢獻者需要將補丁提交至郵件列表,待 Torvalds 接受後放進源碼樹,再發布整個樹的新版本。

在這種方式下,具體是誰在做貢獻、貢獻的數量和路徑都不夠透明。

2002 年 2 月 4 日,BitKeeper 的使用標誌著 Linux 內核 commit 歷史的開啟。然而 BitKeeper 為專有軟體,這一決定在社區中遭受了長期質疑。

直到 2005 年,BitKeeper 擁有者 Larry McVoy 決定收回無償使用 BitKeeper 的許可。Torvalds 本人當時又對現成的 CVS 和 Subversion 等集中式版本控制工具感到不滿,因此自己動手,用十天時間寫出了 Git 的第一個版本。

Git 目前已成為開發者們非常熟知且廣泛使用的分布式版本控制系統。Linus Torvalds 則表現得更多的是迫於無奈,他曾聲稱自己「根本不想做原始碼管理,覺得這是計算機世界中最無趣的事情」。

自從版本控制系統由 BitKeeper 改為 Git 後,Linux 內核每年的貢獻者和 commit 數量都在穩步增長。歷年的內核報告數據顯示,2005 年 5 月發布的 2.6.12 版本平均每小時收到 2 次 commit。

15 年後,2019 年的平均數是每小時 9.4 次。而在最新的 5.8 內核中,平均每小時 commit 數達到了 10.7 次。

繁雜且自成體系的內核代碼

首個內核版本 linux-0.01.tar.Z 由 88 個文件和 10,239 行代碼組成,運行在 i386 這樣單一的硬體架構上。到了 5.8 版本,這一數據擴張為 69,325 個文件和 28,442,673 行代碼,並能夠在 30 多種主要的架構上運行。

數量上的龐大僅是 Linux 內核代碼的表象,它自身更是形成了一套複雜的體系,不熟悉的人往往不知從何處下手,極有可能「牽一髮而動全身」。這或許也是內核維護者難尋的原因之一。

Linux 內核發布第一天起的某些代碼仍在當前版本中使用,例如 Torvalds 和大學好友 Lars Wirzenius 共同編寫的 vsprintf 例程,它也是為數不多存在至今的首次 commit 中的原始碼。

今年的內核報告提到,有 2,964 個能被追溯至 1991 年的 token 如今在 5.8 版本中也能找到。5.8 版本超過一半的代碼寫於近 7 年內,但之前所有年份都對此版本有貢獻。過去的代碼不斷在後續的版本中留下痕跡。

持續膨脹的內核文件量和代碼行數未見得完全是一件好事,為了使系統不變得臃腫,內核維護者需要做一些修枝剪葉的工作。

Linux 內核中未使用的代碼和文件都會被視情況刪除,有一些版本還會進行大的清理,例如 2018 年的 4.17 版本,刪除了 8 個架構,淨減少代碼大約 180,000 行。

不僅僅是源碼,Linux 內核維護者還會關注空白行和代碼注釋,以確保源碼的可讀性。

開發者原創證書和標籤管理

2004 年對開發者原創證書(Developer Certificate of Origin,簡稱 DCO)的標準化是 Linux 內核史上的一個關鍵變化點。DCO 的引入為開發者和用戶提供了法律保護,同時又不至於增加程序負擔。

它極大地提高了跟蹤補丁進入內核的路徑的能力,加上版本控制系統向 Git 的過渡,DCO 有效地減輕了開發者做貢獻的開銷,因此變得很受歡迎,後來也被許多其他開源項目採用。

隨著 DCO 的標準化使用,現在幾乎所有的 commit 都有一個 Signed-off-by 標籤。通常每個 commit 平均會有兩個該標籤,能夠反映代碼在合併之前的維護者層次結構,有助於追溯補丁進入代碼的路徑。

Signed-off-by 之外,Linux 內核還增加了表示審查的標籤(Reviewed-by 和 Acked-by)。審查對內核代碼的質量來說相當重要,標籤的加入令這個過程更加清晰,有越來越多的維護者選擇使用標籤來表示已審查。

在審查 git 倉庫時,Linux 基金會發現了一些比較有趣的標籤,像是 "Enithusiastically-ack'd by"、"Thanksto"、"Based-on-the-Original-screenplay-by"、"Catched-by-andrightfully-ranted-at-by" 等等。

但這些標籤並沒有像上述兩類一樣被廣泛採用。

行之有效的發布模式

Linux 內核的發布模式已漸趨成熟,現在基本固定為 Prepatch(或"-rc")、Mainline、Stable 和 Long Term Stable 四類版本。

社區曾對發布周期進行了大量的探討和實驗,並逐漸找到了行之有效的發布模式,發布周期也幾乎完全可預測——每個發布周期由時長兩周的「合併窗口」開始,這時,新功能經適當的 review 後可被納入接下來要發布的 git 倉庫。

一旦它被標記為 rc1,那麼集成測試、調試和穩定化的周期就開始了。然後每周對 rc 候選版本進行標記,直到達到目標質量和穩定性。發布後,隨著下一個合併窗口的到來,這個周期又開始循環。

內核的主線樹由 Linus Torvalds 維護,這棵樹引入了所有新功能。新的主線(Mainline)內核每 2 到 3 個月發布一次。但這樣的發布節奏較慢,難以滿足大多數用戶的需求。因此,從 2005 年開始,每周發行一次穩定版(Stable)內核。

用戶還想要受維護時間更長的版本,於是 2006 年發布的 2.6.16 版本成為第一個長期支持(LTS)版本內核。此後每年都有一個新的 LTS 內核,該內核將由內核社區維護至少 2 年(從 4.4 版本開始延長至 6 年)。

Linux 內核官網公布了所有現存 LTS 版本的發行日期、EOL 日期及維護者(目前 6 個 LTS 版本都由 Greg Kroah-Hartman 和 Sasha Levin 這兩人維護)。

貢獻者:長尾的力量不可忽視

不少組織都在為 Linux 內核做貢獻,貢獻者排行榜前列幾乎都被 Intel、Red Hat、IBM、SUSE、Google、Samsung、AMD、Oracle、華為和 ARM 這樣的大企業佔據。

從 2007 年到 2019 年,Linux 內核共接受了來自 1,730 個組織的 780,048 次 commit。排在最前面的 20 個組織佔了 68% 的 commit 量。

在過去十年中,每年有超過 400 個組織為 Linux 內核做出貢獻。其中相當一部分可能只有過一次 commit。從每年的 commit 比例來看,其中 1/3 貢獻來自神秘的長尾。也就是圖中最上面淺灰色 「Others」 的部分。

Linux 基金會指出,企業的貢獻會根據業務需求和戰略的不同而有所變化。前 20 名貢獻者中,有些是 2007 年之後才加入,有些在此前做過很多貢獻的公司,被收購後便不再繼續參與。貢獻者的多樣性為內核發展賦予了一些彈性。

除了組織貢獻者,Linux 內核社區成員也致力於增加個人貢獻者的多樣性,他們通常願意花費自己的時間來指導新的開發者。

Linux 基金會有一個 Kernel Mentorship(LKMP)項目,用來幫助新加入開源的開發者進行實驗、學習,並為開源社區做出貢獻。

內核社區的共同目標:高質量、可靠性

報告的最後,Linux 基金會指出,內核社區的重點是保持一個共同的目標,即擁有一個沒有回歸的高質量作業系統,願意根據需要創建新的流程和工具,以幫助提高效率,並繼續提升 Linux 內核的可靠性。

內核測試現在也引入了一些自動化測試工具:靜態分析工具如 sparse(語義解析器)、smatch(源匹配器)和cocicheck(語義補丁,測試特定的 bug),由 0-day 和 Hulk Robot 這樣的自動測試機器人在 Linux 內核樹上運行。

機器人在發現和跟蹤 bug 上起到不少作用。這些測試工具能夠幫助開發人員跟上上遊內核的速率變化,並繼續改進內核版本,提升其穩定性。

Linux 內核如今被應用於諸多領域,基金會認為,改進基礎設施,進行正確的安全分析,是接下來要應對的重大挑戰之一。

目前 Linux 內核已擁有一個很好的基礎,它應當繼續引領創造最佳實踐,以促進整個開源軟體行業的發展。

相關焦點

  • 29 年過百萬次 commit,Linux 內核何以發展至今?
    事情的發展顯然遠超他的預期,如今小到傳感器,大到超級計算機,從智慧型手機、手錶、汽車等日常用品到太空飛行器等設備,Linux 內核的身影已無處不在。隨著迄今為止最大版本 Linux Kernel 5.8 於今年 8 月初的發布,Linux 內核已擁有超過 2 萬名貢獻者,歷史 commit 數超過 100 萬次,迎來一個新的裡程碑。
  • Linux 內核代碼超 2780 萬行,但去年 commit 數量銳減
    2020 年 1 月 1 日,Linux 內核 Git 源碼樹中的代碼達到了 2780 萬行。
  • Linux 內核的測試和調試(6)
    找出打你補丁的模塊下面的回歸測試工具,運行一下。如果補丁涉及到其他架構,你需要交叉編譯然後測試一下。請通過下面的目錄查找測試工具:如果你對你的補丁測試結果感到很滿意,你就可以提交補丁了。請確保提交 commit 的信息要描述得非常清楚。要讓內核維護者和其他開發者看懂補丁所修改的內容,這一點非常重要。
  • Linux 內核學習:環境搭建和內核編譯
    內核學習之一:環境搭建--安裝Debian7.3本系列文章假設讀者已對linux有一定的了解,其實學習linux內核不需要有很深的關於linux的知識,只需要了解以下內容:linux基礎知識及基本shell命令;現代作業系統的基本概念;C語言和gcc基本使用。
  • Linux 內核 TCP MSS 機制詳細分析
    所以本文將通過Linux內核源碼對TCP的MSS機制進行詳細分析。作業系統版本:Ubuntu 18.04 內核版本:4.15.0-20-generic地址:192.168.11.112內核源碼:$ sudo apt install linux-source-4.15.0$ ls /usr/src/linux-source-4.15.0.tar.bz2
  • Linux 系統內核的調試
    儘管缺乏一種內置的調試內核的有效方法,但是 Linux 系統在內核發展的過程中也逐漸形成了一些監視內核代碼和錯誤跟蹤的技術。同時,許多的補丁程序應運而生,它們為標準內核附加了內核調試的支持。儘管這些補丁有些並不被 Linux 官方組織認可,但他們確實功能完善,十分強大。調試內核問題時,利用這些工具與方法跟蹤內核執行情況,並查看其內存和數據結構將是非常有用的。
  • Ubuntu中升級Linux內核
    隨著8月底Linux內核4.2發布,經過八個RC候選版後,Linux Kernel 4.2正式版成為最為重大的版本之一,單是新代碼就增加了100萬行,同時還移除了大約25萬行老舊代碼。  ●支持ARCv2和HS38 CPU內核  ●增加了隊列自旋鎖的支持  ●許多其他的改進和驅動更新。
  • Linux2.6內核驅動移植參考
    作者:晏渭川 隨著Linux2.6的發布,由於2.6內核做了教的改動,各個設備的驅動程序在不同程度上要 進行改寫。為了方便各位Linux愛好者我把自己整理的這分文檔share出來。該文當列舉 了2.6內核同以前版本的絕大多數變化,可惜的是由於時間和精力有限沒有詳細列出各個 函數的用法。
  • Linux內核編譯初體驗
    下載內核在ftp://ftp.kernel.org/pub/linux/kernel/下載原版內核本文引用地址:http://www.eepw.com.cn/article/201611/319326.htm此處使用linux-2.6.22.6.tar.bz22.
  • Linux內核啟動-內核解壓縮
    本文引用地址:http://www.eepw.com.cn/article/148792.htm從內核的生成過程來看內核的連結主要有三步:第一步是把內核的原始碼編譯成.o文件,然後連結,這一步,連結的是arch/i386/kernel/head.S,生成的是vmlinux。
  • linux內核中的IS_ERR
    在看內核源碼的時候,經常會遇到IS_ERR,比如在linux/arch/arm/kernel/sys_arm.c中本文引用地址:http
  • Linux內核概述
    1.1 隨便先說下Linux 內核非常龐大,我說的非常大並不是為了嚇唬大家,確實是非常多的代碼,超過 600 萬行的代碼,所以我寫文章介紹 Linux 內核,也不可能每一行代碼去分析μC/OS-IIμC/OS-II是在μC-OS的基礎上發展起來的,是美國嵌入式系統專家 Jean J.Labrosse 用 C 語言編寫的一個結構小巧、支持搶佔式的多任務實時內核。
  • Linux內核學習:簡單的字符設備驅動
    init.h>#include <linux/module.h>#include <linux/cdev.h>#include <linux/fs.h>#include <linux/uaccess.h>
  • 什麼Linux,Linux內核及Linux作業系統
    我們經常傻傻的分不清楚Linux內核和Linux作業系統。對Redhat、CentOS和Ubuntu等更是稀裡糊塗。今天我們介紹一下關於Linux的相關概念、發展歷史及Linux作業系統的整體架構。什麼是Linux及內核在1991年,有個名為Linus Torvalds的學生在網際網路上發布了一個名為Linux的作業系統。說它是作業系統是因為它實現了對計算機核心硬體的管理。
  • 深入理解Linux內核鍊表
    在Linux內核中使用了大量的鍊表結構來組織數據,包括設備列表以及各種功能模塊中的數據組織。這些鍊表大多採用在[include/linux/list.h]實現的一個相當精彩的鍊表數據結構。本文的後繼部分就將通過示例詳細介紹這一數據結構的組織和使用。
  • linux內核移植-移植2.6.35.4內核到s3c2440
    本來是想移植最新的內核2.6.39但是總是在編譯快完成的時候報錯,有人說是新的內核對arm平臺的支持不好,所以就降低了一下版本,這裡移植2.6.35.4內核一、準備工作1、下載 解壓內核從官網上下載linux-2.6.35的內核, ftp://ftp.kernel.org/pub/linux/kernel/v2.6/ ,文件不大,約85M。
  • linux配置、編譯內核實用工具
    同時include/linux/autoconf.h依照.config的內容生成。split-include根據include/linux/autoconf.h在include/config/下建立相關的目錄和.h文件。
  • 嵌入式linux內核的編譯步驟
    嵌入式linux內核的編譯步驟 華清遠見 發表於 2020-06-19 09:30:24   編譯嵌入式Linux內核都是通過make的不同命令來實現的,它的執行配置文件是
  • Arm linux內核構建關於.config的問題
    首先下載內核的原始碼。然後tar -xvf 解壓。讓你手動去選擇配置選項)然後使用 make ARCH=arm CROSS_COMPILE=arm-linux-就可以開始編譯了。同樣也可以不用make ARCH=arm CROSS_COMPILE=arm-linux-這麼寫。
  • 改善Linux內核實時性方法的研究與實現
    另一方面中斷處理線程也可以因為在內核同步中得不到鎖而掛載到鎖的等待隊列中。很多關中斷就不必真正的禁止硬體中斷了,而是禁止內核進程搶佔,這樣就可以減小中斷延遲。  1.2 設計與實現  Linux提供了kthread_create創建內核線程,該內核線程在內核空間執行,因此在調度時沒有用戶空間和內核空間切換,使得其運行更為高效。