给 linux kernel 提交 patch 的步骤

这里记录一下给 kernel 提交 patch 的过程,比较零碎。

1. 生成 patch

首先需要把修改提交到本地。

1.1 单个 patch

commit 内容一般包含三个部分:第一行的格式一般是 module: summary,说明对哪个模块做了什么修改;接下来是说明为什么修改;最后是签名,通常是通过 git commit -s 来添加。

然后是生成要发送的 patch:

$ git format-patch --subject-prefix='PATCH' -1

--subject-prefix 是为邮件添加的前缀,通常有下面几个:

  • PATCH:常规的且正式的 patch;
  • RFC:不是要正式提上去的,希望一起讨论这个 patch,用来说明方向,看看意见;
  • RESEND:重新发送之前的 patch。

最后的 -1 表示只生成当前提交相对于上一个提交的内容,如果是在其它分支开发的话,还可以用 -i <branch> 指定要 diff 的分支。

如果是经过修改后的 patch,可以加上 -v 选项,例如 -v3,表示是这个 patch 的第三个修改版本,显示的标题前缀就变成了 [PATCH v3]

1.2 多个 patch

git format-patch --cover-letter --subject-prefix='PATCH' -N #这里的N是你要提取的补丁个数

--cover-letter 表示先生成一个汇总的邮件,说明这一系列的 patch 是干什么的。

然后用内核自带的工具检查一下是否符合要求:

 ./scripts/checkpatch.pl <yourpatch>

没啥问题的话就可以发出去了。

2. 发送 patch

2.1 git send-email 设置

我用的是 gmail,首先在设置中启用 IMAP。

登录 https://security.google.com/settings/security/apppasswords 生成一个新的 app-specific 密码供 sendmail 使用。

安装 git-email

$ apt-get install git-email

并且在 ~/.gitconfig 加入:

[sendemail]
    smtpEncryption = tls
    smtpServerPort = 587
    smtpServer = smtp.gmail.com
    smtpUser = <yourname@email>
    smtpPass = <your-password>

加密方案 tls 对应的端口是 587,ssl 方案的端口是 465。如果用第三方邮件发送工具(例如 msmtp),需要将 smtpServer 这个选项改成工具的路径。

幸运的话,执行

git send-email --to <maintainer@email> --cc <group@email> <yourpatch>

就可以将邮件发出去了。

使用内核自带的脚本可以找出邮件该发给谁:

./scripts/get_maintainer.pl -f <modified_file>

或者

./scripts/get_maintainer.pl <yourpatch>

如果发不出去那很有可能需要梯子,接着往下看。

2.2 代理设置

如果用其它不需要梯子的邮箱,这一步就可以忽略了。

首先得需要有一台可以访问 gmail 的机器 vps_ip,然后在本机执行

ssh -f -N -D 127.0.0.1:23333 -p $vps_port $user@vps_ip

建立一个本地的 socks5 代理 localhost:23333

然后安装 proxychains,修改 /etc/proxychains.conf,把 socks5 代理加上:

...
[ProxyList]
# add proxy here ...
socks5 127.0.0.1 23333

然后在上面的 git send-email 命令之前加上 proxychains,像这样:

proxychains git send-email --to <maintainer@email> --cc <group@email> <yourpatch>

应该就可以了。

3. 修正 patch 和讨论

待补充。

4. 邮件收发配置

关于邮件回复的配置可以参考 这篇笔记

参考资料

[1] Submitting patches: the essential guide to getting your code into the kernel

[2] 提交内核补丁到Linux社区的步骤

[3] 从 LKML 优雅的摘取补丁

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注