《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于Yocto订制嵌入式Linux发行版
基于Yocto订制嵌入式Linux发行版
2016年微型机与应用第14期
杜登科,胡爱兰,李林峰,张玉生
(华北计算机系统工程研究所,北京 100083)
摘要: 随着工业科技的发展,嵌入式Linux展现了巨大的价值,广泛应用于消费电子设备、网络设备和工控机领域。广泛的应用带来了各种各样的需求,各大厂商纷纷订制自己的嵌入式Linux产品,导致大量的重复工作,规范和标准差异化越来越大。在开放源代码的精英发起下,Yocto横空出世,以开源协作的方式逐步统一嵌入式Linux的订制和开发标准,避免许多重复工作,极大地简化了嵌入式Linux系统的订制,并且省掉大量的重复工作,使嵌入式Linux应用开发者可以将重心放在自己的工作上。
Abstract:
Key words :

  杜登科,胡爱兰,李林峰,张玉生

  (华北计算机系统工程研究所,北京 100083)

  摘要:随着工业科技的发展,嵌入式Linux展现了巨大的价值,广泛应用于消费电子设备、网络设备和工控机领域。广泛的应用带来了各种各样的需求,各大厂商纷纷订制自己的嵌入式Linux产品,导致大量的重复工作,规范和标准差异化越来越大。在开放源代码的精英发起下,Yocto横空出世,以开源协作的方式逐步统一嵌入式Linux的订制和开发标准,避免许多重复工作,极大地简化了嵌入式Linux系统的订制,并且省掉大量的重复工作,使嵌入式Linux应用开发者可以将重心放在自己的工作上。

  关键词:嵌入式;Linux;Yocto;开放源代码

0引言

  1991年芬兰大学生Linus发布了0.1版本的操作系统Linux,到1995年,Linux发布1.2版本,该版本开始支持Alpha、i386、MIPS和SPARC等架构,同时MIPS开始在低功耗设备中越来越流行[1]。1996年第一家专注于嵌入式Linux的公司Timesys成立,随后基于嵌入式Linux的公司和组织如雨后春笋般出现[2]。

  至今,基于Linux内核的操作系统广泛应用于消费电子、网络设备、工控控制、工业自动化、导航设备、宇宙飞船控制领域和医学设备领域[3]。

  由于没有统一的标准,嵌入式Linux开发差异越来越大,导致大量重复工作,给嵌入式Linux开发者带来极大不便。在Linux基金会的有识之士的领导下成立了Yocto项目,Yocto提供了工具、关键数据和方法来快速构建一个嵌入式Linux发行版操作系统,避免了大量的重复工作,这样嵌入式Linux开发者可以将更多的重心放在应用开发上,极大地提高了效率。

1国内外研究现状

  当前国内外开发一个嵌入式Linux操作系统的通用方式分为3步[4]:制作交叉编译工具链;移植uboot;配置并编译Linux内核[5],制作根文件系统。这样的开发流程对于嵌入式Linux开发者来说非常繁琐,会耗费开发人员大量的精力在与应用开发上无关的方面,而且架构一换,交叉编译工具链还得重新进行配置和编译。即使有的公司或者社区已经做好了相应的工作,也仅仅限制于他们的芯片和板子,嵌入式Linux开发者需要查阅大量的文档才能将已有的工作移植到他们的工作中,因此对于开发者十分不利。

  Yocto项目正是针对这种情况而诞生的,它将构建嵌入式Linux操作系统中需要用到的软件源代码的下载、打补丁、配置、编译、打包和安装以Python或Shell脚本的方式描述出来,保存在以后缀为.bb的文件中,然后使用一个叫bitbake的工具来解析执行。这样的规则可以重利用,因此极大地提高了嵌入式Linux开发者的开发效率。Yocto中提供了很多种类型的嵌入式Linux操作系统模版,涵盖了常见的操作系统类型,比如非常小的能启动设备的coreimageminimal,而且使用者可以很容易地对该操作系统进行订制,仅仅通过修改构建目录下的local.conf文件就可以轻松完成各种需求的订制。

2Yocto项目介绍

  Yocto的核心是一个基于OpenEmbeddedd开放源代码的构建系统,它通过提供模版、工具和方法帮助开发者快速创建基于Linux内核的定制系统,支持ARM、PPC、MIPS和x86硬件体系结构。这个构建系统可以创建针对用户环境的嵌入式Linux操作系统发行版。Yocto项目可以让用户订制不同大小的Linux镜像文件,从可以仅供启动设备的镜像到拥有各种各样功能的复杂的操作系统镜像文件。

  除了可以订制嵌入式Linux操作系统发行版,还可以很容易地产生针对该嵌入式Linux操作系统的交叉编译工具链和SDK,同时还有软件开发工具集,可以生成想要的格式,如:deb、rpm、ipk等。

001.jpg

  图1详细地描述了Yocto项目流程:从上游软件源将代码抓取下来,通过一个叫bitbake的构建系统,使用描述编译规则的文件,来生成内核的image、根文件系统和SDK。

