Yocto项目介绍及入门--嵌入师工程师必备利器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Yocto项⽬介绍及⼊门--嵌⼊师⼯程师必备利器
⽬录
写在前⾯
博主⽬前从事BMC⼯作,由于公司要开发openbmc项⽬,所以要学习Yocto项⽬。

截⾄⽬前,我已经学习了⼀段时间了,⼤致可以熟练使⽤Yocto项⽬进⾏嵌⼊式系统的开发,由于⽹上这⽅⾯的相关知识不太多,所以想尽绵薄之⼒为这⽅⾯的知识做⼀些补充。

⽂中可能有所疏漏,欢迎留⾔指正,另外有兴趣的同学也欢迎交流。

1. Yocto项⽬是什么
本质是⼀个构建⼯具,其帮助开发者能够快速地、简单地设计⼀个基于Linux的系统。

该项⽬由Linux基⾦会赞助,于2010年启动。

同时,在谈到Yocto项⽬的时候,就不得不提到OpenEmbedded项⽬,该项⽬源于夏普的⼀个开源项⽬OpenZaurus(服务于SL-5000D),后来结合了其他⼏个类似的嵌⼊式项⽬(Familiar Linux, OpenSIMpad),其⽬的是为嵌⼊式系统构建Linux发⾏版。

OpenEmbedded项⽬维护了⼀个构建⼯具BitBake和⼀个元数据层(详细描述了构建⼀个Linux发⾏版所需要的包及构建过程)。

Poky Linux是OpenEmbedded项⽬的⼀个扩展应⽤,同时也是Yocto项⽬的前⾝。

在2011年的时候,OpenEmbedded项⽬宣布于Yocto项⽬进⾏合作,共同维护BitBake以及⼀个核⼼数据层。

你可能想问它俩究竟区别在哪,其实它两最终⽬标都是构建Linux发⾏版,但侧重点不同,OpenEmbedded聚焦在尖端技术、菜谱和⼀⼤套针对不同硬件平台的板⽀持包,⽽Yocto 项⽬聚焦在构建系统本⾝和针对交叉开发的⼯具化上。

如果还不明⽩,那你直接就可以理解为⼀个偏硬件,⼀个偏软件,相辅相成。

另外,我希望你可以通过下⾯这幅图加深对我之前说的话的理解,图⽚来⾃Yocto官⽹:
在上⾯图中,poky是Yocto项⽬为开发者提供的⼀个开发样例,⽤户可以直接使⽤poky来⽣成⼀个Linux发⾏版镜像,或者也可以通过扩展它来⾃定义镜像。

与此同时,poky中包含了⼀个核⼼元数据,其详细描述了构建⼀个Linux发⾏版所需要的包及构建过程,⽽它正是OpenEmbedded项⽬的⼀部分。

2. Yocto项⽬有什么⽤
要说Yocto项⽬有什么⽤处,实际上前⼀节已经说了个⼤概。

如果现在你需要基于Linux系统设计⼀个定制版的发⾏版,那么借助于Yocto项⽬你可以通过修改⼀些菜谱和配置⽂件(这些概念不懂没事,之后会提到,你在这只需知道这些⽂件控制了构建Linux发⾏版系统的过程)⾮常简单的构建出⼀个可⽤的发⾏版镜像。

⼜或者你现在有个⼩型嵌⼊式⼯控设备,需要为其提供⼀个特别⼩的可运⾏Linux系统,那么你也可以利⽤Yocto项⽬完成你的⽬的。

总之,借⽤Yocto官⽹的描述,Yocto项⽬就是⼀个⼯具,⽤于构建基于Linux的系统:
The project provides a flexible set of tools and a space where embedded developers worldwide can share technologies, software stacks,
configurations, and best practices that can be used to create tailored Linux images for embedded and IOT devices, or anywhere a customized Linux OS is needed.
3. 如何快速上⼿Yocto项⽬
如果你之前曾今接触过Yocto项⽬,那你肯定会抱怨过关于这⽅⾯⽹络信息资源的匮乏。

如果你真的对这个内容感兴趣,你可以通过两种学习路径来理解和熟悉使⽤Yocto项⽬。

第⼀个学习路径是我极为推荐的,那就是使⽤官⽹的。

这个⼿册每次Yocto项⽬更新后,它也会随之更新,因此内容是⽐较新的,不容易出现问题。

但是问题就是内容是英⽂的,可能学起来稍微⽐较费时。

另外⼀个⽐较推荐的是通过Rudolf J. Streif写的⼀本书《Embedded Linux Systems with the Yocto Project》,现在这本书已经被国内的⼀位⼤佬胥峰翻译过来了,书名叫《嵌⼊式Linux系统开发:基于Yocto Project》。

有点遗憾的是,该书是2018年出版的,所以⽂中有些内容已经有点过时了,所以需要读者多注意⼀下。

另外,如果有同学想要该书的电⼦版,可以留下邮箱。

最后,还要注意的是,不论哪种⽅法,⽂中都有⼤量的测试实验,这些内容还请务必尝试,最好可以举⼀反三,我可以保证在学习完成之后你会有巨⼤的收获。

4. 带你通过Yocto项⽬编译⼀个⾃定义镜像⽂件
在做这个实验之前,你必须先确认⼀下你的系统是否达到这些要求:
类型需求
构建主机CPU X86架构
如果确定达到了这些要求,那么我们现在开始构建⼀个带打印Hello World应⽤的桌⾯Linux系统发⾏版镜像。

