【问题标题】:Integrating changes in the kernel using Yocto using patches使用 Yocto 使用补丁集成内核中的更改
【发布时间】:2021-04-17 01:46:18
【问题描述】:

如果你想修改linux内核,使其排除某些模块,你通常去/kernel/msm-4.9/arch/arm/configs/vendor/<machine-name>_defconfig,里面有一堆Kconfig符号,我要排除的那些被注释掉了,如下图。

CONFIG_PPP=y
#CONFIG_PPPOL2TP=y
CONFIG_PPP_ASYNC=y

然后我通过运行bitbake virtual/kernel 构建 linux 映像,理想情况下应该集成我的更改,但是当我启动映像时,我仍然看到一些注释模块的日志出现。

我检查了yocto documentation,看起来他们为要修改的文件创建了一个补丁,然后将该修改后的文件附加到.bbappend 文件中,例如:

 FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

 SRC_URI += "file://0001-calibrate-Add-printk-example.patch"

所以就我而言,如果我要修改/kernel/msm-4.9/arch/arm/configs/vendor/<machine-name>_defconfig,我会:

  • 创建此原始文件的副本
  • 粘贴到poky/meta-bsp/recipes-kernel/linux-msm/files
  • 重命名
  • 将此文件包含在 .bbappend 中(如上所示)

但是上面的补丁将如何覆盖我计划通过这种方法修改的原始/kernel/msm-4.9/arch/arm/configs/vendor/<machine-name>_defconfig

【问题讨论】:

  • 首先,正确禁用该选项将是# CONFIG_PPPOL2TP is not set(正是我写的方式,包括所有空格等)。您对评论所做的就是切换到默认值。
  • 我认为这无关紧要,因为# 只是指评论,而后跟# 的任何内容都无关紧要,不是吗?此外,在poky 中生成的.config 文件确实具有# CONFIG_PPPOL2TP is not set,所以我猜构建系统会查看各个defconfig 文件中已注释掉的内容,并确保它不包含在内核映像中。此外,运行rebake virtual/kernel 确实可以解决问题,但我仍然不确定如何使用补丁来完成类似的任务......
  • 没有。构建系统不考虑 cmets,它只是忽略它们。然后应用 default,不管它是什么。在您的特定情况下,这意味着在许多其他情况下禁用它可能会有所不同。配置中有三种状态:a)启用(如“y”或“m”),b)禁用(如“# ...未设置”,或c)作为注释或不可解析的垃圾被忽略(意味着默认开启这个特殊的配置)。
  • 如果使用# 会忽略它们,为什么添加is not set 而不是使用# 将其注释掉?
  • 再次阅读我的 cmets。如果有什么清楚的,请阅读文档。

标签: linux-kernel embedded-linux yocto bitbake


【解决方案1】:

你是对的,源代码修改是在 Yocto 补丁的帮助下完成的。回答你的问题

但是上述补丁将如何覆盖我计划通过这种方法修改的原始 /kernel/msm-4.9/arch/arm/configs/vendor/_defconfig?

它是自动完成的:)

也就是说,构建系统(bitbake)会自动检测SRC_URI内容中扩展名为.patch的文件,将这些文件从meta-layer目录复制到build/tmp/work/...下的某个构建目录,并自动在源代码上应用了数千个补丁(源目录由配方中的S 变量定义)。

但是您的问题中还有一些关于其他内容的建议。这里有些概念,如果无聊,直接跳到正确的方式是甚至快速的方式下面))

Yocto 背后的主要理念之一是可重现和可扩展的构建。这意味着,所有元数据都被分成不同的存储库(即layers),由不同的团队维护。基本上,团队无权访问彼此的存储库,也没有人有权访问某些外部项目(在您的情况下为kernel)源代码。当然,可以创建git-forks 这一切,但这比编写元数据要复杂得多。这就是创建 Yocto 的原因 - 获取外部元数据(例如,poky 层)、源代码(“内核”)并仅通过编写一个元数据(您自己的层)使其工作,没有任何 git-forks .

因此,将您的补丁和 .bbappend 添加到 poky 层没有任何意义,因为您将无法提交 poky 层并将其分发给您的客户 - poky 层不属于您)但是,您可以创建git-fork,但这会使分发过程复杂化。

这就是为什么正确的方法是

  • 创建您自己的BSP-layer
  • 在您的图层中创建.bbappend
  • 在你的层中给内核添加补丁(其实正确的方法是use .scc files,打补丁也行)

这将使您的构建

  • 可重现 - 重新运行内核编译,甚至是使用 BSP 层的 Yocto 新克隆,都能够生成相同的内核
  • 可分发(可扩展) - 客户只需要您的 BSP 层,其他 Yocto 的东西可以在 Internet 上找到

最后,快速方式。如果您不需要所有这些可复制和可扩展,而只是为您的家庭项目构建一些东西并将 Yocto 发送到垃圾箱,请像这样破解构建:

  1. 清理你拥有的所有内核内容bitbake -c cleansstate virtual/kernel
  2. 获取内核源代码(克隆和补丁)bitbake -c patch virtual/kernel
  3. 在内核源代码中手动处理您需要的所有内容,这些源代码可以在 <TOPDIR>/build/tmp/work/<machine-name>-poky-linux-gnueabi/linux-yocto/<version>/git 之类的工作内容中找到
  4. 构建内核bitbake -c package virtual/kernel(克隆和修补将被跳过,因为 bitbake 记得此任务已完成;内核构建工件不会被删除,因为任务 rm_workpackage 之后进行,而内核内容实际上是从未删除)

但是在这种情况下,如果这个内核的东西被删除,或者以某种方式中断,你将不得不再次遍历这个算法(记住 - 不可重现)。

要轻松手动重建内核(不是通过 bitbake),您可以运行脚本 <TOPDIR>/build/tmp/work/<machine-name>-poky-linux-gnueabi/linux-yocto/<version>/temp/run.do_compile

【讨论】:

  • 感谢您的详细回复。当我查找关于不在 poky 下创建元层时,我正在中途,但我在描述中链接的示例确实在 poky 中创建了一个层。如果不是 poky,应该在哪里创建元层?在我的例子中,meta-bsp 层位于 poky
  • hm...也许我误解了你,对不起)here 据说创建你自己的层。如果您经历了这一点,那么一切都按照指南进行。
  • 是的,对不起,我有一个更自定义的 Yocto 工作目录(在你的情况下它命名为 poky,在我的情况下目录树看起来是另一种方式),所以我误解了你。看起来你做对了!))你的meta-bsp 必须是你的目录和你的自定义层。另外根据您的链接,您可能使用的是旧版本(2.2.1)。 Yocto 的最新版本是 3.2.1,check it out
  • hm,所以我们仍在修改原始文件,然后为 bbappend 文件创建/添加补丁,告诉 Yocto 包含我们的更改。我在想这个想法更像是创建一个新文件(原始文件的副本)并对其进行修改,这样我们就可以随时回到旧版本,不是吗?
  • 或者我可能错过了补丁的概念。您可以只修改原始文件,然后重建图像,而无需创建补丁和 yocto 文档中提到的所有好东西......
猜你喜欢
  • 2016-08-04
  • 2021-11-26
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 2020-03-16
  • 2015-08-25
相关资源
最近更新 更多