0


如何向Linux内核提交开源补丁?

2021年,我曾经在openEuler社区上看到一项改进Linux内核工具的需求,因此参与过Linux内核社区的开源贡献。开源贡献者参与Linux内核贡献的基本方式是提交补丁(patch),流程都可以在内核社区文档中找到,但是,单独学习需要一个较长的过程,新手难以入门,因此,本文整理当年的经验,给出一个简明的方法,供大家参考。如果本文中有和社区文档描述相矛盾的地方,应以社区文档为准。

内存管理子系统的维护者Andrew Morton在一次演讲时,观众提问如何参与内核贡献,能否出一个教程?印象中Andrew Morton的回答是,如果想参加Linux内核项目,应该先动手做起来。

1. 安装git和git send-email

笔者使用基于鲲鹏服务器的openEuler系统,首先使用

yum

安装

git

git-email

。Ubuntu用户也可以使用

apt

工具,斯不赘述。

yum installgit
yum install git-email

其中,

Yixuan Cao

为最终的补丁中,发送者的名字;而

[email protected]

指电子邮箱。

2. 配置git和smtp

配置git的姓名和邮箱信息

打开

~/.gitconfig

文件,在文件末尾添加如下信息(以腾讯企业邮箱为例):

[sendemail]
        smtpencryption = ssl
        smtpserver=smtp.exmail.qq.com
        [email protected]
        smtpserverport=465smtpass=***************

通过配置腾讯企业邮箱的信息,将

git-email

和自己的邮箱账户绑定在一起。其中

smtpuser

是指电子邮箱账号,

smtpass

是私有的客户端密码,有了这个密码就可以无需验证,利用

git

发送电子邮件。

3.下载和修改Linux kernel源码

使用git下载linux-next分支

下载并修改linux-next分支的代码,这样才能保证我们的工作是基于最新的linux代码。实际上,Linux内核供开发者开发和测试的版本为next版本,next版本经过若干迭代后,会在一个被社区称为“merge window”的时期内合入主线(mainline)版本,主线版本经过若干迭代后,会进入稳定版。下图为Linux内核社区主页。Linux内核社区主页

使用

git

下载

linux-next

的命令如下:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

下载完成后,就会有一个linux内核的工程目录。进入之,可以先查看当前的

git

状态。然后,建立新的开发分支并切换到开发分支。

git status
# 创建新分支git branch develop
git checkout develop

接着,我们修改代码。需要注意的是,可以修改的不仅是代码实现,也可以是注释、文档等。修改完成后,在开发分支代执行:

git status
gitadd.git commit -s-v

注意

git commit

命令会自动打开编辑器,用以编辑提交信息。

-s

参数可以自动在提交信息下加上一行

Signed-off-by: Yixuan Cao <[email protected]>

-v

参数会在提交信息下方显示出你做的修改,即

diff

信息,用以再次检查自己的改动,这一个参数不是必须的,但是推荐这么做。提交信息务必规范,不规范的提交信息可能会被直接拒绝,至少会被认为是不礼貌的。最终这个git的提交会被制作成开源补丁,以电子邮件的形式向维护者发送。

对于自动打开的编辑器,我们需要补充信息,其模板如下:

  • 第一部分是 short description,以子系统名打头,比如 mm,注意分号后面加个空格。这一部分最终会作为补丁的标题,要让维护者一眼就看出这个补丁大概干了什么事。请注意,为了方便内核的维护者管理,应该遵循工作的文件中,前人提交时的命名惯例。 如内存管理子系统,常见的标题写法是:mm/cma.c: fail if fixed declaration can't be honored,而在别的场景中,也有这样的写法:arm64: dts: rockchip: fix rk3399 hdmi ports node
  • 第二部分是 the body of your patch,这一部分要详细的解释你为何要做这个修改,以及怎么做的,注意时态用现在时,语态用主动形式。
  • 第三部分是之前的 -s 参数自动加上的,表示邮件和署名,是自动生成的,不用管。

一个简单的示例如下:

mm: fix some error

Why I do these changes and how I do it.

Signed-off-by: Yixuan Cao <[email protected]>

如果

commit

之后还想修改提交信息,使用命令

git commit --amend -v

,编辑器重新弹出。这些都是使用

git

的基本能力,更复杂的功能可以自行学习。需要注意:如果一次需要修改多处功能,应该使用多次提交并生成patchset。

4. 生成补丁

master

分支为基准,检测你在当前 develop 分支所做的修改并生成

.patch

文件。

git format-patch master

命令完成后,你就可以在当前目录下看到你的

.patch

文件了。

5. 检查patch和发送邮件

检查补丁格式,要做到

0 errors, 0 warnings

。补丁的格式有严格的限制,例如,为了维护者的阅读方便,输入的文本内容的每一行都不可太长。但是另一方面,这一行命令只能做简单的格式的检查,不能检查其是否能够通过编译、功能符合要求等。因此在提交之前,应该做好充分的测试。

./scripts/checkpatch.pl 0001-mm-page_owner.c-Modify-the-type-of-argument-order-in.patch

6.发送补丁

要将上补丁发送给社区维护者,需要查看相关的上游维护者的电子邮箱地址。例如要修改mm/page_owner.c,使用命令

./scripts/get_maintainer.pl -f mm/page_owner.c

当时的输出结果是:

Andrew Morton <[email protected]>(maintainer:MEMORY MANAGEMENT)
[email protected] (open list:MEMORY MANAGEMENT)
[email protected] (open list)

根据输出结果,我们知道是Andrew Morton维护mm子系统。用如下命令,可以通过电子邮件发送补丁。需注意,参数

--to

后接收件人,

--cc

后接被抄送者。

git send-email --to [email protected] \
--cc [email protected] \
--cc [email protected] \
*.patch

至此工作已经全部完成。如果补丁并入上游分支的话,会收到通知邮件;如果被打回,也会被告知有不妥之处。


本文转载自: https://blog.csdn.net/weixin_46655675/article/details/138641298
版权归原作者 曹无悔 所有, 如有侵权,请联系我们删除。

“如何向Linux内核提交开源补丁?”的评论:

还没有评论