一 、主机( HOST )构建
本次 Yocto 环境搭建基于的主机是 Ubuntu 16.04 ,基于的硬件平台是 i.MX8MQ。
主机构建分成主机软件包(host packages)安装和 repo 工具安装两部分。
- 执行以下指令,安装主机软件包。
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev |
注 :这里只是安装必要的主机包,需要其他主机包需另外安装。
- 执行以下指令,安装 repo 工具。
$ mkdir ~/bin $ cd bin $ curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo $ chmod a+x repo $ export PATH=~/bin:$PATH |
二、 Yocto Project BSP 环境搭建
- 执行以下指令,搭建 Yocto Project BSP 环境。
$ mkdir imx-yocto-bsp $ cd imx-yocto-bsp $ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-sumo -m imx-4.14.98-2.0.0_ga.xml --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo $ repo sync |
注 :在执行这些指令前,确保已经安装 Git 工具并且对 Git 进行配置。
在imx-yocto-bsp 目录下主要生成了两个脚本和一个 sources 目录。
sources 目录 —— 主要存放着下载的配方文件和各种脚本,作为 bitbake 时的原材料。
fsl-setup-release.sh 脚本 —— 在 bitbake编译前进行配置时使用该脚本。
setup-environment 脚本 —— 当主机重启或开启新终端时,在重新 bitbake 前需要使用该脚本进行配置,然后可以继续上一次的编译。
三、 编译镜像
此次镜像编译基于的硬件平台为 i.MX8MQ ,选择的图形后端为 wayland ,支持 GUI ,不支持 QT 。
编译镜像一般分成编译前的配置和镜像编译两部分。
- 执行以下指令,进行编译前的配置。
$ DISTRO=fsl-imx-wayland MACHINE=imx8mqevk source fsl-setup-release.sh -b imx8mqevk_wayland |
注 :指定的硬件平台为 i.MX8MQ ,图形后端为 wayland 。
- 执行以下指令,开始编译镜像。
$ bitbake fsl-image-validation-imx |
注 :编译的镜像不支持 QT 。第一次编译镜像,需要下载的文件较多,花费的时间会较长。可以通过手动拷贝已下载好的文件到 downloads 文件夹下,可省去下载时间。
编译结束后,在 /tmp/deploy/images 目录下可以看到编译生成的文件。
四、 Linux Image 组成
- Bootloader : 包括 U-Boot 、ATF 、SCFW 、SECO 、SPL 等。在MX8MQ 中,SPL初始化 DDR 并将 U-Boot 、ATF 等从引导设备加载到内存中,然后执行ATF,之后再执行 U-Boot 。
- kernel image : 如 zImage 、Image 。
- 设备树文件(DTB): 树数据结构,描述了硬件配置(特定于 board),通过其配置,允许不同 board 使用相同的 kernel 。
4. 根文件系统(Rootfs): 包含 busybox 、公共库和其他元素,定义了要使用的图形后端,文件名为 ext3 或 ext4 。
四、 SD card 的分区
- 准备一个 SD card 读卡器,如可通过 USB 读卡器连接到虚拟机。
cat /proc/partitions |
- 使用如下命令查看 SD card 的挂载情况。
df |
4. 使用如下命令卸载 /dev/sdb1 。
umount /dev/sdb1 |
5.使用如下命令进入分区工具 fdisk 。
sudo fdisk /dev/sdb |
使用 fdisk 的命令完成 SD card 的分区:
(1) 按 p + Enter 查看当前分区情况。
(2) 按 d + Enter 删除分区。
注:如果有多个分区,要重复删除,直到所有不必要的分区都删除干净。
(3) 按 n + Enter 新建分区并设置分区的参数。
设置分区模式为 primary;分区号为 1;起始 sector 为 20480;
大小为 +1024000 个 sector,即 1024000 * 512 = 500 MB;
新建第二个分区,将剩余的空间都分配给它。
分区号为 2;起始 sector 为 1228800;默认大小,即剩余的所有空间。
(4) 按 w + Enter 保存分区表,完成分区。
四、 烧录 image 到 SD card
根据文档,依序烧录 bootloader、kernel 和 rootfs 的 image 到 SD card 中。
- 烧录 bootloader image 。
① 使用如下命令找到 build-wayland 目录下名为 flash.bin 的bootloader image 。
cd tmp/work/imx8mqevk-poky-linux/imx-boot/0.2-r0/git/iMX8M |
② 使用如下命令烧录 bootloader 。
sudo dd if= of=/dev/sdb bs=1k seek= conv=fsync sudo dd if=flash.bin of=/dev/sdb bs=1k seek=33 conv=fsync |
注:i.MX8MQ 对应的 seek offset 是 33 。
- 烧录 kernel image 和 dtb 。
① 使用如下命令找到 build-wayland 目录下文件名为 Image 的 kernel image 。
cd tmp/work/imx8mqevk-poky-linux/linux-imx/4.14.98-r0/build/arch/arm64/boot/ |
② 使用如下命令格式化待烧录 kernel image 的分区 sdb1 。
sudo mkfs.fat /dev/sdb1 |
③ 使用如下命令挂载待烧录 kernel image 的分区 sdb1 。
sudo mount /dev/sdb1 ~/mountpoint/ |
④ 使用如下命令复制 kernel image 的 Image 文件到已挂载的分区 sdb1 。
sudo cp Image ~/mountpoint/ |
⑤ 使用如下命令找到 build-wayland 目录下的设备树文件 fsl-imx8mq-evk.dtb 。
cd tmp/work/imx8mqevk-poky-linux/linux-imx/4.14.98-r0/build/arch/arm64/boot/dts/freescale/ |
⑥ 使用如下命令复制 fsl-imx8mq-evk.dtb 设备树文件到已挂载的分区 sdb1 。
sudo cp fsl-imx8mq-evk.dtb ~/mountpoint/ |
⑦ 使用如下命令卸载分区 sdb1,完成烧录。
sudo umount ~/mountpoint/ sync |
- 烧录 rootfs image 。
① 使用如下命令格式化待烧录 rootfs image 的分区 sdb2 。
sudo mkfs.ext4 /dev/sdb2 |
② 使用如下命令挂载待烧录 rootfs 的分区 sdb2 。
mkdir /home/f/mountpoint sudo mount /dev/sdb2 /home/f/mountpoint |
③ 使用如下命令解压 Yocto 生成的rootfs 压缩包到当前目录下的 rootfs 文件夹。
tar -xjf build/fsl-image-validation-imx-imx8mqevk-20190829100239.rootfs.tar.bz2 -C rootfs/ |
注:Yocto 生成的rootfs 存放在 build 目录下的 tmp/deploy/images/imx8mqevk/ 。
④ 使用如下命令复制 rootfs 的所有内容到挂载目录下。
sudo cp -a ./* ~/mountpoint/ |
⑤ 使用如下命令卸载分区 sdb2,完成烧录。
sudo umount ~/mountpoint/ sync |
评论