当前位置:   article > 正文

Linux: 向内核社区提交补丁_linux-next

linux-next

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 提交内核补丁的步骤

后续操作基于 GIT 工具完成,作者假定读者已经安装并配置好了 GIT 。如果没有,可以自行搜索相关资料安装 GIT

2.1 从代码仓库下载内核源码

首先,从Linux内核代码仓库下载主分支代码到本地:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
  • 1

主分支代码是相对稳定的代码,一般不够新,本文选择最新尚在开发中的 linux-next 分支来演示内核补丁的提交,所以还要更新代码到最新分支:

git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
  • 1

这些仓库的地址可以从 https://git.kernel.org/ 查找。接下来将 linux-next 的代码下载到本地:

git fetch --tags linux-next
  • 1

2.2 建立本地分支 linux-next_master

注意,此时我们只是将 linux-next 分支的代码同步到了本地,但是本地还没有对应的可操作分支,为此,我们还要建立一个本地分支。先看一下当前分支情况:

$ git branch -a
* master
  remotes/linux-next/akpm
  remotes/linux-next/akpm-base
  remotes/linux-next/master
  remotes/linux-next/pending-fixes
  remotes/linux-next/stable
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

所有名字前面有 remotes 是都是远程分支引用,我们看到已经有一个 master 本地分支,这是在 git clone 时自动创建的。但这个本地分支不是我们要的,我们要建立一个关联到 linux-next 的本地分支:

$ git checkout -b linux-next_master # 建立新的本地分支 linux-next_master
$ git branch -u linux-next/master # 关联 本地分支 linux-next_master 到远程分支 linux-next/master

$ git branch -vv
* linux-next_master 709c6adf19dc [linux-next/master] Add linux-next specific files for 20230307
  master            413c1061e467 [origin/master: ahead 2, behind 125519] Merge remote-tracking branch 'origin/master'

$ git branch -a
* linux-next_master
  master
  remotes/linux-next/akpm
  remotes/linux-next/akpm-base
  remotes/linux-next/master
  remotes/linux-next/pending-fixes
  remotes/linux-next/stable
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

好,新的本地分支 linux-next_master 已经建立好了。

2.3 制作一个补丁

2.3.1 编辑器 VIM 配置

内核对代码的缩进、tab宽度等是有要求的,修改内核代码前,修改 ~/vim/rc 文件,按如下配置 vim 编辑器(假设你用 vim 编辑你的代码):

filetype plugin indent on
syntax on
set title
set tabstop=8
set softtabstop=8
set shiftwidth=8
set noexpandtab
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

然后将 vim 配置为默认编辑器:

sudo update-alternatives --config editor
  • 1

最后用 vim 修改代码,修改完成并测试通过后,运行下列指令:

git add /path/to/file
git commit -s -m 'message for patch.'
  • 1
  • 2

提交修改到本地分支 linux-next_master ,然后用工具制作可提交的补丁:

git format-patch -s -1 # 将自动按最近一次提交生成一个补丁文件 xxx.patch
./scripts/checkpatch.pl xxx.patch # 检查补丁的格式是否合法
./scripts/get_maintainer.pl xxx.patch # 补丁是以邮件形式发送,这里是找出要发送的邮箱
  • 1
  • 2
  • 3

2.4 提交补丁

2.4.1 配置发送邮箱

提交补丁就是将前面制作的 xxx.patch 发送到 get_maintainer.pl 提取的邮箱列表中。既然是发送邮件,那首先得准备一个邮箱,这里就有很多选择了,譬如 gmail ,但国内的用起来很麻烦,这里以 126 邮箱举例。首先配置下126邮箱:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4.2 配置 git-email

GIT 默认不带 send-email ,运行下面的命令安装它:

 sudo apt-get install git-email
  • 1

编辑 ~/.gitconfig 进行邮件配置:

[user]
	name = Your name
	email = 你的126邮箱地址

[sendemail]
	smtpserver = smtp.126.com
	smtpuser = 你的126邮箱地址
	smtpserverport = 465
	smtpencryption = ssl
	smtppass = 2.4.1章节得到的授权码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.4.3 发送补丁

运行下面的命令发送章节 2.3 制作的补丁 xxx.patch

git send-email --smtp-debug \
    --to=david@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
	xxx.patch
  • 1
  • 2
  • 3
  • 4

命令中的邮件列表根据 get_maintainer.pl 脚本得到的列表进行调整。可以先给自己发送,测试一下。我在实际过程中经常遇到下面的错误提示:

DEBUG: .../IO/Socket/SSL.pm:1177: global error: Undefined SSL object
  • 1

但不影响邮件发送到社区,如果有哪位读者知道原因,请告知,不胜感激!邮件有没有发送到社区,可以到 https://lore.kernel.org/ 查询。在查询框输入自己在 .gitconfig 中配置的 nameemail,如果你的邮件发送成功,就可以找到自己发送的邮件。

