一、详细步骤

本次使用CentOS Linux 8系统虚机,git下载修改源码提取patch并邮件给maintainer。

1.装git和git send-email

yum install gityum install git-email

2.配置git和smtp

git config --global user.name "xxx"git config --global user.email "xxx@xxx.com"

配置smtp

vi ~/.gitconfig         //在文件末尾添加[sendemail][user]name = xxxemail = xxx@xxx.com[core]editor = vim[gitreview]username = xxx[commit]template = /root/.gitcommit[sendemail]smtpencryption = sslsmtpserver = smtp.xxx.comsmtpuser = xxx@xxx.comsmtpserverport = 465

3.通过git clone下载直接下载压缩包后解压。

(以下方式选择其一即可:

进入https://github.com/torvalds/linux下载最新版本。

进入https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git查看最新版

有些模块的Maintainer还会维护自己的代码分支,详细信息可以linux内核源码的MAINTAINERS文件中找到,以driver-core模块为例:

/* MAINTAINERS */

DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS

M:      Greg Kroah-Hartman <gregkh@linuxfoundation.org>

R:      "Rafael J. Wysocki" <rafael@kernel.org>

S:      Supported

T:      git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git

F:      Documentation/core-api/kobject.rst

F:      drivers/base/

F:      fs/debugfs/

F:      fs/sysfs/

F:      include/linux/debugfs.h

F:      include/linux/kobj*

F:      lib/kobj*

进入https://www.kernel.org/官网-->[browse]-->commit 下载gz压缩包(本次使用,2022.2.22

tar -zxf linux-5.17-rc7.gz

进入linux-5.17-rc7,执行

git init // commit后才能创建新分支git statusgit add .git commit -m "linux-5.17-rc7"

4.提前配置~/.gitcommit文件

新建一个模板,按如下格式(提交时必须修改一下,不然认为空操作拒绝commit;每行不要超过75个字符):

drivers: fix some errorWhy I do these changes and how I do it.# Signed-off-by: My Name <my_email@gmail.com> (gitcommit -s自动添加,so不需要)
  • 第一部分是 short description,以子系统名打头,比如 mm,注意冒号后面加个空格,不知道子系统名的可以看看你修改的这个文件的修改历史,看看之前的开发者是怎么写的。这一部分需要使用一句简短的话描述你所做的修改,要让维护者一眼就看出这个 Patch 大概干了什么事。
  • 第二部分是 the body of your patch,这一部分要详细的解释你为何要做这个修改,以及怎么做的,注意时态用现在时,语态用主动形式。
  • 第三部分是之前的 -s 参数自动加上的,不用管。
  • 必须要注意的是,这三部分之间都要有一个空行隔开

5.修改Linux kernel源码并提交

加入自己本次要提交的patch,修改代码后,执行下面的命令

git statusgit add .git commit -s /* -s:自动在commit中添加Signed-off-by行 */

注意 git commit 命令会自动打开编辑器让你编辑 Commit 信息,

-s 参数可以自动在你的 commit 信息下加上一行Signed-off-by: My Name <my_email@gmail.com>

-v 参数会在你的 Commit 信息下方显示出你做的修改,确保你能再三检查自己的改动,这一个参数不是必须的。

注意,linux社区对commit信息的格式有严格要求,具体参考Documentation/process/submitting-patches.rst文档,大致如下(同前所述):

module name: fix some bugs

why and how

Signed-off-by: Name <xxx@gmail.com>

补丁的第一行是标题,首先是模块名称,可使用git log查看所修改文件以前的提交记录(前提是git了网站上的工程才会有相应log记录,tar解压的没有),举例如下:

git log drivers/base/bus.c

输出:

commit a4723041857eaa35f189d237da769c4c63235544

Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Date:   Mon Oct 29 16:31:26 2018 +0100

 driver core: drop use of BUS_ATTR()

We are trying to get rid of BUS_ATTR() so drop the last user of it from

the tree.  We had to "open code" it in order to prevent a function name

conflict due to the use of DEVICE_ATTR_WO() earlier in the file :(

Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

可见模块名称为driver core。

commit信息添加完成后保存退出,此时执行 git log 即可看到刚刚的提交详情。

[root@localhost linux-5.17-rc7]# git log
commit 2486b0f3cb0ec7a17864d70a41739b182bf375dd (HEAD -> master)
Author: xxx<xxx@xxx.com>
Date:   Thu Mar 24 17:50:28 2022 +0800tools:iio: Fix the potential stack overflow riskAdd judgment to fix the potential stack overflow risk.Signed-off-by: xxx<xxx@xxx.com>commit b4100028603a11f14602add0bd54fe35c66a5017
Author: xxx<xxx@xxx.com>
Date:   Tue Mar 8 11:19:39 2022 +0800kernel-5.17-rc7

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

6.生成patch

使用下面的命令生成patch,命令完成后,当前目录就可以看到 Patch 文件了。

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

其中--subject-prefix 是为邮件标题添加个前缀

前缀

含义

PATCH

常规的且正式的补丁

RFC

不是要正式提上去的,希望一起讨论这个补丁,用来说明方向,看看意见

RESEND

邮件发过了但好几周都没人鸟,可能被遗忘了,重新发

由于到linus和linux内核的电子邮件流量很高,通常会在主题行前面加上[PATCH] 前缀. 这使Linus和其他内核开发人员更容易将补丁与其他电子邮件讨论区分开。

7.patch格式检查

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

./scripts/checkpatch.pl  0001-drivers-format-the-code.patch

8.测试发送

在正式发送之前,先发给自己测试一下:

git send-email --to  xxx@xxx.com  --cc xxx@xxx.com 0001-xxxx-.patch

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

9.内核编译检查

进入linux-5.17-rc7目录下(Makefile文件所在目录)运行

make menuconfig

在图示界面中确认本次修改的部分(本次为driver/vfio部分)均已被设置为编译y或[*]或[m]

make bzImage  //编译内核

等待编译……

解决可能出现的错误……

编译成功。

对于改动的部分是内核代码,一定要确认make menuconfig里选中了自己改动的模块,不然不会编译。这个一般可以从编译记录中查找是否有 CC …… xxx.o 来确认改动的xxx部分已被编译。第一次编译内核需要约2h,以后再编只会编译所更改的模块所以会很快,当然也可以选择只编译内核的某个模块。

对于改动的部分是非内核代码(如某些tools工具其实只是一些检查或生成工具),该部分不会被编入内核中,可以通过进入到该目录下直接执行 make 编译来检查更改后的代码有无bug,只要在该目录下生成xxx.o即可证明改动后的代码没有问题。

10.查找邮件maintainer

既然 Patch 已经测试完毕,那么是时候发送给上游维护者了。运行以下命令(二选一均可)找出你应该把 Patch 发给谁。

./scripts/get_maintainer.pl  -f  drivers/vfio/vfio_iommu_type1.c./scripts/get_maintainer.pl  0001-xxxx.patch

该命令输出如下

Alex Williamson <alex.williamson@redhat.com> (maintainer:VFIO DRIVER)

Cornelia Huck <cohuck@redhat.com> (reviewer:VFIO DRIVER)

kvm@vger.kernel.org (open list:VFIO DRIVER)

linux-kernel@vger.kernel.org (open list)

另外,对于小的补丁,你也许会CC到搜集琐碎补丁的邮件列表(Trivial Patch Monkey) trivial@kernel.org,那里专门收集琐碎的补丁。下面这样的补丁会被看作“琐碎的” 补丁

  • 文档的拼写修正。
  • 修正会影响到 grep(1) 的拼写。
  • 警告信息修正(频繁的打印无用的警告是不好的。)
  • 编译错误修正(代码逻辑的确是对的,只是编译有问题。)
  • 运行时修正(只要真的修正了错误。)
  • 移除使用了被废弃的函数/宏的代码(例如 check_region。)
  • 联系方式和文档修正。
  • 用可移植的代码替换不可移植的代码(即使在体系结构相关的代码中,既然有人拷贝,只要它是琐碎的)
  • 任何文件的作者/维护者对该文件的改动(例如 patch monkey 在重传模式下)

11.发送patch

git send-email --to alex.williamson@redhat.com \

-cc cohuck@redhat.com \

-cc kvm@vger.kernel.org \

-cc linux-kernel@vger.kernel.org

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

12.后续等待合入或邮件回复

静静的等待维护者的邮件通知吧,一般几天之内就会回复邮件然后表示Apllied,Thanks或告知预计要合入到下一版本的如linux-5.18,有时第二天就回复一般是patch有问题。

如果patch有问题,需要回复邮件说明疑问,或直接按maintainer的要求修改补丁变成V2版本再次提交。再次提交V2版本需要注意在补丁说明中添加v1->v2的变化(patch中---分隔符之后):

<commit message>
...
Signed-off-by: Author <author@mail>
---
V2 -> V3: Removed redundant helper function
V1 -> V2: Cleaned up coding style and addressed review commentspath/to/file | 5+++--
...

如果是回复补丁的话,可以按照如下格式发送新版patch或说明txt

git send-email \

--in-reply-to=20220615073348.6891-1-xxx@xxx.com \                  (Message-ID)

--to=xxx@xxx.com \

--cc=xxx@xxx.org \

/path/to/YOUR_REPLY

其中,Message-ID可以在任一带有官方性质的邮件记录网址如(Project List - Patchwork,All of lore.kernel.org,Projects | Patchew 等等)查看,一般是“时间戳+邮件地址”的形式,最后是你的补丁或文本注释。

二、编译内核时遇到问题及解决方式

1. fatal error: openssl/opensslv.h: No such file or directory

fatal error: openssl/bio.h: No such file or directory

A:缺少包,直接yum -y install openssl-devel即可(apt-get install libssl-dev)

2. 其余类似的报错,缺少文件可依次安装:

A:yum -y install flex, bison, openssl-devel, elfutils-libelf-devel

3. make[1]: *** No rule to make target 'certs/rhel.pem', needed by 'certs/x509_certificate_list'. Stop.

make: *** [Makefile:1729: certs] Error 2

A: => 打开 .config,注释掉这两行

CONFIG_MODULE_SIG_KEY=""

CONFIG_SYSTEM_TRUSTED_KEYS=""

4.BTF: .tmp_vmlinux.btf: pahole (pahole) is not available

Failed to generate BTF for vmlinux

Try to disable CONFIG_DEBUG_INFO_BTF

make: *** [Makefile:1113: vmlinux] Error 1

A:  => 修改CONFIG_DEBUG_INFO_BTF=n

三、本次patch样本

四、参考网址笔记

0. Submitting patches: the essential guide to getting your code into the kernel — The Linux Kernel documentation

1. 提交内核补丁到Linux社区的步骤 - 广漠飘羽 - 博客园

2. Linux内核文档:《如何让你的改动进入内核》 - 广漠飘羽 - 博客园

3. 纪念第一次向Linux内核社区提交patch - 云+社区 - 腾讯云

4. 向linux内核社区提交patch - 知乎

目录

一、详细步骤

1.安装git和git send-email

2.配置git和smtp

3.通过git clone下载或直接下载压缩包后解压。

4.提前配置~/.gitcommit文件

5.修改Linux kernel源码并提交

6.生成patch

7.patch格式检查

8.测试发送

9.内核编译检查

10.查找邮件maintainer

11.发送patch

二、编译内核时遇到问题及解决方式

1. fatal error: openssl/opensslv.h: No such file or directory

fatal error: openssl/bio.h: No such file or directory

2. 其余类似的报错,缺少文件可依次安装:

3. make[1]: *** No rule to make target 'certs/rhel.pem', needed by 'certs/x509_certificate_list'. Stop.

make: *** [Makefile:1729: certs] Error 2

4.BTF: .tmp_vmlinux.btf: pahole (pahole) is not available

三、本次patch样本

四、参考网址笔记


向 Linux kernel 社区提交patch补丁步骤总结(已验证成功)相关推荐

  1. linux kernel社区探索

    1.linux社区的bug fix Linux内核社区提交补丁_陈孝松的博客-CSDN博客 2.linux内核代码风格 Linux内核文档:<Linux内核代码风格> - 广漠飘羽 - 博 ...

  2. 如何向Linux内核提交代码,如何往 Linux 内核社区提交代码

    总有这样一群人,不计报酬不辞辛苦的为这个世界的美好添砖加瓦,在这一类人中的某一些人,他们开创了许多伟大的开源工程,这些工程也许会随着年代的久远逐渐被替代,但仍然有一些随着时光流逝变得愈发强大,这其中就 ...

  3. Linux安装 VMware tools 工具的方法(转,已测试成功)

    Linux安装 VMware tools 工具的方法 VMware虚拟机中如何安装VMWare-Tools详解好处:可以支持图形界面,可以支持共享文件功能等 1 工具/原料 1)安装过虚拟机软件的计算 ...

  4. linux p2p 传输工具,用ipp2p在Linux上封杀bt等p2p传输(已试验成功)

    看内核的版本        uname -a 看iptables版本      iptables -V 首先下载对应自己系统版本的iptables源码:www.iptables.org  使用wget ...

  5. 华人学者往Linux内核里提交bug,社区把整个明尼苏达大学拉黑了

    梦晨 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI Linux内核的维护者Greg K-H,突然把整个明尼苏达大学拉黑了! 这是咋回事? 原来明尼苏达大学华人教授K.J Lu带领的团队在 ...

  6. HOWTO: Create and submit your first Linux kernel patch using GIT

    这个文章用自己第一次提交patch的经历详细介绍了用git提交patch的步骤,值得学习. From : http://linux.koolsolutions.com/2011/02/26/howto ...

  7. 如何为linux kernel贡献代码

    和一般github项目可以直接提交pr不同,linux kernel项目庞大,管理繁琐,如果我们想要对linux kernel提出改进,并希望最终改进能进入主分支,则需要严格按照提交patch的流程 ...

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

    linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...

  9. 实时Linux内核调度器 | Real-Time Linux Kernel Scheduler

    <Real-Time Linux Kernel Scheduler> HOWTOs by Ankita Garg on August 1, 2009 目录 Design Goal 设计目标 ...

  10. 镜像安装linux选择内核版本,在CentOS和Ubuntu中安装Linux Kernel 4.13.10

    Linus Torvalds 在 10 月 17 日星期五正式发布了稳定版 Linux Kernel 4.13.10,这个最新版本发布了新功能,进行了诸多修复和问题改进.下面将向大家介绍在 CentO ...

最新文章

  1. 精妙的单片机非阻塞延时程序设计
  2. VR原理讲解及开发入门
  3. 网上收集下boost::asio发送与传输相关的几个函数,老是忘记
  4. python语言怎么学-如何从零开始学习Python,python语言编程入门
  5. [Python unittest] 3-Organizing test code
  6. jquery plugins
  7. IOS开发--TextField
  8. 【Flink】Flink消费kafka 突然报错 Kafka09PartitionDiscoverer.getAllPartitionsForTopics
  9. 机器学习基础(九)—— iterative optimization
  10. 从10秒到2秒!ElasticSearch性能调优实践
  11. 利用 Python 读写文本内容
  12. 实验一:MongoDB的基本操作
  13. 击中击不中变换的作用理解
  14. 大数据处理技术之数据集成
  15. ubuntu的gnome环境下使用todesk远程工具
  16. TIA西门子博途V17程序安装及相关注意事项
  17. 宇宙第一 IDE 霸主,换人了?
  18. java里如何表示黑桃方片_扑克红桃,方片,黑桃,梅花他们的顺序如何,代表什么意义呀?jac 爱问知识人...
  19. ArcGIS教程:分水岭
  20. 【必看】论文写作入门技巧

热门文章

  1. VB DoEvents 的使用
  2. c语言课程设计万年历查询,C语言课程设计——万年历.pdf
  3. 使用腾讯云发送短信 ---- 手把手教你搞定所有步骤
  4. Snipaste2.7.3下载安装与使用(超实用的截图利器)
  5. QT等待动态图gif加载透明背景lable
  6. java NEW一个对象之后加入大括号
  7. linux下libreoffice增加字体,Linux下Libreoffice增加字体
  8. 小程序开发的流程简介
  9. 分形之——谢尔宾斯基三角形
  10. pvs环境中批处理安装PDF打印机