向内核社区提交补丁
一、背景
内核的版本一直以来一直在持续迭代,离不开众多开发者的贡献。有时候我们会根据项目要求基于现有的内核版本开发一些新的功能或者修复掉一些特定场下的问题,我们是可以将其提交给社区的。
一般提交社区有两个基本原则,一是提交的补丁解决的是一个共性问题,并非一个特定的需求,或者说是具有一定的普适性,因为内核版本是旨在运用于所有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看到的截图: