iMX6Ull采用Yocto构建嵌入式Linux系统之Yocto系统组成 下

在前面章节中,主要是通过Freescale官方提供的示例,基于Freescale官方的imx6ull14x14evk硬件平台体验了Yocto构建嵌入式Linux发行版的过程,同时也验证了本地Yocto开发环境搭建的正确性。但实际开发过程中,往往需要根据产品需求定制不同的硬件平台和软件需求,因此,开发者需要通过配置Yocto,定制适合自己产品的嵌入式Linux发行版。在配置Yocto之前,需要对Yocto的开发环境有个系统性的了解。

Yocto系统组成

从Yocto系统框图中可以看出,Yocto主要由以下几部分组成:

  • User Configuration:用户配置信息,用于控制构建过程中使用到的Metadata。

  • Metadata Layers:Metadata Layers中包含许多Recipes,用于设置需要使用哪些软件包、源码,以及这些软件包、源码的配置、编译、安装方式。

  • Source Files:构建系统所使用到的软件包、源码,这些软件包、源码有多种获取途径。

  • Build System:主要指BitBake获取源码、打补丁、编译、安装、生成目标文件的过程。

  • Images:构建嵌入式Linux系统生成的目标文件,用于最终的嵌入式Linux系统。

  • Application Development SDK:Yocto还可以用于构建交叉编译工具。

User Configuration

User Configuration主要是定义了BitBake在构建过程中所使用到的一些变量值。这些变量值定义了使用哪些Metadata、下载的文件存放地址以及一些其他的属性。通过repo从Freescale获取到Yocto源码中,提供了imx-setup-release.sh和setup-environment两个脚本。在使用BitBake构建系统前,需要先运行imx-setup-release.sh初始化Yocto构建目录,同时,会自动生成build文件夹及build/conf文件夹,在conf文件夹下的bblayers.conf、local.conf文件就是User Configuration。

build/conf路径下的bblayers.conf和local.conf两个文件都是有imx-setup-release.sh脚本生成的。BitBake在构建系统时会使用到这两个文件中的变量,但是,如果需要更改配置,是通过imx-setup-release.sh脚本中修改,不建议直接修改这两个文件。

bblayers.conf

运行imx-setup-release.sh脚本创建Yocto构建系统工作环境后,会在build/conf路径下生成bblayers.conf文件,bblayers.conf文件确定了BitBake将使用哪些Metadata(layers)构建系统,主要由变量BBLAYERS确定。例如,在imx-setup-release.sh脚本中有如下定义:

在imx-setup-release.sh脚本中通过echo命令修改了bblayers.conf文件中BBYLAYERS变量,相应的,在bblayers.conf文件中,BBYLAYERS变量值如下:

最终,BitBake在编译系统时,根据BBLAYERS变量的值,确定哪些metadata参与系统编译。如:

local.conf

local.conf提供了一些基本的变量,定义了构建环境,如:MACHINE、DISTRO、DL_DIR等,这些变量也是通过imx-setup-release.sh脚本确定的,例如:

  • MACHINE:目标平台选取,例如:imx6ull14x14evk。

  • DISTRO:基于目标平台确定的嵌入式Linux发行版本。

  • PACKAGE_CLASSES:定义生成的目标文件格式类型,例如:PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk package_tar" 等。

  • BB_DISKMON_DIRS:该变量定义了工作路径下各文件夹的大小。

  • DL_DIR:定义了下载文件的存放路径。BitBake在构建系统过程中,需要下载各种软件源码、工具软件等,这些下载的软件或者软件源码就存放在DL_DIR变量定义的路径下,例如:DL_DIR ?= "${BSPDIR}/downloads/"所对应的就是/Linux/Yocto/fsl-release-yocto/downloads,如果使用BitBake命令构建过程嵌入式Linux系统,则在该文件夹下有如下已经下载好的文件:

Metadata

