如何向Linux内核提交开源补丁?

2021年,我曾经在openEuler社区上看到一项改进Linux内核工具的需求,因此参与过Linux内核社区的开源贡献。开源贡献者参与Linux内核贡献的基本方式是提交补丁(patch),流程都可以在内核社区文档中找到,但是,单独学习需要一个较长的过程,新手难以入门,因此,本文整理当年的经验,给出一个简明的方法,供大家参考。如果本文中有和社区文档描述相矛盾的地方,应以社区文档为准。

内存管理子系统的维护者Andrew Morton在一次演讲时,观众提问如何参与内核贡献,能否出一个教程?印象中Andrew Morton的回答是,如果想参加Linux内核项目,应该先动手做起来。

1. 安装git和git send-email

笔者使用基于鲲鹏服务器的openEuler系统,首先使用yum安装gitgit-email。Ubuntu用户也可以使用apt工具,斯不赘述。

shell 复制代码
yum install git
yum install git-email

其中,Yixuan Cao为最终的补丁中,发送者的名字;而caoyixuan2019@email.szu.edu.cn指电子邮箱。

配置git和smtp

配置git的姓名和邮箱信息

打开~/.gitconfig文件,在文件末尾添加如下信息(以腾讯企业邮箱为例):

shell 复制代码
[sendemail]
        smtpencryption = ssl
        smtpserver=smtp.exmail.qq.com
        smtpuser=caoyixuan2019@email.szu.edu.cn
        smtpserverport=465
        smtpass=***************

通过配置腾讯企业邮箱的信息,将git-email和自己的邮箱账户绑定在一起。其中smtpuser是指电子邮箱账号,smtpass是私有的客户端密码,有了这个密码就可以无需验证,利用git发送电子邮件。

3.下载和修改Linux kernel源码

使用git下载linux-next分支

下载并修改linux-next分支的代码,这样才能保证我们的工作是基于最新的linux代码。实际上,Linux内核供开发者开发和测试的版本为next版本,next版本经过若干迭代后,会在一个被社区称为"merge window"的时期内合入主线(mainline)版本,主线版本经过若干迭代后,会进入稳定版。下图为Linux内核社区主页

使用git下载linux-next的命令如下:

shell 复制代码
git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

下载完成后,就会有一个linux内核的工程目录。进入之,可以先查看当前的git状态。然后,建立新的开发分支并切换到开发分支。

shell 复制代码
git status
# 创建新分支
git branch develop
git checkout develop

接着,我们修改代码。需要注意的是,可以修改的不仅是代码实现,也可以是注释、文档等。修改完成后,在开发分支代执行:

shell 复制代码
git status
git add .
git commit -s -v

注意 git commit 命令会自动打开编辑器,用以编辑提交信息。-s 参数可以自动在提交信息下加上一行Signed-off-by: Yixuan Cao <caoyixuan2019@email.szu.edu.cn>-v 参数会在提交信息下方显示出你做的修改,即diff信息,用以再次检查自己的改动,这一个参数不是必须的,但是推荐这么做。提交信息务必规范,不规范的提交信息可能会被直接拒绝,至少会被认为是不礼貌的。最终这个git的提交会被制作成开源补丁,以电子邮件的形式向维护者发送。

对于自动打开的编辑器,我们需要补充信息,其模板如下:

  • 第一部分是 short description,以子系统名打头,比如 mm,注意分号后面加个空格。这一部分最终会作为补丁的标题,要让维护者一眼就看出这个补丁大概干了什么事。请注意,为了方便内核的维护者管理,应该遵循工作的文件中,前人提交时的命名惯例。 如内存管理子系统,常见的标题写法是:mm/cma.c: fail if fixed declaration can't be honored,而在别的场景中,也有这样的写法:arm64: dts: rockchip: fix rk3399 hdmi ports node
  • 第二部分是 the body of your patch,这一部分要详细的解释你为何要做这个修改,以及怎么做的,注意时态用现在时,语态用主动形式。
  • 第三部分是之前的 -s 参数自动加上的,表示邮件和署名,是自动生成的,不用管。

