Freescale Yocto 编译自定义 Linux 系统镜像
Contents
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.2 下载 Freescale BSP 包
下载 Freescale 的板载支持包,Yocto 已经内置在包内。
这一小节内容可以参阅 FSL Community BSP.
下载 BSP 包需要 repo
工具,首先安装 repo
工具:
|
|
备注:如果因为 GFW 的原因无法下载 repo
,那么可以通过修改 hosts
文件来绕过:
|
|
下载 BSP 源码:
|
|
这一步会下载大量数据,完成后 Yocto 所需要的所有元数据已经齐备。
2. 镜像编译及自定义配置
现在已经可以编译 Linux 镜像了,以默认提供的 core-image-minimal
镜像配置为例:
|
|
这条命令用于初始化编译环境,其中 build
为指定的编译目录,也可以使用其他目录来当做编译目录。
编辑 build
目录下的 conf/local.conf
文件,指定开发板型号和配置并行编译参数:
|
|
根据实际情况来配置,如果主机 CPU 核心数更多,可以将并行编译参数修改为 8.
备注:这里也可以使用图形化的工具 hob
而不是手动修改来指定开发板型号和其他配置, hob
可以输入命令 hob
启动。
编译 core-image-minimal
镜像,这是一个预定义的 Linux 系统镜像:
|
|
编译过程中会下载所有需要的包的源码,编译过程比较耗时,也会占用不少硬盘空间。
2.1 自定义配置
上面编译的是预定义的镜像,但在实际应用中,我们一般会希望能自定义镜像配置,比如添加去除一些组件,修改系统的设置等等。这一小节就来讲讲如何通过添加 Yocto Layer 来实现我们需要的自定义配置。
这一小节内容可以参阅 Yocto part III – a custom meta layer.
这里以添加一个自定义 Layer foobar
为例,并进行一些配置修改来说明自定义配置的一般方法。
1) 自定义 layer 镜像
切换到 fsl-community-bsp/sources
目录,使用命令添加一个 meta-foobar
layer:
|
|
命令提示一路回车确认即可。
添加完空 layer 后,在 meta-foobar
目录下,用如下命令创建目录树:
|
|
在新创建的目录下,创建一个 foobar-image.bb
文件,文件内容填写如下:
|
|
意思是我们以 core-image-minimal
为模板,给 foobar
layer 添加了一个镜像目标,后续对镜像的自定义配置也是针对此镜像目标来操作,而不是直接去修改预定义的 core-image-minimal
。
如果要编译 foobar
的镜像,切换到 build
编译目录下,并修改 conf/bblayers.conf
文件,按照已有的格式,将我们创建的 meta-foobar
layer 添加到 BBLAYERS
变量中。
输入如下命令进行镜像编译:
|
|
2) 修改 busybox 配置
Busybox 是一个很有用的组件,提供了很多系统工具,但是默认并不激活所有工具,我们也要根据情况来激活/禁用某些工具(比如激活 telnetd)。
使用如下命令来进行 busybox 的图形化配置:
|
|
根据界面提示和实际需要来进行配置操作。
使用如下命令来输出配置变更内容:
|
|
保存路径设置为 ~/busybox.conf
在 meta-foobar
路径下创建目录树 recipes-core/busybox/files
,将 busybox.conf
文件复制到此目录下保存。
然后,在 recipes-core/busybox
目录下,创建文件 busybox_%.bbappend
文件,文件内容填写如下:
|
|
重新编译 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
文件,文件内容如下:
|
|
这样子就修改了默认系统名为 foobar
。
4) 修改 root 默认密码
修改 root 密码、添加用户,可以参考链接:FAQ:How do I set or change the root password.
修改 recipes-foobar/images/foobar-image.bb
文件,添加如下代码:
|
|
其中 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 yes
和 PasswordAuthentication yes
的两行注释。
然后在目录 recipes-connectivity/openssh
下创建 openssh_%.bbappend
文件,内容如下:
|
|
这样子我们修改过的 sshd_config
文件配置会覆盖默认配置。
6) 修改默认时区
如果不修改,默认编译的系统镜像,时区设置的是 UTC 时区,通常我们想修改为当地时区,比如中国为 PRC 时区。
时区组件配置由 recipes-extended/tzdata/tzdata_2016e.bb
文件中的 DEFAULT_TIMEZONE
来控制。
我们在 meta-foobar
下创建目录树 recipes-extended/tzdata
,并在目录下创建 tzdata_%.bbappend
文件,内容如下:
|
|
这样就将默认时区设置为中国。
以上 1-6 就详细叙述了常见的配置修改,修改模式基本都是通过自定义的配置去覆盖默认配置实现,用 bbappend
文件去调整默认配置,而不是直接去修改默认配置文件。
3. 镜像的烧录
编译的镜像都存放在 tmp/deploy/images
下,针对 SD 卡的镜像为 sdcard
或 sdcard.gz
结尾的文件(gz 文件需要解压后烧录)。
在 linux 环境下,可以使用如下命令来烧录镜像到 SD 卡中:
|
|
在 Windows 上,可以使用 USB Image Tool 来烧录镜像。
需要注意的是,Yocto 默认编译生成的镜像只占用 SD 卡上的一个小分区,如果想让系统使用全部的 SD 卡空间,需要使用工具来调整。这里推荐使用 GParted
工具的 resize/move
功能,此工具为图形化工具,非常方便。
GParted 安装:
|
|
GParted 运行:
|
|
(完)