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

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

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

1. 安装git和git send-email

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

yum install git
yum install git-email

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

配置git和smtp

配置git的姓名和邮箱信息

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

[sendemail]smtpencryption = sslsmtpserver=smtp.exmail.qq.comsmtpuser=caoyixuan2019@email.szu.edu.cnsmtpserverport=465smtpass=***************

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

3.下载和修改Linux kernel源码

使用git下载linux-next分支

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

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

git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

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

git status
# 创建新分支
git branch develop
git checkout develop

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

git status
git add .
git commit -s -v

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

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

  • 第一部分是 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 errorWhy 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分支为基准,生成补丁。

git format-patch master

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

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

5. 检查patch和发送邮件

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

./scripts/checkpatch.pl 0001-mm-page_owner.c-Modify-the-type-of-argument-order-in.patch

6.发送补丁

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

./scripts/get_maintainer.pl -f mm/page_owner.c

当时的输出结果是:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/687493.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我觉得POC应该贴近实际

今天我看到一位老师给我一份测试数据。 这是三个国产数据库。算是分布式的。其中有两个和我比较熟悉&#xff0c;但是这个数据看上去并不好。看上去第一个黄色的数据库数据是这里最好的了。但是即使如此&#xff0c;我相信大部分做数据库的人都知道。MySQL和PostgreSQL平时拿出…

求一个B站屏蔽竖屏视频的脚本

求一个B站屏蔽竖屏视频的脚本 现在B站竖屏竖屏越来越多了&#xff0c;手机还好点给我一个按钮&#xff0c;选择不喜欢&#xff0c;但是我一般都用网页版看视屏&#xff0c;网页版不给我选择不喜欢的按钮&#xff0c;目测大概1/4到1/3的视频都是竖屏视频。 目前网页版唯一的进…

无人播剧直播收益在哪里!快手无人播剧新秘籍:版权无忧,日入四位数攻略

无人播剧顾名思义就是通过短视频平台直播不需要真人出镜受众群体通过网络短视频平台看到的经典影视剧集可以实现24小时不停断的播放利用多种途径变现的一种直播形式 1、操作简单、不露脸、不出镜2、手机、电脑都可以操作3、可以矩阵操作4、0粉丝、0作品、0保证金就可以开播5、…

YOLOv9独家原创改进: 特征融合创新 | 一种基于内容引导注意力(CGA)的混合融合 | IEEE TIP 2024 浙大

💡💡💡创新点:提出了一种基于内容引导注意力(CGA)的混合融合方案,将编码器部分的低级特征与相应的高级特征有效融合。 💡💡💡在多个数据集实现暴力涨点,适用于小目标,低对比度场景 💡💡💡如何跟YOLOv9结合:将backbone和neck的特征融合,改进结构图如下…

四川医疗废水处理一体化设备如何选型

医疗废水处理一体化设备的选型是一个综合考量的过程&#xff0c;需要根据医疗废水的特性、处理要求、场地条件、预算等因素来确定。以下是选型时需要考虑的关键点&#xff1a; 废水特性分析&#xff1a;医疗废水通常含有病原体、药物残留、重金属、有机物、放射性物质等污染物。…

【动态规划】子数组、子串系列II|等差数列划分|最长湍流子数组|单词拆分|环绕字符串中唯一的子字符串

一、等差数列划分 413. 等差数列划分 算法原理 &#x1f4a1;细节&#xff1a; 1.如果当前nums数组中i位置的数和前面两个数可以构成等差数列&#xff0c;那么当前位置所有子数组构成的等差数列个数dp[i]就等于前一个位置有子数组构成的等差数列个数1&#xff08;这个1代表增加…

Maven 插件使用

1.spring-boot-maven-plugin 我们直接使用 maven package &#xff08;maven自带的package打包功能&#xff09;&#xff0c;打包Jar包的时候&#xff0c;不会将该项目所依赖的Jar包一起打进去&#xff0c;在使用java -jar命令启动项目时会报错&#xff0c;项目无法正常启动。…

【第17章】spring-mvc之日志和拦截器

文章目录 前言一、整合log4j1. 引入库2. log4j2.xml 二、拦截器1.拦截器类2.注册拦截器 三、过滤器和拦截器顺序总结 前言 【第2章】整合log4j2框架 在前面的spring中已经完成了对日志框架log4j的整合&#xff0c;这里我们直接拿过来用就行。 场景描述&#xff1a;每个接口请…

【iOS】frame与bounds区别

文章目录 前言framebounds两者区别size的区别总结 前言 在学习响应者链的过程中用到了frame与bounds的混用&#xff0c;这两个属性经常出现在我们的开发中&#xff0c;特别撰写一篇博客分析区别 首先&#xff0c;我们来看一下iOS特有的坐标系&#xff0c;在iOS坐标系中以左上…

LLM 可以从简单数据中学习吗?

在 10 月份的一次周会结束后&#xff0c;我提到 SFT 训练后的 Loss 曲线呈现阶梯状&#xff0c;至于为什么&#xff0c;并没有人有合理的解释&#xff0c;加上当时的重心是提升次日留存率&#xff0c;Loss 曲线呈现阶梯状与次日留存率的关系还太远&#xff0c;即使有问题&#…

Java练手项目 个人学习等选题参考

难度系数说明&#xff1a; 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目是非常值得反复学习的&#xff0c;从项目中成长 前言 大家好&#xff0c;我是二哈喇子&#xff0c;此博文整理了各种项目需求 要从本篇文章下的项目中学习的思路&#xff1a; 用的…

基于STM32F401RET6智能锁项目(使用库函数点灯、按键)

点灯硬件原理图 1、首先&#xff0c;我们查看一下原理图&#xff0c;找到相对应的GPIO口 LED_R低电平导通&#xff0c;LED4亮&#xff0c;所以LED_R的GPIO口需要配置一个低电平才能亮&#xff1b; LED_G低电平导通&#xff0c;LED3亮&#xff0c;所以LED_R的GPIO口需要配置一…