Yocto Project 是一个开源的协作软件,提供模板、工具和方法帮你创建定制的 Linux 系统和嵌入式产品,而无需关心硬件体系。适合嵌入式Linux开发人员使用。

下面来以 Freescale 的 i.MX6UL 开发板为例,详细叙述如何搭建 Yocto 环境以及 Linux 镜像的定制编译和烧录。

1. Freescale Yocto环境搭建

Yocto 需要一个 Linux 主机环境,可以通过搭建虚拟机来实现,发行版推荐 Ubuntu/Debian,其他主流发行版也可以。

如果通过虚拟机来搭建 Linux 环境,那么请注意分配足够的硬盘空间用来 Yocto 编译,推荐 100GB 以上。

这一节内容可以参阅 Freescale Yocto Project Main Page.

1.1 安装 Yocto 依赖包。

针对 Ubuntu/Debian 系统,可以使用如下命令安装所需要的包:

1
sudo apt-get install gawk wget git-core diffstat unzip texinfo  build-essential chrpath libsdl1.2-dev xterm curl

其他发行版可以参照此 链接 来安装依赖包。

1.2 下载 Freescale BSP 包

下载 Freescale 的板载支持包,Yocto 已经内置在包内。

这一小节内容可以参阅 FSL Community BSP.

下载 BSP 包需要 repo 工具,首先安装 repo 工具:

1
2
3
mkdir ~/bin
curl https://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

备注:如果因为 GFW 的原因无法下载 repo,那么可以通过修改 hosts 文件来绕过:

1
2
3
4
# 也可以通过访问项目 https://github.com/racaljk/hosts 手动下载
curl https://raw.githubusercontent.com/racaljk/hosts/master/hosts > ~/hosts
# 请勿直接覆盖 /etc/hosts,否则会影响 apt-get 工具的使用
sudo cat ~/hosts >> /etc/hosts

下载 BSP 源码:

1
2
3
4
5
PATH=${PATH}:~/bin
mkdir fsl-community-bsp
cd fsl-community-bsp
repo init -u https://github.com/Freescale/fsl-community-bsp-platform -b jethro
repo sync

这一步会下载大量数据,完成后 Yocto 所需要的所有元数据已经齐备。

2. 镜像编译及自定义配置

现在已经可以编译 Linux 镜像了,以默认提供的 core-image-minimal 镜像配置为例:

1
source ./setup-environment build

这条命令用于初始化编译环境,其中 build 为指定的编译目录,也可以使用其他目录来当做编译目录。

编辑 build 目录下的 conf/local.conf 文件,指定开发板型号和配置并行编译参数:

1
2
3
MACHINE ?= "imx6ulevk"
BB_NUMBER_THREADS = "4"
PARALLEL_MAKE = "-j 4"

根据实际情况来配置,如果主机 CPU 核心数更多,可以将并行编译参数修改为 8.

备注:这里也可以使用图形化的工具 hob 而不是手动修改来指定开发板型号和其他配置, hob 可以输入命令 hob 启动。

编译 core-image-minimal 镜像,这是一个预定义的 Linux 系统镜像:

1
bitbake core-image-minimal

编译过程中会下载所有需要的包的源码,编译过程比较耗时,也会占用不少硬盘空间。

2.1 自定义配置

上面编译的是预定义的镜像,但在实际应用中,我们一般会希望能自定义镜像配置,比如添加去除一些组件,修改系统的设置等等。这一小节就来讲讲如何通过添加 Yocto Layer 来实现我们需要的自定义配置。

这一小节内容可以参阅 Yocto part III – a custom meta layer.

这里以添加一个自定义 Layer foobar 为例,并进行一些配置修改来说明自定义配置的一般方法。

1) 自定义 layer 镜像

切换到 fsl-community-bsp/sources 目录,使用命令添加一个 meta-foobar layer:

1
yocto-layer create foobar

命令提示一路回车确认即可。

添加完空 layer 后,在 meta-foobar 目录下,用如下命令创建目录树:

1
mkdir -p recipes-foobar/images

在新创建的目录下,创建一个 foobar-image.bb 文件,文件内容填写如下:

1
require recipes-core/images/core-image-minimal.bb

意思是我们以 core-image-minimal 为模板,给 foobar layer 添加了一个镜像目标,后续对镜像的自定义配置也是针对此镜像目标来操作,而不是直接去修改预定义的 core-image-minimal

如果要编译 foobar 的镜像,切换到 build 编译目录下,并修改 conf/bblayers.conf 文件,按照已有的格式,将我们创建的 meta-foobar layer 添加到 BBLAYERS 变量中。

输入如下命令进行镜像编译:

1
bitbake foobar-image

2) 修改 busybox 配置