3开发环境搭建

  3.1安装必要的软件包

  Ubuntu14.04下安装如下包:

  $sudo aptget install gawk wget gitcore diffstat unzip texinfo gccmultilib buildessential chrpath socat libsdl1.2dev xterm

  3.2获取Yocto构建系统

  $git clone git://git.yoctoproject/poky

  然后切换到当前最新的分支jethro上:

  $git checkout jethro

  这样就得到了Yocto整个构建系统的所有工具、关键的配置文件和核心的元数据。

4开始构建系统

  接下来创建一个可以在arm926ejs的CPU上运行的嵌入式Linux操作系统发行版,还有一整套交叉编译工具链,并且让该操作系统运行在QEMU虚拟机上。

  4.1初始化构建系统的环境

  poky是一个包含构建系统、核心脚本文件和构建工具的一个集合。因此进入poky目录并运行如下脚本:

  $cd poky

  $source oeinitbuildenv

  该脚本会创建一个构建目录,默认放在poky里面,也可以自己指定构建目录,运行如下命令:

  $source oeinitbuildenv you_path

  构建目录包含构建期间生成的所有文件。

  4.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等方式。

  4.3bitbake介绍

  bitbake是一个功能上与make类似的给嵌入式Linux操作系统生成可运行镜像文件和软件包的自动化构建工具,该工具受到了Gentoo Linux操作系统包管理工具Portage的启发,使用Python实现。

  bitbake操作的文件叫bitbake recipe,以后缀.bb结尾或者以.bbappend结尾,该文件描述了一个软件包去哪下载、如何配置、如何编译、软件包的依赖、安装到哪里、如何删除等过程。

  bitbake的recipe文件可以解析多种软件包来源路径,包括:http、https、ftp、cvs、svn、git和本地文件系统。在构建的过程中,recipe文件用来跟踪软件依赖、执行本地和交叉编译,并且完成后将编译完的软件进行打包,可以在本地和目标设备上安装。

  接下来使用bitbake生成一个包含根文件系统的嵌入式Linux镜像文件,bitbake框架首先生成一个针对目标平台的交叉变异工具链。

  4.4构建嵌入式Linux操作系统

  在Yocto中,针对不同的设备有相应的recipe文件,根据recipe文件的描述,可以生成大小不同的操作系统,有可以仅仅让设备跑起来实时响应的操作系统、带界面的操作系统等。接下来生成一个尺寸很小,刚好可以让设备跑起来的操作系统:

  coreimageminimal

  在4.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构建系统就会去指定目录读取软件包,极大地提高了效率。编译操作系统如图2所示。  

002.jpg

  开始编译后,需要花费较长时间,具体时间长短取决于当前宿主机的CPU核的数量和当前内存大小。

  4.5运行生成嵌入式Linux操作系统

  编译完成后,结果如图3所示。 

003.jpg

  编译完成后,Linux内核的可执行镜像文件和根文件系统位于构建目录中的tmp/deploy/image/ 下。运行生成的嵌入式Linux操作系统,使用如下命令:

  $runqemu qemuarm slirp nographic

  runqemu是一个启动QEMU虚拟机的脚本,qemuarm是运行的机器,slirp 是一种不需要root权限的网络访问方式。runqemu脚本自动启动QEMU虚拟机,并且加载生成的内核和根文件系统,终端启动界面如图4所示。 

004.jpg

  使用root用户名登录,默认不需要用户密码。

5结论

  通过使用Yocto构建系统,仅需指定目标板子的类型和非常简单的设置,就可轻松地完成嵌入式Linux操作系统的构建,相比于传统的嵌入式Linux开发流程,极大地提高了效率,使开发人员能够避免底层复杂的配置和移植,将重心更多地放在自己的应用开发上。

  Yocto项目可以订制操作系统的范围从非常小的传感器、智能手表到工控机,甚至复杂的服务器和大型机等,应用层面非常广泛,操作简单,仅使用Python和Shell脚本来描述操作系统的编译规则,极大地简化了开发工作。而且它可以订制基于多种架构的嵌入式Linux操作系统,由于从源代码到编译规则都是开源透明的,这对安全行来说十分重要,使开发人员对自己订制的操作系统百分百全面掌控。同时它减轻了嵌入式Linux开发人员的负担,使开发人员很容易地订制自己的操作系统,将更多的精力放在开发应用上。

  Yocto是Linux基金会官方推荐的嵌入式Linux开发项目,未来,必将有更多的开发者和公司开始使用Yocto构建系统。

参考文献

  [1] 刘庆.嵌入式Linux技术的发展[J]. 开放系统世界,2003(9):9697.

  [2] 苑庆国.嵌入式Linux的实时风暴[J]. 开放系统世界,2004(10):7980.

  [3] 陈闳中.Linux在嵌入式操作系统中的应用[J]. 同济大学学报(自然科学版),2001,29(5):564566.

  [4] 梁泉.嵌入式Linux系统移植及开发技术研究[D]. 成都:电子科技大学,2003.

  [5] 钱连举.基于ARM的嵌入式Linux系统移植技术研究与应用[D]. 成都:电子科技大学,2006.


此内容为AET网站原创,未经授权禁止转载。