一、背景
內核的版本一直以來一直在持續迭代,離不開眾多開發者的貢獻。有時候我們會根據項目要求基于現有的內核版本開發一些新的功能或者修復掉一些特定場下的問題,我們是可以將其提交給社區的。
一般提交社區有兩個基本原則,一是提交的補丁解決的是一個共性問題,并非一個特定的需求,或者說是具有一定的普適性,因為內核版本是旨在運用于所有linux系統里的版本,提交的補丁也是旨在放在內核公共使用的大版本里。如果一個功能沒有足夠的普適性,那么就沒必要合入進內核社區,自己項目里去維護就可以了。第二個基本原則,是提交的補丁要盡量與現有內核里的模塊要有一定的相似性,如果一下子提交一個特別大的改動,甚至直接去掉了現有的一些機制,甚至把名字都換了個遍,那么這樣的補丁是很難被合入的。
這篇博客會從下載代碼到制作補丁再到提交補丁這一連串步驟進行介紹。假設是你已經有一些文件的改動可能想要提到社區。
二、下載代碼
2.1 根據MAINTAINERS下載對應的倉庫
下載代碼前,需要先根據已經下載下來的一份相對較新的版本里的代碼里的第一級目錄里的MAINTAINERS:
如上圖,假設你改的是network子系統,找到MAINTAINERS里對應的倉庫,下載時就下對應的倉庫即可。
2.2 參考子系統對應的開發指導文檔,比如net的maintainer-netdev.rst
有些子系統有專門的開發指導文檔,比如net的maintainer-netdev.rst:
對于net而言,已發布的版本的問題的修復是下載下面這個版本:
git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
對于新的特性需要下載下面這個版本:
git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
下載代碼時,由于網速不給力,可以通過制定--depth=1,如下命令:
git clone --depth=1 git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
三、準備補丁
3.1 準備提交單個補丁
準備補丁的步驟,程序員基本都知道,要注意git add后敲:
git commit -s
自動加上簽名。
git commit過后,使用git format-patch -1來生成一個patch:
git format-patch -1
上面的-1? ? ?1表示生成最近的一個提交
-2 表示生成最近的兩個提交
上面的命令生成出.patch文件后,要記得修改主題,根據要求加上倉庫名比如下圖里的net-next(具體要不要帶上倉庫名需要自行參考他人的提交的補丁),和當前修改的版本號v11就是修改了11個版本了,0/2是對應于下面 3.2 里講到的補丁系列而言的扉頁補丁。
3.2 準備提交一個補丁系列
所謂提交一個補丁系列就是指一次最終合入,是合入了多筆補丁,這種現象在內核社區提交里,現在看是非常普遍的。
如下命令來制作:
git format --cover-letter -2
上面的命令里-2是git log里的最近兩個補丁,形成一個補丁系列,--cover-letter會生成一個0/n的扉頁補丁,會合并上后面的補丁里的所有的提交,形成一個下圖里的合并后的改動描述:
3.3 有補丁之后,需要用內核版本里自帶的scripts下的checkpatch.pl來檢查補丁格式
./scripts/checkpatch.pl *.patch
四、準備一個郵箱,郵箱需要支持smtp服務
我是使用的163郵箱,我確認163是可以配置的
這是為的是可以通過git send-email來發送。
4.1 配置smtp
自行去尋找對應郵箱的smtp的方法
配置完后,有一個smtp的密碼需要填到下圖里的smtpPass里去:
4.2 git send-email發送前需要確定要發送的人和抄送的人
通過下面的命令來得知要發送的人和抄送的人:
./scripts/get_maintainer.pl *.patch
4.3 git send-email發送補丁
下圖是我history顯示出來的我之前發送補丁時的命令樣子:
五、發送出來后,可以通過下面的鏈接進行查看,看到你剛發的補丁了
鏈接是:
https://lkml.org/
之前我發送的補丁的v0版本時的lkml.org看到的截圖: