Yocto Project 是一个针对嵌入式应用,由全球各地开发人员共同开发、维护的开源软件合作项目。该项目提供模板、工具和方法,帮你创建定制的 Linux 系统和嵌入式产品,而无需关心硬件体系,适合嵌入式Linux开发人员使用,极大地简化了开发过程,因为你不用从头裁剪一个包含很多你并不需要的软件的完整的 Linux 发布版本。
Yocto Project 起源于一群年轻人想给他们自己的 PDA 编写一个操作系统,当时没有一家公司给 PDA 编写操作系统,于是这些人便想自己写一个。他们采用了 Linux Gentoo 桌面的几个工具,尤其是采用了编译工具 bitbake。刚开始 bitbake 和元数据是打包在一起的,但几年后 bitbake 从元数据中分离出来,形成了现在的 OpenEmbedded。当时有些公司采用了 OpenEmbedded 作为他们的工具,但大多数的嵌入式系统厂商依然采用自己的工具和流程来裁剪 Linux。
到了2010年,由于看到大多数公司花费大量的人力和财力干相同的事情,Wind River Systems 和 Intel 开源技术中心牵头成立了一个开源项目,旨在开发一套标准的构建工具,这套工具采用了 OpenEmbedded 的几个关键组件,任何人都可以使用,任何人都可以贡献。这个项目不以盈利为目的,而是保持开放和中立,为需要他们的社区提供工具和支持,因此这个项目开始与 Linux 基金会合作,由此诞生了 Yocto Project。
如今,Yocto Project 已经成为嵌入式 Linux 系统创建的标准方式,有18个组织和社区成员,这包括了数十家公司、数百名贡献者,以及超过140个国家的开发人员。这是世界上最大的合作开源软件项目之一。
由于采用了 OpenEmbedded 的几个关键组件,Yocto Project 兼容 OpenEmbedded 项目,你可以简单、可靠地进行编译和开发,完全支持通过 QEMU 模拟器的硬件和设备仿真。通过 Yocto 项目开发出来的 Image 可以在 QEMU模拟器中进行引导。
通过上面的介绍,我们已经对 Yocto 有了大致的认识。下面我们就来体验一下吧,通过在我的 Ubuntu 16.04.03 虚拟机上使用 bitbake 构建一个最小化的 Linux 发行版,并在 QEMU 模拟器中引导起来,让大家进一步加深对 Yocto 的了解。
注意:构建过程中会下载并编译大量文件,建议预留足够的资源(比如内存4GB以上,硬盘空间60GB以上)。
好了,开始之前先执行一下 $ sudo apt-get update
吧。
然后,安装各种依赖工具:
$ sudo apt-get install wget git-core unzip \
make gcc g++ build-essential \
subversion sed autoconf automake \
texi2html texinfo coreutils diffstat \
python-pysqlite2 docbook-utils libsdl1.2-dev \
libxml-parser-perl libgl1-mesa-dev libglu1-mesa-dev \
xsltproc desktop-file-utils chrpath \
groff libtool xterm gawk fop
接着,我们到 Yocto Project 官网看看,发现如下信息:
接下来,我们以克隆 poky 的 morty 稳定分支为例进行讲解。
$ git clone -b morty git://git.yoctoproject.org/poky.git
下载完之后进入 poky 目录,然后执行下面的命令,为 Yocto 开发环境设置(设置/导出)一些环境变量。
$ source oe-init-build-env
在执行完 open embedded (oe) 的构建环境脚本之后,会发现终端里的路径被自动切换到 build 目录了,这样方便进行之后行发行版的的配置和构建。
从上图中的提示信息可以看到,第一次执行 source oe-init-build-env
的时候会在 conf 目录下创建 local.conf 和 bblayers.conf 文件。其中,文件 local.conf 是 Yocto 用来设置目标机器细节和 SDK 的目标架构的配置文件。
下面我们对 local.conf 进行配置。
如下所示,因为我的 Ubuntu 16.04 虚拟机是 64 bit 的,所以这里设置的目标机器是 qemux86-64。
在 local.conf 文件中取消下面参数的注释符号。
DL_DIR ?= "${TOPDIR}/downloads"
SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
TMPDIR ?= "${TOPDIR}/tmp"
PACKAGE_CLASSES ?= "package_rpm"
SDKMACHINE ?= "i686"
在 local.conf 中为基于 Yocto 的 Linux 设置空密码和后续的一些参数,否则的话用户就不能登录进新的发行版。
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
我们并不准备使用任何图形化工具来创建 Linux OS,比如 toaster (hob 已经不再支持了)。
当我们设置好 Yocto 开发环境,就可以执行下面的 bitbake 工具命令,开始为选定的目标机器下载和编译软件包。
$ bitbake core-image-minimal
注意:该命令需要在普通 Linux 用户下执行,如果是使用 root 用户,则可能会产生错误。
从上图中的提示信息可以看到,构建脚本组件的第一步工作是解析配置(recipe);中间展示的是当前目标系统的配置信息;当看到下方的“succeeded”就表示下载、编译成功。
我这个图是编译完之后重新执行 bitbake core-image-minimal
命令得到的。实际上,虽然是最小化的 Linux 系统,但因为需要下载一些 SDK 和必要的库,并编译相应的软件包,所以耗时较长,大概需要 2-3 小时。
下面是下载、编译软件包的过程中的一些截图。
仔细观察,可以发现整个构建脚本的解析过程,以及构建你的新的基于 yocto 的发行版的构建系统的细节。
因为我们这里的目标机器类型是 qemux86-64,因此,编译好的新镜像将位于 build/tmp/deploy/images/qemux86-64 目录下。
编译好镜像之后,我们就可以执行 $ runqemu qemux86-64
,通过 QEMU 模拟器来引导系统了。
此时,运行新的基于 Yocto 的 Linux 发行版的 QEMU 会打开一个新屏幕。
输入 root 用户名即可登录进这个新的 Linux 发行版。登录系统之后,我们可以执行一些常用的命令查看系统的状态和信息。
可以看到 Yocto 的版本是 2.2.2,Linux 内核版本是 4.8.25,可以确定的确就是 Yocto 的 morty 分支啦。
好了,本文通过对 Yocto Project 的介绍,以及在 Ubuntu 上利用 Yocto 来构建了一个最小化的 Linux 发行版。相信通过这样的体验,各位读者朋友已经对 Yocto 有了一定的了解,后续我也会整理更多相关文章,敬请期待,谢谢~