这里记录一下给 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
[3] 从 LKML 优雅的摘取补丁