git拉取内核代码,以及应用某补丁到内核

Linux 内核正在不断发展和改进。每天都有补丁提交到Linux 内核邮件列表 (LKML)。其中一些补丁被接受并合并到主线 Linux 内核中,可供用户使用,而其他补丁则永远不会被接受。

有一些补丁可能由于某些原因已提交但从未合并,但是我们可能恰好需要这个补丁,为此我们需要将 LKML 中的代码合并到我们需要的内核中。

1、获取 Linux 内核源代码

Linux 内核的源代码可从https://www.kernel.org下载,也可以使用git进行克隆。但当我们进入 git 存储库页面https://git.kernel.org时,可能会发现git仓库有很多个。

在这里插入图片描述

通过搜索kerbel source,找到主存储库。点击git仓库后,将会看到克隆它的链接。

在这里插入图片描述
可以使用这些链接克隆存储库。

这里推荐使用ssh协议的git链接,因为kernel文件多commit记录多,使用https协议的在拉取时会遇到
在这里插入图片描述

# 通过加大buffer也不行
git config http.postBuffer 524288000

# 这种浅克隆的方式也不行,在fetch的时候也会出现如上问题
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git --depth=1
git fetch --unshallow
# 除非多次步进fetch  例如:git fetch --depth=100  git fetch --depth=200,但麻烦

使用ssh协议,规避这些问题,等待若干时间后,代码拉取完成。

2、将内核的某个补丁应用到某个版本中

使用lore.kernel.org的mbox补丁

首先在https://lore.kernel.org上找到您感兴趣的补丁,然后在线程摘要中,您将找到指向 mbox.gz 文件的链接,如下所示。
在这里插入图片描述
复制链接下载下来并解压
在这里插入图片描述
t.mbox 文件是一个“邮箱”文件,以纯文本形式显示,可以使用文本编辑器vi/vim或者查看器less等打开。
在这里插入图片描述
它包含 LKML 线程中交换的邮件。可以使用git am应用来自这些电子邮件交换的补丁。

我们可以从这个补丁的信息找到到补丁将要合入的分支,这样合入到该分支冲突最小,如何寻找呢?

从补丁的下载地址里可以可到年月日这些信息,比如刚刚补丁的下载地址是 20210121191020.3144948-1-dan@kernelim.com,那么我们根据当前时间,看这个补丁是下一个版本的还是已经发布过的,很明显根据这个补丁的时间与当前时间相比,这个补丁的目标版本就得去历史的找。如下:
在这里插入图片描述

  • linux-next-history:表示历史的版本
  • linux-next:将要发布的版本

由于这个补丁将要合入的版本已经发过了,所以点进历史的,找到与当前补丁相近的时间
在这里插入图片描述
然后我们将代码切换到这个分支,应用补丁
在这里插入图片描述
git 会提示补丁是空的。如果补丁系列附带一封“附函”(补丁 0/X),这很正常,这封电子邮件(附函)用于解释补丁系列(多个补丁组合在一起),不包含补丁。所以不要担心错误消息,只需跳过这个不是补丁的“补丁”(消息)“git am --skip”。
在这里插入图片描述
验证:

查看补丁中一段新增的代码
在这里插入图片描述
去对应文件搜索
在这里插入图片描述

使用patchwork的patch补丁

在补丁的内容里有一个message-ID
在这里插入图片描述

注意一定要选择顶级的message-ID,如何看是不是顶级的,将页面拉到底部,看有没有parent

顶级:在这里插入图片描述

非顶级:
在这里插入图片描述

然后将这个顶级的message-ID拼接https://patchwork.kernel.org/project/linux-nfs/cover/后面

也就是这个补丁的具体地址:https://patchwork.kernel.org/project/linux-nfs/cover/20210121191020.3144948-1-dan@kernelim.com
在这里插入图片描述
这里有两种类型的补丁
在这里插入图片描述
series:会把相关给的一系列补丁都下载到一个.patch文件中

这里选择series类型的下载,得到patch文件。
在这里插入图片描述

上传并应用补丁
在这里插入图片描述
验证:
在这里插入图片描述

以上仅提供了将补丁合入内核的一个思路,是将补丁合入到相近的补丁版本中以减少冲突

但是实际中可能需要某个补丁合入到更低或更高的内核版本代码中,此时会出现冲突,这个时候根据补丁的增删以及平时处理git冲突的方式来决定是否保留对应代码,然后重新编内核即可

参考文章:https://blog.xzr.moe/archives/293/ (该文章里介绍了LKML的patch和邮件的关系)

相关推荐

  1. git仓库代码

    2024-07-16 18:44:14       37 阅读
  2. git 如何最新代码

    2024-07-16 18:44:14       28 阅读
  3. git远程分支本地

    2024-07-16 18:44:14       53 阅读
  4. git命令解决冲突,重新代码

    2024-07-16 18:44:14       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 18:44:14       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 18:44:14       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 18:44:14       62 阅读
  4. Python语言-面向对象

    2024-07-16 18:44:14       72 阅读

热门阅读

  1. Transforms转换Tensor数据类型、归一化

    2024-07-16 18:44:14       20 阅读
  2. 瑞宏嘉鑫建材元宇宙:探索虚拟世界的无限可能

    2024-07-16 18:44:14       19 阅读
  3. 探索深度学习与Transformer架构的最新进展

    2024-07-16 18:44:14       20 阅读
  4. 大白话讲解设计原则及其优缺点

    2024-07-16 18:44:14       18 阅读
  5. vector的模拟实现

    2024-07-16 18:44:14       19 阅读
  6. Python实现发票信息识别

    2024-07-16 18:44:14       18 阅读
  7. TCP可靠传输例题

    2024-07-16 18:44:14       19 阅读
  8. 漏洞-Alibaba Nacos derby 远程代码执行漏洞

    2024-07-16 18:44:14       21 阅读