Metadata,元数据,是BitBake构建嵌入式Linux系统过程中所使用的最基础的数据。Metadata一定程度上来说就是指的Layers,两个概念在一定的场景下表示的是同一个含义。在build/conf/bblayers.conf文件中定义了所使用的Layers,对应的就是使用Metadata下的文件。Metadata具体表现为一个个以meta-xxx的文件夹,位于在sources目录下:

在meta-xxx文件夹下主要有三种类型的文件夹:classes、conf和recipes。这三个文件夹下分别存储不同的文件:

  • classes:classes文件夹下主要存放的是.bbclass文件,.bbclass文件保存了通用的函数或变量,使其能够在其他recipes中通过inerit关键字引用。

  • conf:conf文件夹下主要存放layer.conf、conf/distro/distro.conf以及distro.conf中包含的inc文件。这些文件主要用于定义当前layer的一些基本信息。如:使用哪些.bb文件等。

  • recipes:meta-xxx文件夹下有许多的recipes文件夹,recipes文件夹下主要存放.bb、.bbapped文件,.bb、.bbapped主要定义了构建系统所使用到的软件包、源代码、补丁文件以及这些软件包、源代码的配置、编译、安装方法。

Sources

Yocto在构建系统image文件时,需要使用到一些第三方软件包或源码等,这些软件包或源码就叫做sources files,例如:bluez-5.37.tar.xz、connman-1.31.tar.xz等。通常sources files有三种来源:Upstream Project Release、Local Projects、SCMs。一般来说,对于参与系统构建过程中一些稳定发布版的第三方软件,通常采用压缩包(tarballs)的方式。对于需要在构建系统过程中不断修改调试的第三方酸碱,通常采用通过SCM(例如git)管理软件源码的方式,参与到系统构建过程中。 在每个recipe中存在一个SRC_URI变量,该变量定义了recipe所使用到的软件包或源码地址。BitBake就是通过SRC_URI所指向的地址获取相应的软件包或源码的。 需要注意的是,Yocto提供了DL_DIR变量,用于指定下载的source files存放地址,构建系统搜索source files时,BitBake首先搜索download路径下是否有相应的source files,如果没有,再在通过其他路径搜索。通过这种机制,可以减少了由于网络原因导致的构建时间过长。

  • Upstream project releases:

    其他项目软件包通常以存档文件的方式存在,例如:tarball、zip文件等。

  • Local Projects:

    本地提供的而一些软件包。

  • SCM(Source Control Manageers):通过Git等版本管理工具获取的软件包等。当采用SCM获取源码时,BitBake在构建系统过程中的do_fetch任务时,将根据recipe中定义的SRC_URI变量以及SRCREV变量,通过SCM工具克隆或Check Out源码参与构建系统。

Package Feeds

Yocto在构建系统过程中,会生成一些中间文件,存储在build/tmp路径下,如下图所示:

生成的中间文件类型是由build/local.conf文件中的PACKAGE_CLASSES变量确定的,如:ipk、rpm等。最终BitBake会将这些中间文件生成最终需要使用的image文件,其中,有几个文件夹下的内容是需要了解下的:

  • DEPLOY_DIR:指的是build/tmp/deploy,在该路径下存放最终生成的嵌入式Linux镜像文件。

BitBake

BitBake是构建系统的工具。BitBake根据用户的配置信息,自动的从不同的地方获取软件包或源文件,将其按照一定的规则构建出最终使用的Image文件(嵌入式Linux发行版)。BitBake的工作过程中,是以一个个task的形式存在的,主要包括:Source Fetching、Patching、Configuration andCompilation、Package Splitting、Image Generation、SDK Generation(可选)。

Source Fetching

BitBake工作的第一步就是获取源文件。BitBake会根据Recipe 中定义的SRC_URI找到相应的源文件,将其下载并解压。该过程主要在build/tmp/work目录下完成。

其中:

  • TMPDIR:构建系统过程中使用到的临时文件存放的地方,通常来说,就是build/tmp路径

  • PACKAGE_ARCH:构建系统所使用的架构,如:cortexa7hf-neon、x86_64等

  • TARGET_OS:目标操作系统,如:linux-gnueabi、linux等

  • PN:安装包名称

  • PV:安装包版本号

  • PR:安装包修正版本号

