yocto从概念安装到应用
yocto是一个开源项目,该项目旨在帮助我们自定义linux系统。它只是一个构建环境,可以通过yocto编译出image,image就是你要烧录到板卡硬件的可执行程序;也可以不用yocto,就用Makefile构建也是一样的,只是选择的构建方法不同而已,最终目的都是得到image。
使用该项目的原因(优点):该项目提供模板、工具和方法帮助我们创建定制的linux系统的嵌入式产品,而无需关心硬件体系,适合嵌入式开发人员使用,极大地简化了开发的过程,因为不用从头裁剪一个包含很多并不需要的完整的linux发布版本。
本人所安装的系统为centos,编译所需要的空间至少120G,需要在非root用户执行以下指令(注意不要用root用户去搭建yocto环境)需要VPN访问外网
以在centos系统下,将yocto安装到/data/yocto文件下为例,以下是安装和编译步骤:
①安装所需要的功能包(不同linux系统所需的依赖包不同,以centos为例)
$ sudo yum -y groupinstall "development tools"
$ sudo yum -y install tetex gawk sqlite-devel vim-common redhat-lsb xz \
m4 make wget curl ftp tar bzip2 gzip python-devel \
unzip perl texinfo texi2html diffstat openjade zlib-devel \
docbook-style-dsssl sed docbook-style-xsl docbook-dtds \
docbook-utils bc glibc-devel pcre pcre-devel \
groff linuxdoc-tools patch cmake \
tcl-devel gettext ncurses apr \
SDL-devel mesa-libGL-devel mesa-libGLU-devel gnome-doc-utils \
autoconf automake libtool xterm
②创建文件(不同的工程需要不同的文件夹,此处是imx8QMCP工程)
```cpp
[aertp@localhost yocto]$ cd /data/yocto
[aertp@localhost yocto]$ mkdir bin
[aertp@localhost yocto]$ mkdir imx8QMCPU
[aertp@localhost yocto]$ ls
③获取repo工具包(工具为git的封装)
```cpp
[aertp@localhost yocto]$ cd bin
[aertp@localhost bin]$ curl https://storage.googleapis.com/git-repo-downloads/repo > /data/yocto/bin/repo
④设置repo的环境变量,设置git命令用以获取的邮箱(需要设置GitHub有效的用户名以及对应的邮箱)
[aertp@localhost bin]$ chmod a+x /data/yocto/bin/repo
[aertp@localhost bin]$ export PATH=/data/yocto/bin:$PATH
[aertp@localhost bin]$ git config --global user.name "yourname"
[aertp@localhost bin]$ git config --global user.email "yourmail"
[aertp@localhost bin]$ git config --list
⑤获取yocto库的清单文件,并同步到本地仓库(本例所选的yocto版本为:L4.14.98-2.0.0)
[aertp@localhost bin]$ cd ..
[aertp@localhost yocto]$ cd imx8QMCPU/
[aertp@localhost imx8QMCPU]$ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-zeus -m imx-5.4.24-2.1.0.xml
[aertp@localhost imx8QMCPU]$ repo sync
//同步命令需要在网速极好的环境下进行
⑥开始编译自己所对应硬件芯片对应的image (按照自己的需求,设置所需要的选项)
[aertp@localhost imx8QMCPU]$ DISTRO=<distro name> MACHINE=<machine name> source imx-setup-release.sh -b <build dir>
//此过程产生配置文件
//imx-setup-release.sh是启动脚本,在当前目录下
//我的选择是fsl-imx-xwayland,imx8qmmek
//因此我的命令如下:
//[aertp@localhost imx8QMCPU]$ DISTRO=fsl-imx-xwayland MACHINE=imx8qmmek source fsl-setup-release.sh -b imx8qmmek_xwayland
//fsl-imx-xwayland是功能选项,用以获取相应的仓库清单,imx8qmmek是芯片对应的选项,需要在硬件商官网查询自己芯片的相对应的选项,imx8qmmek_xwayland是build目录名,可以任意取名字
[aertp@localhost imx8qmmek_xwayland]$ bitbake -k <conf name>
//此过程正式编译
//我的选择是core-image-base
//因此我的命令如下:
//[aertp@localhost imx8qmmek_xwayland]$ bitbake -k core-image-base
//'-k'是防止中途中断,这一步一般需要在网速稳定且较快的情况下执行,
大概需要20几个小时;core-image-base是根据自己的功能要求所选择的需求选项,此项是下载相应的文件并解压编译
选项解释(需要参考yocto对应的相应官方文档,下面以L4.14.98-2.0.0版本为例):
$DISTRO= MACHINE= source fsl-setup-release.sh -b
1.DISTRO有如下设置(一定要根据对应的yocto版本文档看选项是否支持自己的硬件以及自己想要的功能):
• fsl-imx-x11 - X11 graphics are not supported on i.MX 8.
• fsl-imx-wayland - Wayland weston graphics.
• fsl-imx-xwayland - Wayland graphics and X11. X11 applications using EGL are not supported.
• fsl-imx-fb - Frame Buffer graphics - no X11 or Wayland. Frame Buffer is not supported on i.MX 8.
2.MACHINE有如下设置:(一定要根据自己的芯片名称去硬件商官网找到对应芯片匹配的选项)
• imx6qpsabreauto
• imx6qpsabresd
• imx6ulevk
• imx6ulz14x14evk
• imx6ull14x14evk
• imx6ull9x9evk
• imx6dlsabreauto
• imx6dlsabresd
• imx6qsabreauto
• imx6qsabresd
• imx6slevk
• imx6solosabreauto
• imx6solosabresd
• imx6sxsabresd
• imx6sxsabreauto
• imx6sllevk
• imx7dsabresd
• imx7ulpevk
• imx8qmmek
• imx8qxpmek
• imx8mqevk
• imx8mmevk
3.build dir设置:根据自己的习惯命名build文件
$ bitbake -k <conf name>
conf name有如下设置:(根据自己的需求来选择)图1
⑦编译结束目录层次如下:
生成的bin文件目录:imx8qxpmek_wayland/tmp/deploy/images/imx8qxpmek/
LINUX源码目录:
imx8qxpmek_wayland/tmp/work/imx8qxpmek-poky-linux/linux-imx/4.14.98-r0/git/
Uboot源码目录:
imx8qxpmek_wayland/tmp/work/imx8qxpmek-poky-linux/u-boot-imx/2018.03-r0/git/
一般来讲,我们不会在yocto环境下去裁剪linux内核等。一般通过YOCTO编译出SDK后, 下载linux源码和UBoot源码,利用SDK独立编译。
三、安装和使用yocto过程中可能遇到的问题及解决方法(Q&A)
Q1:若安装在Ubuntu系统下所需要的依赖包?其他环境(Fedora、openSUSE)
A1:
//ubuntu:
$ sudo apt-get install sed wget subversion git-core coreutils \
unzip texi2html texinfo libsdl1.2-dev docbook-utils fop gawk \
python-pysqlite2 diffstat make gcc build-essential xsltproc \
g++ desktop-file-utils chrpath libgl1-mesa-dev libglu1-mesa-dev \
autoconf automake groff libtool xterm libxml-parser-perl
//Fedora
$ sudo yum groupinstall "development tools"
$ sudo yum install python m4 make wget curl ftp tar bzip2 gzip \
unzip perl texinfo texi2html diffstat openjade \
docbook-style-dsssl sed docbook-style-xsl docbook-dtds fop xsltproc \
docbook-utils sed bc eglibc-devel ccache pcre pcre-devel quilt \
groff linuxdoc-tools patch cmake \
perl-ExtUtils-MakeMaker tcl-devel gettext chrpath ncurses apr \
SDL-devel mesa-libGL-devel mesa-libGLU-devel gnome-doc-utils \
autoconf automake libtool xterm
//openSUSE
$ sudo zypper install python gcc gcc-c++ libtool fop \
subversion git chrpath automake make wget xsltproc \
diffstat texinfo freeglut-devel libSDL-devel
Q2:在使用yocto编译过程中可能会出现gcc编译器不工作的报错,报错信息如下
configure: error: C compiler cannot create executables
A2:
找到对应的报错日志文件信息:
error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file
可以通过以下方法解决:
vim /etc/ld.so.conf //在新的一行中加入库文件所在目录
/usr/lib
ldconfig //更新/etc/ld.so.cache文件
Q3:编译过程中个别包出现do_fecth的进度卡顿
A3:网络问题,需要一个稳定及快速的网络环境
四、深入理解yocto框架以及编译原理。
//注意:该目录省略了很多不必要的细节,只把重要的文件显示了出来
imx-yocto
|__downloads
|__build
| |__cache
| |__conf
| | |__bblayers.conf
| | |__local.conf
| |__tmp
| |__work
| |__deploy
| |__images
|
|
|__sources
|__base
|__meta-freescale-3rdparty
| |__classes
| | |__image_types_digi.bbclass
| |
| |__conf
| | |__layer.conf
| | |__machine
| | |__cm-fx6.conf
| |__recipes-kernel
| | |__linux
| | | |__linux-advantech_4.9.bb
| | |__kernel-modules
| |
| |__recipes-basp
|
|__meta-imx
|__meta-openembedded
|__poky
|__bitbake//bitbake源码
|__meta-yocto-bsp
|__meta
从框架可以看到,最主要由两部分组成。
sources目录
该目录是yocto的安装源码。里面包含了元数据集meta以及poky
①meta元数据由三层过程:meta-xxx->recpies-yyy->zzz/ttt.bb
②poky目录中包含bitbake工具、编译工具链、BSP、诸多程序包或层。
生成image的原理
①在build文件下构建配置文件。主要是两个文件./build/conf/bblayers.conf和local.conf。
②构建完整配方。poky会从local.conf开始,根据bblayers.conf中BBLAYERS变量里列出的
菜单,一级一级配置,如前面所说的meta三层配置,直到配置到和rootfs有关的那一堆bb
bb文件,最终形成完整完全的配方。
③自动获取配方所需要的资源
④把所有的资源编译出需要的镜像
//bblayers.conf
LCONF_VERSION = "6"
BBPATH = "${TOPDIR}"
BSPDIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}"
BBFILES ?= ""
BBLAYERS = " \
${BSPDIR}/sources/poky/meta \
${BSPDIR}/sources/poky/meta-poky \
\
${BSPDIR}/sources/meta-openembedded/meta-oe \
${BSPDIR}/sources/meta-openembedded/meta-multimedia \
${BSPDIR}/sources/meta-openembedded/meta-python \
\
${BSPDIR}/sources/meta-freescale \
${BSPDIR}/sources/meta-freescale-3rdparty \
${BSPDIR}/sources/meta-freescale-distro \
"
# i.MX Yocto Project Release layers
BBLAYERS += " ${BSPDIR}/sources/meta-imx/meta-bsp "
BBLAYERS += " ${BSPDIR}/sources/meta-imx/meta-sdk "
BBLAYERS += " ${BSPDIR}/sources/meta-imx/meta-ml "
BBLAYERS += "${BSPDIR}/sources/meta-browser"
BBLAYERS += "${BSPDIR}/sources/meta-rust"
BBLAYERS += "${BSPDIR}/sources/meta-openembedded/meta-gnome"
BBLAYERS += "${BSPDIR}/sources/meta-openembedded/meta-networking"
BBLAYERS += "${BSPDIR}/sources/meta-openembedded/meta-filesystems"
BBLAYERS += "${BSPDIR}/sources/meta-qt5"
BBLAYERS += "${BSPDIR}/sources/meta-python2"
//local.conf
MACHINE ??= 'imx8qmmek'
DISTRO ?= 'fsl-imx-xwayland'
PACKAGE_CLASSES ?= 'package_rpm'
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS ??= "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
STOPTASKS,/tmp,100M,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K \
ABORT,/tmp,10M,1K"
PACKAGECONFIG_append_pn-qemu-system-native = " sdl"
CONF_VERSION = "1"
DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = "1"
# Switch to Debian packaging and include package-management in the image
PACKAGE_CLASSES = "package_deb"
EXTRA_IMAGE_FEATURES += "package-management"
Yocto:Yocto是这个开源项目的名称,该项目旨在帮助我们自定义Linux系统
Poky:Poky有两个含义。第一个含义是用来构建Linux的构建系统,值得注意的该Poky仅仅是一个概念,而非一个实体:它包含了 BitBake工具、编译工具链、BSP、诸多程序包或层,可以认为Poky即是Yocto的本质;此外Poky还有另外一层意思,使用Poky系统得到的默认参考 Linux 发行版也叫Poky(当然,我们可以对此发行版随意命名)。Poky的两个含义千万不能混淆
Metadata:元数据集,所谓元数据集就是发行版内各基本元素的描述与来源
Recipes:.bb/.bbappend文件,配方文件,描述了从哪获取软件源码,如何配置,如何编译。bbappend和bb的区别主要在于bbappend是基于bb的,功能是对相应的bb文件作补充和覆盖,有点类似于“重写”的概念
Class:.bbclass文件
Configuration:.conf文件,即配置文件,我们可以用它来改变构建方式
Layers:即各种meta-xxx目录,将Metadata按层进行分类,有助于项目的维护
Bitbake:一个任务执行引擎,用来解析并执行Metadata
Output:即各种输出image
**总结:**假如用烹饪一桌酒席来形容构建发行版,则Yocto就是饭店名,Poky就是厨房(以及提供作为参考的菜的搭配套餐),Metadata就是烹饪资源(.bb/.bbappend表示配方/配方上的贴士,.conf表示厨房里的管事的小组长),Layers就是菜谱的分类(如川菜谱、粤菜谱),Bitbake就是厨师,Output就是得到的一桌酒席。
整个yocto的使用过程可以这么来概括:yocto本身有我们需要image构建的网址链接(即参考配方),在编译过程中,我们根据需求选择配置选项,(也可以更改内部的.bb文件,根据自己的需求选择配置包)yocto根据这些选项使用bitbake执行引擎从网络上根据实际需要的功能选择部分网址链接获得实际的metadata,最后生成包含linux源码和UBoot源码文件
前提:安装bitbake(源代码在yocto的/sources/poky/bitbake下)
几乎所有的操作都需要bitbake,我们需要将bitbake的路径配置到build目录。先cd到build目录
export PATH=/home/neiliuxy/imx-yocto/sources/poky/bitbake/bin:$PATH
export PYTHONPATH=/home/neiliuxy/imx-yocto/sources/poky/bitbake/lib:$PYTHONPATH
①如何在yocto中内核中修改dts
查找内核
bitbake -e linux-imx | grep ^S=
2.修改dts文件
//找到dts文件
(内核路径下)/arch/arm/boot/dts
//找到需要修改的.dts文件修改
3.编译内核
bitbake linux-imx -C compile -f
4.拷贝内核镜像和DTB文件到SD卡中
②如何在yocto中添加自己的设备树dts和修改内核配置
i.添加自己的设备树dts
1.切换到sources目录下,使用命令添加一个meta-bdgk layer
yocto-layer create bdgk
2.添加完空layer后,在meta-bdgk目录下,用如下命令创建目录树
mkdir -p recipes-bdgk/images
3.在新创建的目录下,创建一个bdgk-image.bb文件,文件内容填写如下:
require recipes-core/images/fsl-image-multimedia.bb
4.如果要编译 bdgk 的镜像,切换到 build 编译目录下,并修改 conf/bblayers.conf 文件,按照已 有的格式,将我们创建的 meta-bdgk layer 添加到 BBLAYERS 变量中,如
\
${
BSPDIR}/sources/meta-bdgk \
5.输入如下命令进行镜像编译
bitbake bdgk-image
ii.添加自己的设备树dts
recipetool appendsrcfile -wm your-machine-name \
path/to/meta-local virtual/kernel /path/to/your.dts \
'arch/${ARCH}/boot/dts/your.dts'
可以发现在/meta-bdgk/recipes-kernel/linux/的目录下,生成一个.bbappend文件,里面我自己的dts路径已经添加到SRC_URL中。下面,我需要在这个.bbappend文件中添加如下命令:
KERNEL_DEVICETREE += "imx6ul-14x14-evk.dtb"
此时,修改meta-bdgk/recipes-kernel/linux/linux-fslc-imx/imx6ulevk/目录下的.dts文件,就可以实现内核的设备树配置。
iii.添加自己的内核配置
我使用配置框架来配置自己的内核。手动创建一个配置框架fragment,使用命令配置内核:
bitbake -c menuconfig virtual/kernel
使用‘diffconfig’来创建一个fragment,该fragment里面有配置的最新修改项目,命令如下
bitbake -c diffconfig virtual/kernel
然后,添加这个fragment到自己的内核中,使用命令:
recipetool appendsrcfile -wWm your-machine-name meta-local virtual/kernel \
/path/to/your.cfg
此时,在meta-bdgk/recipes-kernel/linux/linux-fslc-imx/imx6ulevk/目录下会出现fragment.cfg文件。重新编译内核就可以实现内核配置。
③如何创建层添加一个软件包
创建层
bitbake-layers create-layer ../meta-mylayer
可以看到
meta-mylayer
|__conf
| |__layer.conf
|__COPYING.MIT
|__README
|__recipes-example
|__example
|__example_0.1.bb
添加层
bitbake-layers add-layer ../meta-mylayer
添加程序包,在层my-mylayer,配方recipes-example下新建文件夹hello
meta-mylayer
|__conf
| |__layer.conf
|__COPYING.MIT
|__README
|__recipes-exampp
|__example
| |__example_0.1.bb
|__hello//把软件包放在这里
|__hellosrc
| |__hello.c
| |__Makefile
|__hello.bb
查看程序是否添加成功
bitbake -s|grep hellosrc
编译
bitbake hellosrc
将程序添加到镜像中(首先确定编译的镜像名,例如这里使用bitbake core-image-minimal)镜像名是固定的那几个
找到对应的bb文件
find ./ -name "*core-image-minimal*"
编辑core-image-minimal.bb文件,在IMAGE_INSTALL 后面添加程序hello
IMAGE_INSTALL += "hello"
重新编译镜像,烧录到板子上就集成了程序hello了
bitbake core-image-minimal
④yocto制作SDK分发Toolchain脱离Yocto环境开发
例如对应要制作一个fsl-image-qt5 目标的Distribution(也叫做image),那么可以这样子
bitbake fsl-image-qt5 -c populate_sdk
生成.sh脚本文件及压缩包
SDK的安装
./XX.sh
未完待更