一个简单的示例如下:

复制代码
mm: fix some error

Why I do these changes and how I do it.

Signed-off-by: Yixuan Cao <caoyixuan2019@email.szu.edu.cn>

如果commit之后还想修改提交信息,使用命令 git commit --amend -v,编辑器重新弹出。这些都是使用git的基本能力,更复杂的功能可以自行学习。需要注意:如果一次需要修改多处功能,应该使用多次提交并生成patchset。

4. 生成补丁

master分支为基准,检测你在当前 develop 分支所做的修改并生成 .patch 文件。

shell 复制代码
git format-patch master

命令完成后,你就可以在当前目录下看到你的.patch 文件了。

5. 检查patch和发送邮件

检查补丁格式,要做到 0 errors, 0 warnings。补丁的格式有严格的限制,例如,为了维护者的阅读方便,输入的文本内容的每一行都不可太长。但是另一方面,这一行命令只能做简单的格式的检查,不能检查其是否能够通过编译、功能符合要求等。因此在提交之前,应该做好充分的测试。

shell 复制代码
./scripts/checkpatch.pl 0001-mm-page_owner.c-Modify-the-type-of-argument-order-in.patch

6.发送补丁

要将上补丁发送给社区维护者,需要查看相关的上游维护者的电子邮箱地址。例如要修改mm/page_owner.c,使用命令

shell 复制代码
./scripts/get_maintainer.pl -f mm/page_owner.c

当时的输出结果是:

shell 复制代码
Andrew Morton <akpm@linux-foundation.org> (maintainer:MEMORY MANAGEMENT)
linux-mm@kvack.org (open list:MEMORY MANAGEMENT)
linux-kernel@vger.kernel.org (open list)

根据输出结果,我们知道是Andrew Morton维护mm子系统。用如下命令,可以通过电子邮件发送补丁。需注意,参数--to后接收件人,--cc后接被抄送者。

复制代码
git send-email --to akpm@linux-foundation.org \
--cc linux-mm@kvack.org \
--cc linux-kernel@vger.kernel.org \
*.patch

至此工作已经全部完成。如果补丁并入上游分支的话,会收到通知邮件;如果被打回,也会被告知有不妥之处。

相关推荐
A_humble_scholar几秒前
Linux(十七)深入多线程编程:同步原语与实战指南
linux·运维·c++
老马聊技术3 分钟前
Rocky Linux 9.0 安装 MySQL8.x详细教程
linux·数据库
Smoothcloud润云6 分钟前
训练一个7B参数的大模型需要多少张GPU?大概要跑多久?
人工智能·深度学习·ai·开源·gpu算力
醇氧21 分钟前
主流 Agent 开发框架全解析(2026 最新)
大数据·数据库·人工智能·开源
xinyu39136 分钟前
旧版Ubuntu Docker镜像 apt 失败
linux·ubuntu·docker
咏方舟【长江支流】38 分钟前
【开源】跨语言·跨平台·跨数据库(4) ——用宝框架 ORM 数据源适配器
数据库·开源·ai编程·orm·咏方舟-长江支流·用宝框架·用宝框架orm
JZC_xiaozhong1 小时前
OA调价审批后,采购调价单如何自动同步到ERP?解决漏录错价难题
大数据·linux·服务器·前端·数据库·数据孤岛解决方案·数据集成与应用集成
ljs6482739511 小时前
Linux 实用命令:环境变量、文件传输、压缩解压、跨服务器传文件
linux·运维·服务器
咏方舟【长江支流】1 小时前
【开源】跨语言·跨平台·跨数据库(3) —— 为用宝框架增加ORM,让AI执行
数据库·人工智能·开源·ai编程·orm·咏方舟-长江支流·用宝框架
还好还好不是吗1 小时前
MatrixMedia v0.10.x 更新:B站封面自定义 + 二开指南,开源项目的开发者体验再升级
electron·开源