最近剛好需要進 code 到 Linux kernel。 經過漫長的等待,我的 code 終於進到 Linus 的 tree 了 🥳
發現這個 open source 的開發方式與一般常見的不太一樣,稍微紀錄一下 Linux 的運作方式
Linux 開發概念
Linus Torvalds 會維護一個 Linux source repo。他會定期 release 新的 Linux kernel 版本,並 master 切 branch 出去,交由 stable tree maintainer 維護
如果我們想要進 code 到 Linus 的 repo,要如何進行呢?
直覺上的做法很簡單就是透過寄 email 給 Linus 的方式
- 發出 pull request
- 寄出 patch 請他 commit
這兩個方法實際上也是可行的,但 Linux 的 source code 相當龐大,每天的 submit 數量也很多,全部由 Linus 一個人負擔不太實際
故在 Linux 中每個 subsystem 與 file 都會有各自的 maintainer 及 reviewer 負責, 這些 subsystem 通常會有各自的 Linux repo,最新的變動會先 commit 到 subsystem 的 tree。 這些 subsystem maintainer 會在 Linus 的 merge window open 時,送 pull request 給 Linus。 故我們只要將 code 進到 subsystem 的 tree 中,最終就有機會會進到 Linus tree
如何 Submit Patch
流程大概是這樣
- 寄 patch 給 subsystem maintainer
- Subsystem maintainer 將 patch commit 進 subsystem tree
- Subsystem maintainer 送 pull request 給 Linus
- Linus merge
故一般來講要進 code 最少會需要兩個人的同意
- Subsystem maintainer
- Linus
我們要怎麼知道他們要求什麼呢?
- For Linus 可以參考這份文件
- For subsystem maintainer 的要看他們各自的 Document,例如 nerworking 的文件
因為每個 subsystem 的規範差異很大,這邊就不描述了。如果我們想要 submit 一個 general 的 patch 要怎麼做呢? 最主要需要看這份文件
確切的可以分為五個步驟
- 第一步,將 code commit 起來,並在 commit message 中加入 Signed-off-by NAME 的字串,表示你簽了 Linux 的條文 (Developer Certificate of Origin)
- 第二步,使用
git format-patch master..your_branch
來產生 patch file - 第三步,使用 checkpatch.pl 來幫忙檢查 patch 是否有不符合規範的地方,例如
./scripts/checkpatch.pl 0001-xxxxxx-xxxxx.patch
- 第四步,找到 maintainer 的 email,可以直接看 MAINTAINERS 這份文件,或是使用 get_maintainer.pl 來幫你找該寄給誰
- 例如
./scripts/get_maintainer.pl 0001-xxxxxx-xxxxx.patch
- 這邊至少需要寄給一個 maintainer 與一個 open mail list,不過建議依照 script 的結果全部寄出
- 例如
- 第五步,透過 email 將 patch 寄出,這邊會推薦使用 git send-email 來寄出
git send-email --to xxx@kernel.org --cc xxx@vger.kernel.org 0001-xxxxxx-xxxxx.patch
到這裡,已經成功寄出 patch 了,之後只需要透過 email 與 reviewer/maintainer 來溝通就可以了 (這邊要注意如果使用 gmail 回信,需要把格式改成 plain text)
附錄
附錄一: 如何找到 mail list 的 archive
http://vger.kernel.org/vger-lists.html
附錄二: 如何進 code 到 stable tree
stable tree 由 Greg Kroah-Hartman 維護,相關規定可以參考這份文件
規定中要進到 stable 的 commit 必須先進到 Linus 的 tree,進到 Linus tree 後再根據 subsystem 的規定不同,有些可以直接進信給 stable ,有些需要請 maintainer 幫你送進 stable queue
附錄三: 如果 patch 還要修正怎麼辦
不能將新的 patch 回覆在 email thread 中,需要重新寄出一個 email,只需要在 email title 加入前綴 PATCH v2git format-patch --subject-prefix='PATCH v2' master..your_branch
附錄四: 除了 email 有其他方法追蹤我的 patch 進度嗎?
可以透過 https://patchwork.kernel.org/ 來追蹤 patch 的進度