如何向 Linux Kernel 提交 Patch

昨晚终于向内核上游提交了人生中第一个 Patch,今天早上起床迫不及待的看手机,发现维护者 Andrew Morton 在6点31分回复我了:The patch has been added to the -mm tree. 顿时感到异常兴奋。虽然这个 Patch 没什么技术含量,但是至少这是我在看代码过程中自己发现的,终于体会到了进步的感觉。下面我把 Patch 提交的步骤记录一下,也供别人参考下。

Git Email 配置

为了确保发送的 Patch 格式不会出错,我们使用 Git 自身提供的命令 git send-email

安装 git send-email

我用的 Fedora,安装命令为 sudo dnf install git-email,其他系统请自行使用 yum 或 apt

配置 git-email 使用 Gmail 邮箱服务

我比较喜欢 Gmail,所以此处就让 git-email 使用 Gmail 提供的邮箱服务了,换句话说 git-email 只是 一个邮件发送客户端而已,真正的工作还需要 Gmail 来完成。

  1. 打开 Git 配置文件

    vim ~/.gitconfig

  2. 文件末尾追加如下内容
    [sendemail]
    from = My Name <[email protected]>
    smtpserver = smtp.gmail.com
    smtpuser = [email protected]
    smtpencryption = tls
    smtppass = my_gmail_password
    chainreplyto = false
    smtpserverport = 587

修改代码树并生成 Patch

建立一个新的分支

这是为之后生成 Patch 提供方便,使用命令如下:

 git branch develop
 git checkout develop

修改内核代码树

这一步修改什么就取决于你了。

提交修改

git add .
git commit -s -v

注意 git commit 命令会自动打开编辑器让你编辑 Commit 信息,-s 参数可以自动在你的 Commit 信息下加上一行Signed-off-by: My Name <[email protected]> ,-v 参数会在你的 Commit 信息下方显示出你做的修改,确保你能再三检查自己的改动,这一个参数不是必须的,但是推荐这么做。

注意,Commit 信息的格式有严格限制,我就不废话了,直接上模板。

mm: fix some error

Why I do these changes and how I do it.

Signed-off-by: My Name <[email protected]>
  1. 第一部分是 short description,以子系统名打头,比如 mm,注意分号后面加个空格,不知道子系统名的可以看看你修改的这个文件的修改历史,看看之前的开发者是怎么写的。这一部分需要使用一句简短的话描述你所做的修改,要让维护者一眼就看出这个 Patch 大概干了什么事。
  2. 第二部分是 the body of your patch,这一部分要详细的解释你为何要做这个修改,以及怎么做的,注意时态用现在时,语态用主动形式。
  3. 第三部分是之前的 -s 参数自动加上的,不用管。
  4. 必须要注意的是,这三部分之间都要有一个空行隔开。

如果 commit 之后还想修改 Commit 信息的话需要使用命令 git commit --amend -v

生成 Patch

既然修改已经提交,那么是时候生成 Patch 了。

git format-patch master

这条命令是以 master 分支为基准,检测你在当前 develop 分支所做的修改并生成 Patch 文件。

命令完成后,你就可以看到你的 Patch 文件了。

[[email protected] linux]$ ls *.patch
0001-mm-fix-some-error.patch

检查你的 Patch 格式

运行以下命令检查你的 Patch 格式有没有问题,要做到 0 errors, 0 warnings

./scripts/checkpatch.pl 0001-mm-fix-some-error.patch

发送 Patch

既然 Patch 已经生成完毕,那么是时候发送给上游维护者了。

找出应该发给谁

运行以下命令找出你应该把 Patch 发给谁。

./scripts/get_maintainer.pl -f include/linux/gfp.h

注意,include/linux/gfp.h 这个文件名改成你所修改的文件。

在我这里,该命令输出如下:

Andrew Morton <[email protected]> (commit_signer:7/8=88%)
Michal Hocko <[email protected]> (commit_signer:3/8=38%,authored:1/8=12%,added_lines:3/21=14%,removed_lines:10/33=30%)
Vlastimil Babka <[email protected]> (commit_signer:3/8=38%,authored:1/8=12%,added_lines:8/21=38%,removed_lines:6/33=18%)
Alexander Duyck <[email protected]> (commit_signer:3/8=38%,authored:3/8=38%,added_lines:6/21=29%,removed_lines:5/33=15%)
Mel Gorman <[email protected]> (commit_signer:2/8=25%)
Vladimir Davydov <[email protected]> (authored:1/8=12%,removed_lines:9/33=27%)
My Name <[email protected]> (authored:1/8=12%,added_lines:2/21=10%,removed_lines:2/33=6%)
[email protected] (open list:MEMORY MANAGEMENT)
[email protected] (open list)