Patching

一旦获取并解压缩了源代码,BitBake就会定位补丁文件(如果有)并将它们应用到源文件中:

BitBake通过SRC_URI变量找到补丁文件(.patch或.diff)。BitBake按照查找补丁的顺序为单个Recipe查找并应用多个补丁。

Configuration and Compilation

修补源代码后,BitBake将执行配置和编译源代码的任务:

主要包括三个Tasks:

  • do _configure:不同的source code配置不同,BitBake会根据recipe中.bb或.bbappend文件中定义的配置方法进行配置。当然也支持使用autotools。

  • do_compile:配置完成后,就开始执行编译过程。

  • do_install:编译完成后,开始执行安装过程。将安装在image路径下。

这三个Task所对应的方法,在对应的Recipe中的.bb或.bbappend文件中都可以redifne。

Package Splitting

在配置并编译了源代码之后,OpenEmbedded构建系统将分析结果并将输出拆分为软件包。分析过程涉及以下各项:拆分出调试信息,查看包之间的共享库依赖关系,以及包之间的关系。do_packagedata任务根据分析结果创建软件包,以便OpenEmbedded可以生成最终软件包。

Image Generation

拆分软件包并将其存储在Package Feeds区域后,OpenEmbedded将使用BitBake生成根文件系统镜像。

Image文件生成过程包括多个阶段,并取决于多个任务和变量。do_rootfs任务创建Image文件所使用的根文件系统(文件和目录结构),do_rootfs任务使用几个关键变量来确定创建实际安装软件包列表:

  • IMAGE_INSTALL:列出要安装的基本程序包。

  • PACKAGE_EXCLUDE:指定不应安装的软件包。

  • IMAGE_FEATURES:指定要包含在image文件中的功能。 这些功能大多数都映射到其他软件包进行安装。

  • PACKAGE_CLASSES:指定要使用的软件包,并且确定软件包在Package Feeds中的位置。

  • IMAGE_LINGUAS:确定要安装的语言支持包。

  • PACKAGE_INSTALL:最终安装到Image文件中的软件包列表。

BitBake通过变量IMAGE_ROOTFS指向构造的根文件系统的位置,并根据PACKAGE_INSTALL变量指定的最终安装的软件包列表,从而创建最终的根文件系统。

在生成的根文件系统目录下,manifest文件(.manifest),列出了根文件系统中所安装的软件。

SDK Generation

OpenEmbedded构建系统使用BitBake生成两个软件开发工具包(SDK)安装程序脚本,包括标准的SDK和可扩展的SDK。可以通过生成的SDK安装脚本,安装相应的SDK。

Images

OpenEmbedded构建系统生成的image是可以在目标设备上启动的BootLoader、Linux Kernel、Device Tree、根文件系统:

生成的文件位于:build/tmp/deploy/images/machine/ 文件夹下。主要包含:

  • kernel-image:内核文件

  • root-filesystem-image:根文件系统文件

  • BootLoader:boot文件

Application Development SDK

构建系统的同时,还可以构建应用软件开发SDK。根据是否构建标准SDK(例如,bitbake -c populate_sdk)或可扩展的SDK(例如bitbake -c populate_sdk_ext映像名称),SDK生成过程会有所不同。

输出的形式是自解压SDK安装程序(* .sh)。当运行SDK安装程序(* .sh)时将安装该SDK。该SDK由交叉开发工具链,库、头文件以及一个SDK环境设置脚本组成。 运行此安装程序基本上可以进行设置交叉编译环境。 SDK对应的交叉编译环境主要运行在主机上,用于编译目标文件。 另一方面,库和头文件视为“目标”部分,是为目标硬件平台构建的,在目标硬件平台上运行时,需要将这些库和头文件拷贝至目前硬件平台的系统中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值