⾸先你需要预安装⼀些Yocto⼯程会使⽤到的软件包(以Ubuntu为例):
$ sudo apt install gawk wget git-core diffstat unzip texinfo gcc-multilib
$ sudo apt install build-essential chrpath socat cpio python3 python3-pip python3-pexpect
$ sudo apt install xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev
$ sudo apt install pylint3 xterm
其次,我们还需要克隆⼀个Yocto项⽬到本地:
$ git clone git:///poky
到此为⽌,你已经得到了⼀个完整的Yocto项⽬demo,直接构建该⼯程,你可以得到⼀个Linux系统发⾏版:
⾸先你需要初始化构建环境,以此来得到⼀些重要的环境变量,进⼊poky ⽬录,运⾏命令:source oe-init-build-env build ,此时系统会创建⼀个构建⽬录build (该⽬录存放整个构建输出内容,或者可以将其称作构建环境),并跳转到该⽬录下。

使⽤vim 打开build/conf/local.conf ⽂件(该⽂件提供⼀些全局配置),增加两⾏内容:
BB_NUMBER_THREADS = "4"
PARALLEL_MAKE = "-j 4"
这两⾏内容分别是构建器使⽤的线程数,和编译器(Make)使⽤的线程数,建议设置为⼩与系统实际能提供的最⼤线程数,否则默认使⽤最⼤线程数。

这样做的⽬的是避免线程数太多导致内存空间不⾜,以⾄于构建失败,或者你也可以打开交换内存来增加内存空间避免这⼀问题,⽅法见。

现在,你可以开始构建⼀个镜像了,运⾏命令bitbake core-image-sato ,这时你便开始构建⼀个带⽤户操作界⾯的Linux 系统镜像。

当然了,⼤多数情况下,你⼀定会遇到⼀些构建错误,这时,你可以参考下,或者留⾔,之后我会尽可能做出回复。

如果你成功构建完成,那么恭喜你,你已经成功了⼀⼤半了。

现在开始,你可以验证你构建的镜像是否能够使⽤,运⾏命令runqemu tmp/deploy/images/qemux86-64/bzImage-
qemux86-64.bin tmp/deploy/images/qemux86-64/core-image-sato-qemux86-64.ext4 。

此时,系统将会使⽤默认参数启动你刚刚构建的位于build/tmp/deploy/images/qemux86-64/⽬
录下的操作系统镜像,例如你可以看到下⾯的界⾯:
通过上⾯的步骤,你已经得到了⼀个利⽤poky制作的样例镜像,接下来,我们要为这个镜像嵌⼊⼀个我们要⽤的软件包。

⾸先,先建⽴⼀个⾃⼰的层(⼀般在顶级⽬录下,以meta开头的⽬录都叫层,每个层都是独⽴的,因此为了避免污染其他层,我们建⽴⾃⼰的层),进⼊poky顶层⽬录,执⾏命令mkdir meta-mylayer 。

对于每个层,都需要有⾃⼰层的配置⽂件,⽤于告诉构建器层中菜谱⽂件的位置及其他内容,因此我们提供这样⼀个⽂件,进⼊meta-mylayer⽬录中,新建⼀个⽂件夹conf,并在该⽬录下新建⼀个layer.conf⽂件,其内容如下:
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend \
"
BBFILE_COLLECTIONS += "mylayer"
BBFILE_PATTERN_mylayer := "^${LAYERDIR}/"
BBFILE_PRIORITY_mylayer = "5"内存容量
⼤于或者等于4GB ,不低于1GB ⽹络
最好设置连接到外⽹的代理,没有也没关系,只不过构建时间会很长系统任意Linux 发⾏版
另外,为了能够让编译系统能够把我们的层包含进去,还需要修改build/conf/bblayers.conf⽂件,该⽂件中BBLAYERS变量会声明参与编译的所有层,如下图所⽰,我们把新建的层添加到变量中:
除此之外,我们需要提供helloworld的源码包,在meta-mylayer⽬录中新建⽂件夹recipes-apps/hello,并进⼊该⽬录,新建⽂件夹hello-1.0,在这个⽂件夹新建三个⽂件,内容如下:
之后,我们将这三个⽂件打包为hello-1.0.tar.gz,并存放到hello-1.0⽬录下。

随后,我们需要设计软件包菜谱,这个菜谱告诉了构建器从哪⾥找包,并如何编译安装到镜像中,在recipes-apps/hello⽬录下新建hello_1.0.bb菜谱⽂件,其内容如下:SUMMARY = "Simple Hello World Application"
DESCRIPTION = "A test application to demonstrate how to create a recipe \
by directly compiling C files with BitBake."
# a category this package belong to
SECTION = "examples"
# this package is optional, lacking of it doesn't cause error
PRIORITY = "optional"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "\
file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://hello-1.0.tar.gz"
# S = "${WORKDIR}"
# fix WARN_QA error
TARGET_CC_ARCH += "${LDFLAGS}"
do_compile() {
${CC} -c helloprint.c
${CC} -c hello.c
${CC} -o hello hello.o helloprint.o
}
do_install() {
install -d ${D}${bindir}
install -m 0755 hello ${D}${bindir}
}
最后,我们将这个包添加到镜像中,在⽂件meta/recipes-sato/images/core-image-sato.bb或者build/conf/local.conf中添加⼀⾏内容IMAGE_INSTALL += " hello "。

重新构建镜像bitbake core-image-sato,测试时,你可以发现多出了⼀个新的命令hello。

我希望能通过这个简单的实例让⼤家对Yocto有个初步的认识,如果想继续深⼊了解Yocto项⽬,可以参照第三节内容学习,另外,你也可以关注我,后续我会不定期的更新这⽅⾯的相关知识。

相关文档
最新文档