测试发送

对于像我这样的新手来说,最好在发送给上游维护者之前先拿自己邮箱做个测试,小心点总没坏处。

git send-email --to [email protected] 0001-mm-fix-some-error.patch

一切正常的话,你应该可以收到邮件了,检查下格式什么的是否和你预想的一样。

正式发送

git send-email --to [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] 0001-mm-fix-some-error.patch

之后你的 Patch 就发送给上游维护者并抄送到对应的邮件列表了。

后续

静静的等待维护者的邮件通知吧,如果 Patch 并入上游分支的话会给你发邮件通知的,如果被打回的话也会告诉你哪里错了。等我以后提交个复杂点的补丁被打回之后再来写这部分。

时间: 2024-10-05 13:27:27

如何向 Linux Kernel 提交 Patch的相关文章

video : Write and Submit your first Linux kernel Patch

http://v.youku.com/v_show/id_XNDMwNzc3MTI4.html After working with Linux (mostly as an advanced user) for years, I decided to post my first p=linux/kernel/git/x86/linux-2.6-tip.git;a=commitdiff;h=e19e074b1525d11a66c8e3386fec7db248ad3005" style="

Linux Kernel - Debug Guide (Linux内核调试指南 )

http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环

Linux Kernel 4.0 RC1 发布!

Linux Kernel 4.0 RC1 发布,Linus 发表声明说,基于现代的标准,从实际技术方面来说,这只是一个小的更新版本,4.0 并没有什么重大的意义,只是顺势而为,没有重大的新特性,也没有兼容性方面的改变. Linus 认为大家可能都在憧憬 4.1.15 版本,因为"电影<终结者>中机器人T-800使用的天网内核版本号".Kernel 4.0一个重要特性是Live Patching--不用重启为内核打补丁的机制. Linux Kernel 4.0 RC1 现有大

如何进行Linux Kernel 开发

转自:http://www.cppblog.com/flyonok/archive/2011/04/15/144316.html 如何进行Linux Kernel 开发? (Take 3) 译者序:这是一篇很重要的文档,它介绍了内核开发的方方面面.这篇文档已被加入到内核源码树的Documentation文档里(名字为HOWTO),你可以在最新的内核树里找到它.尽管已经有网友翻译过这篇文档,但是我还是决定自己再翻译一遍.翻译完之后,我的感触是如果依靠翻译来进行学习,速度太慢了.以后的技术文档直接看

Linux Kernel 开发报告 25 周年版

Linux基金会发布 2016 年度 Linux 内核开发报告,这次恰逢 Linux 内核 25 周年(腾云科技ty300.com),所以相比往年又更多的回顾性内容,值得一读. Linux 内核开发报告 2016 版 一些有趣的信息: 自 3.18 内核以来,合并自Linux Kernel内核的新功能覆盖面更为广泛,且涉及安全性的新功能越来越多 4.0 系列的引入仅仅是由于 Linus (基础教程qkxue.net)觉得小版本号已经超越正常人手指和脚趾数量的总和了.每一个内核版本发布都是传统意义

使用 GIT 获得Linux Kernel的代码并查看,追踪历史记录

Linux kernel  的官方 GIT地址是: http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git 可以从这个地址拿到 kernel 的 代码仓库. 1. 拿代码仓库 [plain] view plaincopyprint? git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git 2. 查看状态: [pla

Linux: the schedule algorithm in Linux kernel

Linux kernel里面用到的一个叫 CFS (Completely-Fair-Scheduler)的调度算法.在网上找的描述都很不直观,很难读.但是找到了一篇很通俗易懂的(大道至简啊...): http://people.redhat.com/mingo/cfs-scheduler/sched-design-CFS.txt 为了防止链接失效,粘贴全文如下: This is the CFS scheduler. 80% of CFS's design can be summed up in

Android linux kernel privilege escalation vulnerability and exploit (CVE-2014-4322)

In this blog post we'll go over a Linux kernel privilege escalation vulnerability I discovered which enables arbitrary code execution within the kernel. The vulnerability affected all devices based on Qualcomm chipsets (that is, based on the "msm&quo

Install Linux Kernel - AT91SAM9260EK

二.AT91SAM9260EK 2.1下载 介绍页: http://www.at91.com/linux4sam/bin/view/Linux4SAM/LegacyLinuxKernel 下载页: a)ftp://www.at91.com/pub/linux/2.6.30-at91/ b)http://maxim.org.za/at91_26.html (1)Kernel V2.6.30 (2) maintainer – patch V2.6.30(23/06/2009) (3) experim