Busybox 是一个很有用的组件,提供了很多系统工具,但是默认并不激活所有工具,我们也要根据情况来激活/禁用某些工具(比如激活 telnetd)。

使用如下命令来进行 busybox 的图形化配置:

1
bitbake -c menuconfig busybox

根据界面提示和实际需要来进行配置操作。

使用如下命令来输出配置变更内容:

1
bitbake -c diffconfig busybox

保存路径设置为 ~/busybox.conf

meta-foobar 路径下创建目录树 recipes-core/busybox/files,将 busybox.conf 文件复制到此目录下保存。 然后,在 recipes-core/busybox 目录下,创建文件 busybox_%.bbappend 文件,文件内容填写如下:

1
2
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += "file://busybox.cfg"

重新编译 foobar-image,这样我们自定义的 busybox 配置就生效了。

从这里可以看出,如果我们要修改一个 Yocto 自带的一个组件,那么我们就通过添加 layer,同时使用相同的 recipes 路径配合 bbappend 文件,来对默认的配置进修改即可。(bbappend 文件名中的 % 符号是版本号的占位符)

3) 修改默认系统名

Linux 系统名是由 sources/poky/meta/recipes-core/base-files/ 下的 base-files_3.0.14.bb 文件控制的,那么我们通过添加对应的 bbappend 文件来进行配置。

meta-foobar layer 路径下创建目录树 recipes-core/base-files,并在目录下创建 base-files_%.bbappend 文件,文件内容如下:

1
hostname = "foobar"

这样子就修改了默认系统名为 foobar

4) 修改 root 默认密码

修改 root 密码、添加用户,可以参考链接:FAQ:How do I set or change the root password.

修改 recipes-foobar/images/foobar-image.bb 文件,添加如下代码:

1
2
inherit extrausers
EXTRA_USERS_PARAMS = "usermod -P 123456 root;"

其中 123456 即为设置的 root 密码。

备注:如果要使 root 密码生效,需要修改 build 目录下的 conf/local.conf 文件,注释掉 EXTRA_IMAGE_FEATURES = "debug-tweaks 这个选项。

5) 修改 sshd 默认配置

sshd 提供 ssh 登录服务,但是默认配置下不允许 root 进行登录,默认也不允许密码验证,在实际使用中并不方便(方便也意味这安全隐患),要允许 root 以密码验证方式登录,可以使用如下方法修改。

sshd 组件的默认配置保存在 recipes-connectivity/openssh/openssh 路径下的 sshd_config 文件中,允许 root 登录是由选项 PermitRootLogin 控制,允许密码验证是由选项 PasswordAuthentication 控制,我们看到这两项默认被注释掉了。

要修改此配置,我们要在 meta-foobar 下创建目录树 recipes-connectivity/openssh/files,并将默认的 sshd_config 文件复制一份到此目录下,并取消 PermitRootLogin yesPasswordAuthentication yes 的两行注释。

然后在目录 recipes-connectivity/openssh 下创建 openssh_%.bbappend 文件,内容如下:

1
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

这样子我们修改过的 sshd_config 文件配置会覆盖默认配置。

6) 修改默认时区

如果不修改,默认编译的系统镜像,时区设置的是 UTC 时区,通常我们想修改为当地时区,比如中国为 PRC 时区。

时区组件配置由 recipes-extended/tzdata/tzdata_2016e.bb 文件中的 DEFAULT_TIMEZONE 来控制。

我们在 meta-foobar 下创建目录树 recipes-extended/tzdata,并在目录下创建 tzdata_%.bbappend 文件,内容如下:

1
DEFAULT_TIMEZONE = "PRC"

这样就将默认时区设置为中国。

以上 1-6 就详细叙述了常见的配置修改,修改模式基本都是通过自定义的配置去覆盖默认配置实现,用 bbappend 文件去调整默认配置,而不是直接去修改默认配置文件。

3. 镜像的烧录

编译的镜像都存放在 tmp/deploy/images 下,针对 SD 卡的镜像为 sdcardsdcard.gz 结尾的文件(gz 文件需要解压后烧录)。

在 linux 环境下,可以使用如下命令来烧录镜像到 SD 卡中:

1
sudo dd if=foobar-image-xxx.sdcard of=/dev/sdb

在 Windows 上,可以使用 USB Image Tool 来烧录镜像。

需要注意的是,Yocto 默认编译生成的镜像只占用 SD 卡上的一个小分区,如果想让系统使用全部的 SD 卡空间,需要使用工具来调整。这里推荐使用 GParted 工具的 resize/move 功能,此工具为图形化工具,非常方便。

GParted 安装:

1
sudo apt-get install gparted

GParted 运行:

1
sudo gparted

(完)