1. 介紹¶
1.1. 執行摘要¶
本節的其餘部分涵蓋了核心開發過程的範圍以及開發者及其僱主可能遇到的各種挫折。核心程式碼應合併到官方(“主線”)核心中有許多重要原因,包括自動提供給使用者、多種形式的社群支援以及影響核心開發方向的能力。貢獻給 Linux 核心的程式碼必須在 GPL 相容的許可下提供。
開發流程如何運作介紹了開發流程、核心釋出週期以及合併視窗的機制。涵蓋了補丁開發、審查和合並週期的各個階段。還討論了一些工具和郵件列表。鼓勵希望開始核心開發的開發者追蹤並修復錯誤作為初步練習。
早期規劃涵蓋了專案早期規劃,重點是儘快讓開發社群參與進來。
編寫正確的程式碼是關於編碼過程的;討論了其他開發者遇到的一些陷阱。涵蓋了補丁的一些要求,並介紹了一些有助於確保核心補丁正確的工具。
釋出補丁討論了釋出補丁以供審查的過程。要被開發社群認真對待,補丁必須格式正確、描述清晰,並且必須傳送到正確的位置。遵循本節中的建議應有助於確保您的工作獲得最佳的反響。
後續跟進涵蓋了釋出補丁後會發生什麼;此時工作遠未完成。與審閱者合作是開發過程中至關重要的一部分;本節提供了許多關於如何避免在此重要階段出現問題的提示。開發者應注意,不要以為補丁合併到主線後工作就完成了。
高階主題介紹了幾個“高階”主題:使用 git 管理補丁和審查他人釋出的補丁。
更多資訊以指向有關核心開發的更多資訊來源的連結結束了本文件。
1.2. 本文件內容¶
Linux 核心擁有超過 800 萬行程式碼,每次釋出都有超過 1000 名貢獻者,是現存最大、最活躍的自由軟體專案之一。自 1991 年誕生以來,該核心已發展成為一個卓越的作業系統元件,執行在袖珍數字音樂播放器、臺式電腦、現存最大的超級計算機以及介於兩者之間的所有型別系統上。它是一種適用於幾乎任何情況的健壯、高效且可伸縮的解決方案。
隨著 Linux 的增長,希望參與其開發的開發者(和公司)數量也隨之增加。硬體供應商希望確保 Linux 良好地支援其產品,從而使這些產品對 Linux 使用者具有吸引力。嵌入式系統供應商將 Linux 用作整合產品中的元件,他們希望 Linux 儘可能強大且適合手頭的任務。分銷商和其他基於 Linux 開發產品的軟體供應商對 Linux 核心的功能、效能和可靠性有著明確的興趣。終端使用者也常常希望更改 Linux 以使其更好地滿足自身需求。
Linux 最引人注目的特性之一是它對這些開發者是開放的;任何具備所需技能的人都可以改進 Linux 並影響其開發方向。專有產品無法提供這種開放性,而這正是自由軟體流程的特點。但即便如此,核心也比大多數其他自由軟體專案更加開放。一個典型的三個月核心開發週期可能涉及為 100 多家不同公司(或不為任何公司)工作的 1000 多名開發者。
與核心開發社群合作並非特別困難。然而,儘管如此,許多潛在貢獻者在嘗試進行核心工作時仍遇到了困難。核心社群已經發展出自己獨特的運作方式,使其能夠在每天都有數千行程式碼發生變化的環境中順利執行(並生產出高質量的產品)。因此,Linux 核心開發過程與專有開發方法大相徑庭也就不足為奇了。
核心的開發過程對新開發者來說可能顯得陌生和令人生畏,但其背後有充分的理由和紮實的經驗。不瞭解核心社群運作方式(或者更糟的是,試圖蔑視或規避它們)的開發者將會經歷沮喪。開發社群雖然樂於幫助那些正在學習的人,但對那些不願聽取或不關心開發過程的人則幾乎沒有耐心。
希望閱讀本文件的人能夠避免這種令人沮喪的經歷。這裡有很多資料,但閱讀它所付出的努力很快就會得到回報。開發社群總是需要開發者來幫助改進核心;以下文字應能幫助您——或為您工作的人——加入我們的社群。
1.3. 致謝¶
本文件由 Jonathan Corbet (corbet@lwn.net) 撰寫。透過 Johannes Berg、James Berry、Alex Chiang、Roland Dreier、Randy Dunlap、Jake Edge、Jiri Kosina、Matt Mackall、Arthur Marsh、Amanda McPherson、Andrew Morton、Andrew Price、Tsugikazu Shibata 和 Jochen Voß 的評論得到了改進。
這項工作得到了 Linux 基金會的支援;特別感謝 Amanda McPherson,她看到了這項工作的價值並促成了這一切。
1.4. 將程式碼合入主線的重要性¶
一些公司和開發者有時會疑惑,為什麼他們要費心學習如何與核心社群合作並將程式碼合入主線核心(“主線”指的是 Linus Torvalds 維護並被 Linux 發行版用作基礎的核心)。短期來看,貢獻程式碼可能看似一項可避免的開支;似乎直接將程式碼分開並直接支援使用者會更容易。事實是,將程式碼分開(“脫離主線”)是一種虛假的節約。
為了說明脫離主線的程式碼所帶來的成本,這裡列舉了核心開發過程中的幾個相關方面;其中大部分將在本文件後面更詳細地討論。請考慮:
已合併到主線核心中的程式碼可供所有 Linux 使用者使用。它將自動存在於所有啟用它的發行版中。無需驅動程式磁碟、下載或支援多個發行版多個版本的麻煩;這對開發者和使用者來說都一切正常。合併到主線解決了大量的分發和支援問題。
儘管核心開發者努力維護使用者空間的穩定介面,但內部核心 API 卻在不斷變化。缺乏穩定的內部介面是一個故意的設計決策;它允許隨時進行根本性改進併產生更高質量的程式碼。但這項政策的一個結果是,任何脫離主線的程式碼如果想與新核心一起工作,都需要持續的維護。維護脫離主線的程式碼需要大量工作才能使其持續執行。
相反,主線中的程式碼則不需要這項工作,因為有一個簡單的規則要求任何進行 API 更改的開發者也必須修復因該更改而中斷的任何程式碼。因此,已合併到主線中的程式碼維護成本顯著降低。
除此之外,核心中的程式碼常常會得到其他開發者的改進。授權您的使用者社群和客戶改進您的產品可能會帶來意想不到的結果。
核心程式碼在合併到主線之前和之後都會經過審查。無論原始開發者的技能多麼強大,這個審查過程總是能找到改進程式碼的方法。審查常常能發現嚴重的錯誤和安全問題。對於在封閉環境中開發的程式碼尤其如此;這類程式碼將從外部開發者的審查中受益匪多。脫離主線的程式碼是質量較低的程式碼。
參與開發過程是您影響核心開發方向的方式。旁觀者的抱怨會被聽到,但活躍的開發者擁有更強的話語權——以及實施更改以使核心更好地滿足其需求的能力。
當代碼獨立維護時,第三方貢獻相似功能的另一種實現的可能始終存在。如果發生這種情況,您的程式碼將很難甚至不可能被合併。屆時,您將面臨令人不快的選擇:(1) 無限期地在主線之外維護一個非標準功能,或者 (2) 放棄您的程式碼並將您的使用者遷移到樹內版本。
程式碼貢獻是使整個過程得以運作的基本行動。透過貢獻您的程式碼,您可以向核心新增新功能,並提供對其他核心開發者有用的功能和示例。如果您已經為 Linux 開發了程式碼(或正在考慮這樣做),您顯然對該平臺的持續成功抱有興趣;貢獻程式碼是幫助確保這種成功的最佳方式之一。
上述所有論點適用於任何脫離主線的核心程式碼,包括以專有、純二進位制形式分發的程式碼。然而,在考慮任何形式的純二進位制核心程式碼分發之前,還應考慮其他因素。這些因素包括:
圍繞專有核心模組分發的法律問題充其量是模糊不清的;相當多的核心版權所有者認為,大多數純二進位制模組是核心的派生產品,因此,它們的釋出違反了 GNU 通用公共許可證(下文將詳細說明)。本文作者並非律師,本文中的任何內容均不能被視為法律建議。閉源模組的真實法律地位只能由法院裁定。但無論如何,困擾這些模組的不確定性始終存在。
二進位制模組極大地增加了除錯核心問題的難度,以至於大多數核心開發者甚至不會嘗試。因此,分發純二進位制模組將使您的使用者更難獲得社群支援。
對於純二進位制模組的分銷商來說,支援也更加困難,他們必須為他們希望支援的每個發行版和每個核心版本提供一個模組版本。單個模組可能需要數十次構建才能提供相當全面的覆蓋,並且您的使用者每次升級核心時都必須單獨升級您的模組。
上面關於程式碼審查的一切內容對閉原始碼尤其適用。由於此程式碼根本不可用,因此它無法經過社群審查,並且無疑會存在嚴重問題。
特別是嵌入式系統的製造商,可能傾向於忽視本節中所述的許多內容,認為他們正在釋出一個使用固定核心版本且釋出後無需更多開發的獨立產品。這種論點忽略了廣泛程式碼審查的價值以及允許使用者為您的產品新增功能的價值。但這些產品也有有限的商業壽命,之後必須釋出新版本。屆時,那些程式碼已在主線中並得到良好維護的供應商將更有利於快速將新產品推向市場。
1.5. 許可¶
程式碼以多種許可協議貢獻給 Linux 核心,但所有程式碼都必須與 GNU 通用公共許可證(GPLv2)第 2 版相容,該許可證涵蓋了整個核心分發。實際上,這意味著所有程式碼貢獻都受 GPLv2(可選地,包含允許在 GPL 後續版本下分發的語言)或三條款 BSD 許可的保護。任何不受相容許可保護的貢獻將不被核心接受。
貢獻給核心的程式碼不需要(也不要求)進行版權轉讓。所有合併到主線核心中的程式碼都保留其原始所有權;因此,核心現在擁有數千個所有者。
這種所有權結構的一個含義是,任何試圖更改核心許可的嘗試幾乎註定會失敗。在實際場景中,很少有能獲得所有版權所有者同意(或從核心中移除其程式碼)的情況。因此,特別是,在可預見的未來,沒有遷移到 GPL 第 3 版的可能性。
所有貢獻給核心的程式碼都必須是合法的自由軟體。因此,不接受來自身份不明或匿名貢獻者的程式碼。所有貢獻者都必須對其程式碼“簽字確認”,宣告該程式碼可以在 GPL 下隨核心分發。未經其所有者許可為自由軟體的程式碼,或可能為核心帶來版權相關問題(例如源自缺乏適當保護的反向工程工作的程式碼)的程式碼,不能貢獻。
關於版權相關問題在 Linux 開發郵件列表中很常見。此類問題通常會得到大量的答案,但應牢記,回答這些問題的人不是律師,無法提供法律建議。如果您有與 Linux 原始碼相關的法律問題,沒有比與瞭解該領域的律師交談更好的替代方案。依賴從技術郵件列表獲得的答案是冒險的事情。