前言
Linux基金會在4月3日公布了Linux開發年報,向我們展示了linux kernel作為世上最大開源合作項目之一的魅力。自2005年以來,共有800家公司7800名開發人員參與Linux kernel開發,最近一年也有200家公司共1000名開發人員參與。目前在Linus Torvalds的監督之下,Linux核心約2到3個月發布一個新的穩定版本,每次更新大約包含8000到12000項修改,平均每小時有提交6.88次修改。內核所有文件代碼已超過1500萬行,大約以每年10%的代碼量在增長。
規模組織如此巨大,開發又活躍,且對質量有非常高要求的項目,不禁好奇它是如何做好質量保證的,于是查閱了網上較多資料,探索Linux kernel的質量保證之道。
名詞解釋
Linux Kernel和GNU/Linux。Linux kernel作為系統的最底層,是負責管理硬件、執行任務調度、維護整體安全和完整性的系統軟件。一個內核不是一套完整的操作系統,人們將 Linux 內核和 GNU 系統組成完整的自由系統:基于 Linux 的 GNU 系統(或簡稱為 GNU/Linux 系統)。咱們平時所說的Linux系統多是指GNU/Linux。
Patch。升級內核時,不必要每次都下載或提交整個的源碼文件,而是使用patch,或者叫做補丁或升級包。很多不同版本的內核源代碼是以一組補丁(補丁集)甚至是若干獨立補丁的形式存在的。這些補丁應該應用在特定版本的內核樹上。
內核樹。樹的意思是“包含內核源代碼的目錄的內容”。另外一層意思是“內核源碼的開發分支”。不同的分支命名也不一樣,比較流行的分支(樹)有-next樹(前身是Andrew Morton維護的-mm樹),-rt 樹(實時樹,包含把linux轉換為實時系統的補丁)。
-next 樹,由Stephen Rothwell維護,是一些其他樹以及各種獨立的實驗性補丁,它集合了主線和多種內核子系統(子系統樹)維護人所使用的樹,子系統樹中含有被認為是實驗性的和還沒準備好合并到主線中的各種補丁。換句話說,-next樹的每個版本都是帶有額外修改和一些bug的主線的未來快照。Bug盡可能在這些補丁合并到主線之前得到修正。
開發流程
要了解測試,先得看看整個項目的開發過程。
Linux kernel開發流程是基于一個松散的、定時發布的滾動模型,每2-3個月發布一個新穩定版本。2-3個月被認為是一個合適的時間周期,能加快開發速度的同時,也減少發行商需要處理的外部修改,更短則導致測試時間太少,新內核測試不充分;更長則導致發布版本之間會堆積太多工作。此模型從2005年正式確認,盡早將新功能融入內核主線,將發布給用戶的延期降至最低。
在準備提交Linux kernel代碼前,開發者將升級拆分為一個個小的互相獨立的單元,叫做補丁(patch)。每個補丁通常只做一件事情,并且應當保證系統在打上此補丁之后是依然能正常編譯和工作的。這導致每個補丁都可以做代碼質量和正確性評審,同時也導致每個版本提交的補丁數較大。
提交的補丁并不是直接進入到內核主線,參考圖一的代碼流動過程,只有一個人能將補丁放入到內核主線:Linus Torvalds。但是隨著越來越多的補丁加入到內核,大約只有2%的補丁是Linux直接選入的。內核代碼從邏輯上是拆分成一系列的子系統集合。每個子系統負責內核的一部分(比如網絡、SCSI驅動、特定架構支持、內存管理、視頻設備等),并且擁有指定的維護者,維護者對該子系統的代碼總體負責。當前有過超過100個子系統。補丁先是進入到一個子系統樹,子系統維護者接受修改時,補丁就會附加“由誰簽收通過” 的一行簽字。該信息表明此補丁可以合入到內核。
圖一 代碼流動過程
Linux-next樹本意是在Linus合并代碼前將各子系統的代碼整合到一起,并進行測試,挑選出可能存在的沖突和跨子系統問題。
實際例子
一個新版本2.6.20的發布過程如下圖二。在每一個版本開始時,Linus會打開合并窗口(merge window),從那時起,被認為是可靠穩定的代碼會被合并到內核主線,新的功能或驅動等得以加入進來,合并窗口會開啟兩周,然后Linus會宣布窗口關閉,并發布第一個rc版本,如下圖2.6.20-rc1。此-rc1版本的發布意味著新功能的加入已經完成,以后再加入的補丁只能是修復問題,以確保此版本的穩定,但也有即少數包含新功能的補丁會被認為是不友好的。問題修復的代碼不斷進入主線,Linus接下來大約每周發布一個新的rc版本,通常會在6-9個rc版本后認為此版本已經穩定并且最終發布2.6.20版本,再進入下一個三位版本的迭代。發布之后,此2.6.x版本就移交給穩定組(stable team),穩定組時而會再發布2.6.x.y版本,每個四位版本的發布會有兩個條件:(1)修復重大的bug;(2)該補丁也已被融入到下個三位版本開發的主線中了。穩定組通常維護一個穩定版本6個月左右,之后就由使用該版內核的發行版發行商負責。
圖二 一個版本的發布過程
測試
對Linux kernel測試面臨的挑戰巨大:如前面的數據所顯示,(1)其快速活躍的開發;(2)經常性的版本發布,每次發布都包含大量修改,以及內核本身支持配置的靈活性、可擴展性,待測點太多(3)需要覆蓋各種平臺,Linux已支持二十多種平臺體系,是支持平臺最廣的系統;(4)過時的case需要維護以及大量遺留代碼。
與松散的開發流程相對應,沒有看到正式的測試流程,開源軟件很大一部分的測試執行是依靠用戶實際運行使用。如下圖三所示。
圖三 開源測試的大體流程
測試項目簡介
Linux kernel與測試相關較出名的開源項目有:
LTP:Linux Test Project http://ltp.sourceforge.net/。
Autotest:http://autotest.github.com/
CrackerJack Project:http://ossipedia.ipa.go.jp/crackerjack/index.html。
原文轉自:http://qa.baidu.com/blog/?p=1026