2010年6月9日 星期三

探討如何與 kernel 的發展同步

http://www.jollen.org/blog/2006/11/reading_kernel_kernel_patch.html

從事 Embedded Linux(GNU/Linux systems on devices)工作的朋友,除了日常的讀書功課外,另外一個重要的工作就是「隨時注意 Linux kernel 的發展狀況」。要能與 Linux kernel 的發展同步,嚴格來說,已經是一件吃重的工作了,不過還是可以列出幾個基本的工作原則如下:

1. 每天閱讀 linux-kernel 郵遞論壇(mailing-list)的「標題」。

2. 隨時上 kernel.org 看看最新釋出的 kernel 版本(或留意 linux-kernel-announce mailing-list)。

3. 閱讀釋出版本的 Changelog。

4. 不要與 git 系統的距離太遠,定時看看 git 系統,保持一定的「短距離」。

Mailing List

linux-kernel 上的 posts 每天的量大約在 200~350 篇左右,數量並不算少,要把每一篇都看過是不太可能的,因此以我自己的閱讀心態來說,我會建議以下的閱讀方式:

1. 看標題,如果是自己有興趣或正在留意的更新,我就會標記下來持續追蹤。

2. 如果有 Bugfix 的 patch 出現,我會看看這項修正的起因與原理,但為了不讓自己花費太多時間,如果我對這項 patch 的修正「原理」不甚熟悉,我便會跳過此 post。

以下是閱讀 linux-kernel list 必須知道的幾件事:

1. 如果有新的修正,第一時間都會發佈在此 list 上,並且標題的起頭一定是 "[PATCH n/m] subject" 這樣的格式。PATCH 表示這是一個 patch 的發佈,由於一個 patch 會以多篇 post 發佈,因此就用「n/m」來表示「這是第幾篇 patch,總共有幾篇。」,例如:

[PATCH 0/7] KVM: Kernel-based Virtual Machine
[PATCH 1/7] KVM: userspace interface
[PATCH 2/7] KVM: Intel virtual mode extensions definitions
[PATCH 3/7] KVM: kvm data structures
[PATCH 5/7] KVM: mmu virtualization
[PATCH 6/7] KVM: x86 emulator
[PATCH 7/7] KVM: plumbing

2. 不能在這裡詢問與 kernel 發展無關的問題,例如:工具的使用、系統設定、詢問是否有XXX驅動程式、請求協助測試等等,這些都是不能張貼的文章。另外,原本就該留意的非成文禮節一定要注意,像是 FAQ 能找到的東西,就不要去麻煩人家。

3. list 裡大部份都是 device driver 的討論,並且很多都是架構面或觀念面的討論與修正建議,所以當您參與討論時,千萬不要用「個人的主觀看法,或是沒有事實與理論根據」的角度發表意見;由於「觀念」的修正是 kernel 2.6 驅動程式的大討論方向,所以必須先把主題相關的東西先看懂看熟後再參與討論。

kernel.org

我會不定時來看看最新發佈的 kernel 版本,因此我們必須知道目前仍在維護的 kernel 版本與其分支狀況,大致說明如下:

1. 2.6 與 2.4 都是目前仍持續積極維護中的版本。以本文寫作的時間為例(2006/11/20),目前最新的版本分別是 2.6.18.3(2006/11/19 釋出)與 2.4.33.4(2006/11/19 釋出)。

2. 2.4 的釋出版本有「stable」與「prepatch」二個分支。

3. 2.6 的釋出版本有「stable」、「prepatch」、「snapshot」與「-mm patch」四個分支。

其中 '-mm' 系列的 2.6 kernel 是由 Andrew Morton 所釋出的 Linux 分支,主要性質以「實驗」與「新功能」為主 ,所以常常可以在這個分支的 kernel 裡找到不久前才剛發佈在 mailing-list 上的 patch。如果您不太知道怎麼處理 mailing-list 上的 patch 發佈,也可以等 -mm patch 的發佈。

另外,prepatch 就是所謂的 '-rc' 發佈,所以檔名會接 '-rc?' 字串,例如:linux-2.6.19-rc6。

Changlog

每個在 kernel.org 上所釋出的 kernel 都會有一份變更紀錄(change logs)的檔案,可以了解這個版本與分支的釋出做了什麼變更。

上到 kernel.org 後,每個釋出版本的後面,會有 4 個選項(視版本不同):

  • F = full source
  • V = view patch
  • VI = view incremental
  • C = current changesets

把「C」給按下去就會進到所謂的「git 系統」。

git 系統

git 是 kernel 用來維護發展中版本的系統,也就是所謂的「snapshot 」版本,snapshot 版本都是當天新鮮送達的 kernel,釋出時會在後面加上「-git?」字串。

我會不定時點「C」到 kernel 的 git 去看看 kernel 的最新(最近)動態,說不定有我正要找的 patch。git 系統裡也能看到 kernel 的 "commit" 訊息,包含 commit 的作者、時間與差異比較(diff),而且都可以很方便地瀏覽。

結語

隨時與 kernel 的發展同步,有幾個動機:

1. 學習,kernel developers 會討論與多觀念面的議題,很好的學習機會。

2. 新的 kernel 加入了哪些新驅動程式、修正掉哪些臭蟲與增強了哪些驅動程式的功能?

3. 留意我所使用的平臺(architecture)是否有重要的修正(eg. for i386, for ARM...etc)。

4. 如果新 kernel 有加入重要的 feature 或 Bugfix,我會把自己玩耍的 code patch 到新 kernel。

測試這些有趣的新版本,建議使用 QEMU 或是 User-Mode Linux 來進行。