2常见任务
目录
本章介绍了使用 Yocto Project Linux 内核时执行的几个常见任务。这些任务包括为内核开发准备主机开发系统、准备层、修改现有配方、修补内核、配置内核、迭代开发、使用您自己的源代码以及合并树外模块。
注意
本章中提供的示例适用于 Yocto Project 2.4 Release 及更高版本。
2.1准备构建主机以在内核上工作
在您进行任何内核开发之前,您需要确保您的构建主机已设置为使用 Yocto 项目。有关如何设置的信息,请参阅Yocto 项目开发任务手册中的“设置以使用 Yocto 项目”部分。准备系统的一部分是在您的系统上创建源目录( poky
)的本地 Git 存储库 。按照Yocto 项目开发任务手册中“克隆 poky 存储库”部分中的步骤设置源目录。
注意
确保您签出适当的开发分支或通过签出特定标签来创建本地分支以获得所需的 Yocto 项目版本。有关更多信息,请参阅Yocto 项目开发任务手册中的“在 Poky 中通过分支签出”和“在 Poky 中通过标签签出”部分。
内核开发最好使用devtool来完成, 而不是通过传统的内核工作流方法。本节的其余部分提供了这两种情况的信息。
2.1.1准备开发使用devtool
按照以下步骤准备使用 devtool
. 完成此过程后,您将获得一个干净的内核映像,并准备好进行修改,如“使用 devtool 修补内核”部分所述:
-
初始化 BitBake 环境:在构建可扩展 SDK 之前,您需要通过获取构建环境脚本(即oe-init-build-env)来初始化 BitBake 构建环境:
$ cd poky $ source oe-init-build-env
注意
前面的命令假设 Yocto 项目源存储库 (即
poky
)已使用 Git 克隆,并且本地存储库名为“poky”。 -
准备您的 local.conf 文件:默认情况下, MACHINE变量设置为“qemux86-64”,如果您在 64 位模式下为 QEMU 模拟器构建,这很好。但是,如果不是,则需要在构建目录(即 在本例中)中找到的文件中 适当地设置 MACHINE变量。
conf/local.conf
poky/build
此外,由于您正准备处理内核映像,因此需要设置 MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS 变量以包含内核模块。
在这个例子中,我们希望为 qemux86 构建,所以我们必须将MACHINE变量设置 为“qemux86”并添加“kernel-modules”。如上所述,我们通过附加到
conf/local.conf
:MACHINE = "qemux86" MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules"
-
为补丁创建一个层:您需要创建一个层来保存为内核映像创建的补丁。您可以使用以下 命令:
bitbake-layers create-layer
$ cd poky/build $ bitbake-layers create-layer ../../meta-mylayer NOTE: Starting bitbake server... Add your new layer with 'bitbake-layers add-layer ../../meta-mylayer' $
注意
有关使用公共层和 BSP 层的背景信息,请分别参见Yocto 项目开发任务手册中的“理解和创建层”部分和Yocto 项目板支持 (BSP) 开发人员指南中的“ BSP 层”部分。有关如何使用命令快速设置图层的信息,请参阅Yocto 项目开发任务手册中的“使用 bitbake-layers 脚本创建通用图层”部分。
bitbake-layers create-layer
-
通知 BitBake 构建环境关于您的层:按照您创建层时的指示,您需要将层添加到文件中的 BBLAYERS变量中
bblayers.conf
,如下所示:$ cd poky/build $ bitbake-layers add-layer ../../meta-mylayer NOTE: Starting bitbake server... $
-
构建可扩展 SDK:使用 BitBake 构建可扩展 SDK,专门用于使用 QEMU 运行的图像:
$ cd poky/build $ bitbake core-image-minimal -c populate_sdk_ext
构建完成后,您可以
*.sh
在以下目录中找到 SDK 安装程序文件(即 文件):poky/build/tmp/deploy/sdk
对于此示例,安装程序文件名为
poky-glibc-x86_64-core-image-minimal-i586-toolchain-ext-3.3.2.sh
. -
安装可扩展 SDK:使用以下命令安装 SDK。对于本示例,将 SDK 安装在默认
poky_sdk
目录中:$ cd poky/build/tmp/deploy/sdk $ ./poky-glibc-x86_64-core-image-minimal-i586-toolchain-ext-3.3.2.sh Poky (Yocto Project Reference Distro) Extensible SDK installer version 3.3.2 ============================================================================ Enter target directory for SDK (default: poky_sdk): You are about to install the SDK to "/home/scottrif/poky_sdk". Proceed [Y/n]? Y Extracting SDK......................................done Setting it up... Extracting buildtools... Preparing build system... Parsing recipes: 100% |#################################################################| Time: 0:00:52 Initializing tasks: 100% |############## ###############################################| Time: 0:00:04 Checking sstate mirror object availability: 100% |######################################| Time: 0:00:00 Parsing recipes: 100% |#################################################################| Time: 0:00:33 Initializing tasks: 100% |##############################################################| Time: 0:00:00 done SDK has been successfully set up and is ready to be used. Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g. $ . /home/scottrif/poky_sdk/environment-setup-i586-poky-linux
-
设置新终端以使用可扩展 SDK:您必须设置新终端以使用 SDK。您不能使用用于构建安装程序的同一个 BitBake shell。
打开新 shell 后,按照安装 SDK 输出的指示运行 SDK 环境设置脚本:
$ source poky_sdk/environment-setup-i586-poky-linux "SDK environment now set up; additionally you may now run devtool to perform development tasks. Run devtool --help for further details.
注意
如果您收到有关尝试在设置为运行 BitBake 的环境中使用可扩展 SDK 的警告,则您没有使用新的 shell。
-
构建干净的镜像:准备在内核上工作的最后一步是
devtool
在您刚刚为 SDK 工作设置和初始化的新终端中使用构建初始镜像:$ devtool build-image Parsing recipes: 100% |##########################################| Time: 0:00:05 Parsing of 830 .bb files complete (0 cached, 830 parsed). 1299 targets, 47 skipped, 0 masked, 0 errors. WARNING: No packages to add, building image core-image-minimal unmodified Loading cache: 100% |############################################| Time: 0:00:00 Loaded 1299 entries from dependency cache. NOTE: Resolving any missing task queue dependencies Initializing tasks: 100% |#######################################| Time: 0:00:07 Checking sstate mirror object availability: 100% |###############| Time: 0:00:00 NOTE: Executing SetScene Tasks NOTE: Executing RunQueue Tasks NOTE: Tasks Summary: Attempted 2866 tasks of which 2604 didn't need to be rerun and all succeeded. NOTE: Successfully built core-image-minimal. You can find output files in /home/scottrif/poky_sdk/tmp/deploy/images/qemux86
如果您是为实际硬件而不是为仿真而构建,您可以将映像刷入 U 盘
/dev/sdd
并启动您的设备。有关使用 Minnowboard 的示例,请参阅 TipsAndTricks / KernelDevelopmentWithEsdk Wiki 页面。
此时,您已设置好开始使用可扩展 SDK 修改内核。有关继续的示例,请参阅“使用 devtool 修补内核”部分。
2.1.2为传统内核开发做好准备
使用 Yocto 项目为传统内核开发做好准备涉及许多与上一节中描述的相同的步骤。但是,您需要建立内核源代码的本地副本,因为您将编辑这些文件。
按照以下步骤准备使用 Yocto 项目的传统内核开发流程更新内核映像。完成此过程后,您就可以按照“使用传统内核开发修补内核”部分中的说明对内核源代码进行修改:
-
初始化 BitBake 环境:在使用 BitBake 执行任何操作之前,您需要通过获取构建环境脚本(即oe-init-build-env)来初始化 BitBake 构建环境 。此外,对于此示例,请确保您签出的本地分支
poky
是 Yocto Project Hardknott 分支。如果您需要检出 Hardknott 分支,请参阅Yocto 项目开发任务手册中的“通过Poky 中的分支检出”部分。$ cd poky $ git branch master * hardknott $ source oe-init-build-env
注意
前面的命令假设 Yocto 项目源存储库 (即
poky
)已使用 Git 克隆,并且本地存储库名为“poky”。 -
准备您的 local.conf 文件:默认情况下, MACHINE变量设置为“qemux86-64”,如果您在 64 位模式下为 QEMU 模拟器构建,这很好。但是,如果不是,则需要在构建目录(即 在本例中)中找到的文件中 适当地设置 MACHINE变量。
conf/local.conf
poky/build
此外,由于您正准备处理内核映像,因此需要设置 MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS 变量以包含内核模块。
在这个例子中,我们希望为 qemux86 构建,所以我们必须将MACHINE变量设置 为“qemux86”并添加“kernel-modules”。如上所述,我们通过附加到
conf/local.conf
:MACHINE = "qemux86" MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules"
-
为补丁创建一个层:您需要创建一个层来保存为内核映像创建的补丁。您可以使用以下 命令:
bitbake-layers create-layer
$ cd poky/build $ bitbake-layers create-layer ../../meta-mylayer NOTE: Starting bitbake server... Add your new layer with 'bitbake-layers add-layer ../../meta-mylayer'
注意
有关使用公共层和 BSP 层的背景信息,请分别参见Yocto 项目开发任务手册中的“理解和创建层”部分和Yocto 项目板支持 (BSP) 开发人员指南中的“ BSP 层”部分。有关如何使用命令快速设置图层的信息,请参阅Yocto 项目开发任务手册中的“使用 bitbake-layers 脚本创建通用图层”部分。
bitbake-layers create-layer
-
通知 BitBake 构建环境关于您的层:按照您创建层时的指示,您需要将层添加到文件中的 BBLAYERS变量中
bblayers.conf
,如下所示:$ cd poky/build $ bitbake-layers add-layer ../../meta-mylayer NOTE: Starting bitbake server ... $
-
创建内核 Git 存储库的本地副本:您可以在位于https://git.yoctoproject.org/cgit/cgit.cgi/的 Yocto 项目源存储库中的“Yocto Linux 内核”下找到受支持的 Yocto 项目内核的 Git 存储库 .
为简单起见,建议您在Source Directory之外创建内核 Git 存储库的副本, 通常名为
poky
. 另外,请确保您在standard/base
分支中。以下命令显示了如何创建
linux-yocto-4.12
内核的本地副本 并位于standard/base
分支中。注意
该
linux-yocto-4.12
内核可用于 Yocto Project 2.4 版本及以后版本。您不能linux-yocto-4.12
在 Yocto Project 2.4 之前的版本中使用内核。$ cd ~ $ git clone git://git.yoctoproject.org/linux-yocto-4.12 --branch standard/base Cloning into 'linux-yocto-4.12'... remote: Counting objects: 6097195, done. remote: Compressing objects: 100% (901026/901026), done. remote: Total 6097195 (delta 5152604), reused 6096847 (delta 5152256) Receiving objects: 100% (6097195/6097195), 1.24 GiB | 7.81 MiB/s, done. Resolving deltas: 100% (5152604/5152604), done. Checking connectivity... done. Checking out files: 100% (59846/59846), done.
-
创建内核缓存 Git 存储库的本地副本:为简单起见,建议您在源目录之外创建内核缓存 Git 存储库的副本, 通常名为
poky
. 此外,对于此示例,请确保您在yocto-4.12
分支中。以下命令显示了如何创建 的本地副本
yocto-kernel-cache
并切换到yocto-4.12
分支:$ cd ~ $ git clone git://git.yoctoproject.org/yocto-kernel-cache --branch yocto-4.12 Cloning into 'yocto-kernel-cache'... remote: Counting objects: 22639, done. remote: Compressing objects: 100% (9761/9761), done. remote: Total 22639 (delta 12400), reused 22586 (delta 12347) Receiving objects: 100% (22639/22639), 22.34 MiB | 6.27 MiB/s, done. Resolving deltas: 100% (12400/12400), done. Checking connectivity... done.
此时,您已准备好开始使用传统的内核开发步骤对内核进行修改。有关继续的示例,请参阅“使用传统内核开发来修补内核”部分。
2.2创建和准备图层
如果您要修改内核配方,建议您创建并准备您自己的层来完成您的工作。您的层包含自己的BitBake 附加文件 ( .bbappend
),并提供了一种方便的机制来创建您自己的配方文件 ( .bb
) 以及存储和使用内核补丁文件。有关使用图层的背景信息,请参阅Yocto 项目开发任务手册中的“理解和创建图层”部分。
注意
Yocto 项目附带了许多工具,可以简化您需要执行的任务。 命令就是这样一种工具,它可以简化创建新图层的过程。有关如何使用此脚本快速设置新层的信息,请参阅Yocto 项目开发任务手册中的“使用 bitbake-layers 脚本创建通用层”部分。bitbake-layers create-layer
为了更好地理解您为内核开发创建的层,以下部分将介绍如何在不借助工具的情况下创建层。这些步骤假设创建了一个mylayer
在您的主目录中命名的层:
-
创建结构:创建层的结构:
$ mkdir meta-mylayer $ mkdir meta-mylayer/conf $ mkdir meta-mylayer/recipes-kernel $ mkdir meta-mylayer/recipes-kernel/linux $ mkdir meta-mylayer/recipes-kernel/linux/linux-yocto
该
conf
目录保存您的配置文件,而该recipes-kernel
目录保存您的附加文件和最终补丁文件。 -
创建图层配置文件:移动到
meta-mylayer/conf
目录并创建layer.conf
文件,如下所示:# We have a conf and classes directory, add to BBPATH BBPATH .= ":${LAYERDIR}" # We have recipes-* directories, add to BBFILES BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ ${LAYERDIR}/recipes-*/*/*.bbappend" BBFILE_COLLECTIONS += "mylayer" BBFILE_PATTERN_mylayer = "^${LAYERDIR}/" BBFILE_PRIORITY_mylayer = "5"
请注意
mylayer
作为最后三个陈述的一部分。 -
创建内核配方附加文件:移动到
meta-mylayer/recipes-kernel/linux
目录并创建内核的附加文件。本示例使用linux-yocto-4.12
内核。因此,附加文件的名称是linux-yocto_4.12.bbappend
:FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" SRC_URI:append = " file://patch-file-one.patch" SRC_URI:append = " file://patch-file-two.patch" SRC_URI:append = " file://patch-file-three.patch"
该FILESEXTRAPATHS和SRC_URI语句使OpenEmbedded构建系统查找补丁文件。有关使用附加文件的更多信息,请参阅Yocto 项目开发任务手册中的“将其他层元数据与您的层一起附加”部分。
2.3修改现有配方
在许多情况下,您可以自定义现有的 linux-yocto 配方以满足您的项目需求。Yocto 项目的每个版本都提供了一些 Linux 内核配方供您选择。这些位于源目录中 meta/recipes-kernel/linux
。
修改现有配方可以包括以下内容: