简介

Yocto将构建嵌入式Linux操作系统中需要用到的软件源代码的下载、打补丁、配置、编译、打包和安装以Python或Shell脚本的方式描述出来,保存在以后缀为.bb的文件中,然后使用一个叫bitbake的工具来解析执行。bitbake从上游软件源将代码抓取下来,使用描述编译规则的文件,来生成内核的image、根文件系统和SDK。这样的规则可以重利用,因此极大地提高了嵌入式Linux开发者的开发效率。

Yocto的核心是一个基于OpenEmbeddedd开放源代码的构建系统,它通过提供模版、工具和方法帮助开发者快速创建基于Linux内核的定制系统,支持ARM、PPC、MIPS和x86硬件体系结构。除了可以订制嵌入式Linux操作系统发行版,还可以很容易地产生针对该嵌入式Linux操作系统的交叉编译工具链和SDK,同时还有软件开发工具集,可以生成想要的格式,如:deb、rpm、ipk等。


开发环境搭建

a. ubuntu14.04安装如下包
​​​$sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm​

b. 获取Yocto构建系统
​​​git clone git://git.yoctoproject/poky​​​
然后切换到当前最新的分支jethro上
​​​git checkout jethro​​​
这样就得到了Yocto整个构建系统的所有工具、关键的配置文件和核心的元数据

c. 开始构建系统
接下来创建一个可以在arm926ejs的CPU上运行的嵌入式Linux操作系统发行版,还有一整套交叉编译工具链,并且让该操作系统运行在QEMU虚拟机上。
c(1). 初始化构建系统的环境
poky是一个包含构建系统、核心脚本文件和构建工具的一个集合。因此进入poky目录并运行如下脚本:​​​source oe-init-build-env​​​该脚本会创建一个构建目录,默认放在poky里面,也可以自己指定构建目录,运行如下命令:​​source oe-init-build-env you_path​​​构建目录包含构建期间生成的所有文件。
c(2). 修改本地配置文件
在运行oe-init-build-env脚本后,会在构建目录下生成conf目录,conf目录就是包含本次构建的所有重要配置文件。在conf目录下有一个local.conf的配置文件,该文件包含了要构建的系统的一些基本设置。
如果不改变任何配置文件就开始编译,默认的构建的目标机器是qemux86,生成的可运行的镜像文件是基于32位的x86架构,可以运行在QEMU虚拟机上。对于本次编译来说,要生成基于arm926ejs,可在QEMU虚拟机上运行的镜像文件,修改local.conf文件中的MACHINE变量:​​​MACHINE?=qemuarm​​​
既然要做一个嵌入式Linux发行版,不是仅仅跑起来那么简单,作为一个成熟的嵌入式Linux操作系统,必须要有对应的包管理工具,默认使用RPM,可以通过修改变量PACKAGE_CLASSES来改变:​​​PACKAGE_CLASSES=“package_deb”​​​
当然还可以选择ipk、tar等方式。
c(3). bitbake介绍
bitbake是一个功能上与make类似的给嵌入式Linux操作系统生成可运行镜像文件和软件包的自动化构建工具,该工具受到了Gentoo Linux操作系统包管理工具Portage的启发,使用Python实现。
bitbake操作的文件叫bitbake recipe,以后缀.bb结尾或者以.bbappend结尾,该文件描述了一个软件包去哪下载、如何配置、如何编译、软件包的依赖、安装到哪里、如何删除等过程。
bitbake的recipe文件可以解析多种软件包来源路径,包括:http、https、ftp、cvs、svn、git和本地文件系统。在构建的过程中,recipe文件用来跟踪软件依赖、执行本地和交叉编译,并且完成后将编译完的软件进行打包,可以在本地和目标设备上安装。
接下来使用bitbake生成一个包含根文件系统的嵌入式Linux镜像文件,bitbake框架首先生成一个针对目标平台的交叉变异工具链。
c(4). 构建嵌入式Linux操作系统
在Yocto中,针对不同的设备有相应的recipe文件,根据recipe文件的描述,可以生成大小不同的操作系统,有可以仅仅让设备跑起来实时响应的操作系统、带界面的操作系统等。接下来生成一个尺寸很小,刚好可以让设备跑起来的操作系统:​​​core-image-minimal​​​
在c(1)节搭建好的环境中运行:​​​source oe-init-build-env you_path​​​会生成you_path目录,这就是开发目录,在该目录下运行如下命令:​​bitbake core-image-minimal​

开始执行后,bitbake会根据当前的CPU型号生成一个交叉编译工具链,也就是生成一个可以在宿主机上运行的,能够编译出在目标板子上运行的程序的工具链,这样极大地简化了嵌入式开发者的工作,不需要自己手动修改代码来配置交叉编译工具链,仅仅通过配置就可以生成各种CPU型号的交叉编译工具链。使用该工具链编译各种在arm926ejs上可以运行的程序,包括Linux内核。

这是一个比较漫长的过程,因为针对每一个软件包都要下载、解压、配置、编译。通常bitbake会根据当前主机的CPU核心数量设置相应的线程来进行多线程编译。为了提高效率,同时防止在下载的过程中出现下载包失败的问题,通常可以提前下载好包,放在指定的目录下,然后在build目录中的local.conf文件中指定变量DL_DIR为上述指定的目录,这样bitbake构建系统就会去指定目录读取软件包,极大地提高了效率。

编译完成后,Linux内核的可执行镜像文件和根文件系统位于构建目录中的tmp/deploy/image/ 下

运行生成的嵌入式Linux操作系统,使用如下命令:​​runqemu qemuarm slirp nographic​​​
runqemu是一个启动QEMU虚拟机的脚本,qemuarm是运行的机器,slirp 是一种不需要root权限的网络访问方式。runqemu脚本自动启动QEMU虚拟机,并且加载生成的内核和根文件系统


参考文章

  1. ​基于Yocto订制嵌入式Linux发行版​
  2. ​如何在 Ubuntu 上用 Yocto 创建你自己的嵌入式 Linux 发行版​