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和邮件的关系)

  • 27
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值