2.4.4 回复邮件

提交的补丁,会被审核,如果你运气好,一下就过,那没啥好说的了。但大多数是时候,你需要与社区邮件往来讨论,你为什么要提交该补丁,能带来哪些好处,可能存在哪些弊端等等,这时候你就需要学会怎么回复邮件了。读者可能会困惑,什么?回个邮件,还需要学习,世界上还有人不会这个玩意?直接在 126 邮箱里回复不就行了?我不清楚 126 邮箱是否符合Linux内核社区邮件回复的所有要求,但根据内核指导如何提交补丁的文档 https://www.kernel.org/doc/html/latest/process/submitting-patches.html 里的描述,我估计够玄。这里还有一份中文翻译版:https://www.kernel.org/doc/html/next/translations/zh_CN/process/submitting-patches.html 。虽然有指导文档,但有些东西看起来,还是一头雾水,到具体操作,还是不知道怎么弄。这里介绍一下作者自己摸索出来的土方法,如果哪位读者有更好的方法,也请不吝赐教。
在内核邮件列表 https://lore.kernel.org/ 看你发送邮件的是个什么样子:

From: XXX <XXX@126.com>
To: akpm@linux-foundation.org
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	XXX <XXX@126.com>
Subject: [PATCH] 【补丁修改内容概述标题】
Date: Tue,  7 Mar 2023 17:03:58 +0800	[thread overview]
Message-ID: <20230307090358.21346-1-XXX@126.com> (raw)

【补丁修改简要描述】

Signed-off-by: XXX <XXX@126.com>
---
 【补丁具体内容:git diff输出内容】
-- 
2.25.1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

好,然后社区对提交的上述补丁进行审核,提出了几个疑问:

On 07.03.23 10:03, XXX wrote:
> 你提交的补丁描述,
> 内核社区对此有疑问的部分。

你为啥这么干?有必要吗?

> Signed-off-by: XXX <XXX@126.com>
> ---
>   mm/util.c | 3 +++
>   1 file changed, 3 insertions(+)
> 
> 【补丁内容】

【社区审核邮件回复的其他内容,巴拉巴拉】

-- 
Thanks,

David / dhildenb
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这时候你怎么回复?直接在 126 邮箱里巴拉巴拉,我暂时没发现这可行。接下来,就是我的土方法了,按如下操作:
将文件后面--上述社区回复内容拷贝出来,然后在第一列全部加上 > ,然后在社区质疑的地方,插入空行,写上自己回复;接下来在文件第一行添加 Subject

Subject: Re: [PATCH] 【补丁修改内容概述标题】
  • 1

然后再插入一个空行,其中 Re: 表示是对邮件的回复。回复内容编辑的最后一步就是在文件的最后加上结束标记内容:

--
Thanks, 

XXX
  • 1
  • 2
  • 3
  • 4

最终回复内容变成如下:

Subject: Re: [PATCH] 【补丁修改内容概述标题】

> On 07.03.23 10:03, XXX wrote:
> > 你提交的补丁描述,
> > 内核社区对此有疑问的部分。
> 
> 你为啥这么干?有必要吗?
> 
我因为XXX,所以这么干。
> > Signed-off-by: XXX <XXX@126.com>
> > ---
> >   mm/util.c | 3 +++
> >   1 file changed, 3 insertions(+)
> > 
> > 【补丁内容】
>
> 【社区审核邮件回复的其他内容,巴拉巴拉】
--
Thanks, 

XXX
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

将上述内容保存为文件 XXX-reply.txt (不一定得是这个名字,这里主要是为了演示)。然后按社区邮件列表中,找到社区回复你的那封邮件的页面,按最后的内容指示来进行回复:

Reply instructions:

...
* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4c223e9c-2d43-fb8f-7ac9-ad2121914170@redhat.com \
    --to=david@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=XXX@126.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    /path/to/YOUR_REPLY
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

也就是,按如下指令进行回复:

git send-email \
    --in-reply-to=4c223e9c-2d43-fb8f-7ac9-ad2121914170@redhat.com \
    --to=david@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=XXX@126.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    XXX-reply.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其中的 --in-reply-to= 设定为社区回复邮件里面的 Message-ID: ,在邮件页面的 Reply instructions: 已经帮你写好了,你只需复制就可以了。如此,我们就完成了对邮件的首次回复,后续的回复操作都是一样的。这就是我的土方法,如果哪位有更好的方法,请不吝赐教!

3. 邮件规范

上面提到的 Subject, Message-ID 等,均来自于邮件报文规范,感兴趣的读者可参考 https://www.bbsmax.com/A/ZOJP43oPJv/

4. 参考资料

https://www.kernel.org/doc/html/latest/process/submitting-patches.html
https://www.kernel.org/doc/html/next/translations/zh_CN/process/submitting-patches.html
https://kernelnewbies.org/FirstKernelPatch

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/804668
推荐阅读
相关标签
  

闽ICP备14008679号