赞
踩
限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。
后续操作基于 GIT
工具完成,作者假定读者已经安装并配置好了 GIT
。如果没有,可以自行搜索相关资料安装 GIT
。
首先,从Linux内核代码仓库下载主分支
代码到本地:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
主分支代码是相对稳定的代码,一般不够新,本文选择最新尚在开发中的 linux-next
分支来演示内核补丁的提交,所以还要更新代码到最新分支:
git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
这些仓库的地址可以从 https://git.kernel.org/ 查找。接下来将 linux-next
的代码下载到本地:
git fetch --tags linux-next
注意,此时我们只是将 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
所有名字前面有 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
好,新的本地分支 linux-next_master
已经建立好了。
内核对代码的缩进、tab宽度等是有要求的,修改内核代码前,修改 ~/vim/rc
文件,按如下配置 vim
编辑器(假设你用 vim
编辑你的代码):
filetype plugin indent on
syntax on
set title
set tabstop=8
set softtabstop=8
set shiftwidth=8
set noexpandtab
然后将 vim
配置为默认编辑器:
sudo update-alternatives --config editor
最后用 vim
修改代码,修改完成并测试通过后,运行下列指令:
git add /path/to/file
git commit -s -m 'message for patch.'
提交修改到本地分支 linux-next_master
,然后用工具制作可提交的补丁:
git format-patch -s -1 # 将自动按最近一次提交生成一个补丁文件 xxx.patch
./scripts/checkpatch.pl xxx.patch # 检查补丁的格式是否合法
./scripts/get_maintainer.pl xxx.patch # 补丁是以邮件形式发送,这里是找出要发送的邮箱
提交补丁就是将前面制作的 xxx.patch
发送到 get_maintainer.pl
提取的邮箱列表中。既然是发送邮件,那首先得准备一个邮箱,这里就有很多选择了,譬如 gmail ,但国内的用起来很麻烦,这里以 126 邮箱举例。首先配置下126邮箱:
GIT
默认不带 send-email
,运行下面的命令安装它:
sudo apt-get install git-email
编辑 ~/.gitconfig 进行邮件配置:
[user]
name = Your name
email = 你的126邮箱地址
[sendemail]
smtpserver = smtp.126.com
smtpuser = 你的126邮箱地址
smtpserverport = 465
smtpencryption = ssl
smtppass = 2.4.1章节得到的授权码
运行下面的命令发送章节 2.3
制作的补丁 xxx.patch
:
git send-email --smtp-debug \
--to=david@redhat.com \
--cc=linux-kernel@vger.kernel.org \
xxx.patch
命令中的邮件列表根据 get_maintainer.pl
脚本得到的列表进行调整。可以先给自己发送,测试一下。我在实际过程中经常遇到下面的错误提示:
DEBUG: .../IO/Socket/SSL.pm:1177: global error: Undefined SSL object
但不影响邮件发送到社区,如果有哪位读者知道原因,请告知,不胜感激!邮件有没有发送到社区,可以到 https://lore.kernel.org/ 查询。在查询框输入自己在 .gitconfig
中配置的 name
或 email
,如果你的邮件发送成功,就可以找到自己发送的邮件。
提交的补丁,会被审核,如果你运气好,一下就过,那没啥好说的了。但大多数是时候,你需要与社区邮件往来讨论,你为什么要提交该补丁,能带来哪些好处,可能存在哪些弊端等等,这时候你就需要学会怎么回复邮件了。读者可能会困惑,什么?回个邮件,还需要学习,世界上还有人不会这个玩意?直接在 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
好,然后社区对提交的上述补丁进行审核,提出了几个疑问:
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
这时候你怎么回复?直接在 126 邮箱里巴拉巴拉,我暂时没发现这可行。接下来,就是我的土方法
了,按如下操作:
将文件后面--
上述社区回复内容拷贝出来,然后在第一列
全部加上 >
,然后在社区质疑的地方,插入空行,写上自己回复;接下来在文件第一行添加 Subject
:
Subject: Re: [PATCH] 【补丁修改内容概述标题】
然后再插入一个空行,其中 Re:
表示是对邮件的回复。回复内容编辑的最后一步就是在文件的最后加上结束标记内容:
--
Thanks,
XXX
最终回复内容变成如下:
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
将上述内容保存为文件 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
也就是,按如下指令进行回复:
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
其中的 --in-reply-to=
设定为社区回复邮件里面的 Message-ID:
,在邮件页面的 Reply instructions:
已经帮你写好了,你只需复制就可以了。如此,我们就完成了对邮件的首次回复,后续的回复操作都是一样的。这就是我的土方法,如果哪位有更好的方法,请不吝赐教!
上面提到的 Subject, Message-ID
等,均来自于邮件报文规范,感兴趣的读者可参考 https://www.bbsmax.com/A/ZOJP43oPJv/ 。
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。