给linux内核提交代码

关于如何给linux内核提交代码这个问题其实有官方的非常详细的文档,网上也有很多文章。但是这些文档要么就是太长读不下去要么就是缺乏关键步骤。因为给linux内核提交代码不是在github上pull一个request就完事了,你想想代码那么多,大家天天去pull request人家Linus Torvalds也看不过来。linux内核每个模块的代码是有不同的人负责的,我们想要提交代码需要把patch通过邮件发给对应的维护者。我第一次看如何给linux内核提交代码的官方文档的时候看了下文章长度几乎都想放弃提交了。今天刚好看到一个觉得可以提交的点,所以做一下记录,希望我写的步骤尽量简洁。

首先安装几个必要的软件:sudo apt-get install esmtp mutt vim git

vim和git就不用说了,esmtp是mstp的拓展,mutt是linux下收发邮件的程序。

在home目录下创建下面几个配置文件。

.muttrc

1
2
3
4
5
set sendmail="/usr/bin/esmtp"
set envelope_from=yes
set from="Your Name <[email protected]>"
set use_from=yes
set edit_headers=yes

.esmtprc

设置文件权限:

1
2
chmod g-rwx ~/.esmtprc
chmod o-rwx ~/.esmtprc

文件内容如下:

1
2
3
4
5
identity "[email protected]"
hostname smtp.gmail.com:587
username "[email protected]"
password "ThisIsNotARealPassWord"
starttls required

.gitconfig

文件内容如下:

1
2
3
[user]
name = Your Name
email = [email protected]

如果你用的是gmail,在“设置”->“转发和 POP/IMAP”中勾选“启用 IMAP”并保存更改。

需要注意的是这些配置文件中应该用相同的邮箱和姓名,姓名最好填自己的真实姓名,不要填一个奇奇怪怪的。然后我们把内核代码clone下来。

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

备份原来的文件,修改,生成patch。

1
2
3
4
5
6
7
8
SRCTREE= linux
MYFILE= drivers/net/mydriver.c

cd $SRCTREE
cp $MYFILE $MYFILE.orig
vi $MYFILE # make your change
cd ..
diff -up $SRCTREE/$MYFILE{.orig,} > /tmp/patch

git status命令查看改变了哪些文件。

git diff命令查看具体修改的内容。

git add命令将要提交的文件的信息添加到索引库中。如果再运行git diff命令就看不到之前修改的文件了。运行git status命令可以看到提示信息由Changes not staged for commit变成了Changes to be committed,文件名也由红色变成了绿色。

如果此时想放弃这次修改,可以使用git reset <file>移除已经添加到索引库中的改变。使用git commit -s -v命令提交我们的修改,此时会添加Signed-off-by:这一行。然后我们需要写清楚为什么要这么改。第一行写上”更改的子模块”+”: “+”简要描述修改的内容”。然后接下来再详细描述。

使用git show HEAD命令查看我们的commit。使用git format-patch -o /tmp/ HEAD^生成patch。

检查下有无格式错误。

看看应该发邮件给谁。

前两个maintainer是收件人,需要抄送给open list。我们最好先给自己发一封邮件再次确认一切无误。

好了,现在可以发邮件了。之后就是等待给我们回复,可能会接受我们的commit,可能会拒绝我们的commit,可能会要求我们再修改,这都很正常。接受我们的commit之后还需要等一段时间才会被加入内核代码。到时候你会还收到邮件。比如我的commit是6月19日被接受的,7月2日被加到4.14/4.19/5.1-stable tree中。

如果你用的不是gmail或者不想用mutt一些步骤可能会不太一样。建议参考下面两份官方文档。

1.FirstKernelPatch

2.Submitting patches: the essential guide to getting your code into the kernel