2. 野火i.MX8MMini镜像SDK¶
2.1. 野火i.MX8MMini系统简介¶
野火i.MX8MMini系统是野火基于Debian ARM架构制作的Linux发行版, 该系统适配了野火i.MX8MMini系列微电脑板卡,共同组成嵌入式平台, 为AI、工控、物联网、机器人以及编程教育等应用场景提供了便捷的示例和应用。
野火i.MX8MMini系统继承了Debian ARM系统的便捷性,可以直接使用APT包管理工具直接安装Debian维护的软件, 如 Python、Opencv、Nginx以及Docker等软件,免去了传统嵌入式应用部署时自行编译源码的繁琐操作, 提高了稳定性。
野火提供了大量的行业应用和教程,大大提升了嵌入式应用的部署体验。
接下来以野火2024-01-16的镜像为例介绍如何编译野火uboot、kernel以及完整的鲁班猫镜像。 (若有新镜像建议使用最新的镜像日志)。
2024-01-16镜像日志如下:
内容 |
说明 |
---|---|
镜像名 |
imx8mm-mini-lubancat-bullseye-xfce-arm64-2024-01-16.img |
TYPE = console |
console为不带界面的纯净版本 |
TYPE = xfce |
xfce为带xfce桌面应用程序的版本 |
下载地址 |
|
提取码 |
9il6 |
日期 |
20240116 |
支持平台 |
|
Debian版本 |
基于Debian 11(bullseye) |
image-builder git |
|
image-builder branch |
image-builder-imx8mmini |
内核仓库 (kernel git) |
|
内核分支 (kernel branch) |
ebf_5.4.47_imx8mmini |
内核版本 (kernel versions) |
5.4.47 |
U-Boot git |
|
U-Boot branch |
imx_v2020.04_5.4.47_2.2.0 |
U-Boot版本 (U-Boot versions) |
2020.04 |
在本教程的使用的开发主机系统为: Ubuntu18.04 。 强烈推荐读者使用linux主机系统与我们一致,以减少不必要的麻烦。
2.2. 关于image-builder项目¶
野火的image-builder项目 移植自BeagleBone公司的image-builder项目在此基础上做了大量的修改, 主要用于构建野火debian、Ubuntu系统镜像。源码开放,主要由shell脚本和配置文件构成, 读者可以灵活高效地修改debian文件系统的配置,还能根据实际项目需要在文件系统中预装某些应用软件。
2.2.1. 项目起源¶
BeagleBoard.org是一家非盈利公司,致力于在嵌入式计算 领域提供开源硬件和软件, 并且重点关注教育行业,BeagleBoneBlack是该公司最受欢迎的主板。 image-builder项目就是为BeagleBoneBlack之类的开发板构建debian系统镜像的开源项目。
2.2.2. 项目原理¶
image-builder项目基于qemu和debootstrap等工具来生成和定制arm架构的debian文件系统。 其中,qemu是一个开源的模拟器项目,在GNU/Linux平台上使用广泛,可用于模拟各种不同架构的处理器。 而debootstrap是Debian官方提供的,适用于生成不同架构、不同版本的debian文件系统。
在使用debootstrap工具生成debian文件系统后,然后qemu使用新构建的debian文件系统作为文件系统, 在qemu模拟arm架构的处理器并启动后,就可以用apt install命令预装各种应用软件, linux内核和设备树都是在这个阶段中安装更新的。 安装完毕后,使用dd命令把得到的文件系统和u-boot一起打包到img文件中, 即可生成用于sd卡烧录的debian系统镜像。
2.2.3. ebf-image-builder目录分析¶
使用以下命令获取ebf-image-builder源码。
1 2 | #获取源码,指定image-builder-imx8mmini分支
git clone -b image-builder-imx8mmini https://gitee.com/Embedfire/ebf-image-builder.git
|
或者使用资料网盘中的源码压缩包:网盘/7-SDK源码压缩包/ebf-image-builder.tar.gz
百度云链接:https://pan.baidu.com/s/1Pfk-8xaeIcDDS9DRGpUFSQ?pwd=9il6 提取码:9il6
提示
资料网盘中的sdk压缩包已经包含内核源码、uboot源码,对于访问GitHub有困难的用户,建议使用网盘压缩包。
将得到以下目录。
1 2 3 4 5 6 7 8 9 10 11 12 13 | .
├── configs
├── doc
├── env
├── LICENSE
├── local_directory
├── local_pkg
├── Makefile
├── publish
├── readme.md
├── scripts
├── target
└── tools
|
configs目录:主要是Debian文件系统的一些配置项,主要有:预安装软件列表、镜像源地址等。
doc目录:说明文档。
env目录:设置环境设置相关脚本。
local_directory目录:读者可在这个目录下创建或添加一些想要的文件或者目录, 最终会被添加到根文件系统/usr/share目录下。
local_pkg目录:读者可在这个目录下放一些想要打包进镜像的软件包。
publish目录:这个目录下存放着编译debian固件的起始脚本,是整个项目的编译入口。
scripts目录:存放了一些执行特殊功能的脚本,在编译过程中会被调用。
target目录:这里面放置的内容比较杂散,有启动参数的说明文档、systemd的启动服务和deb镜像源的密钥等等。
tools目录:主要是打包脚本,完成把文件系统和uboot打包成img镜像的功能。
在执行编译镜像之后,在该目录下会增加几个新的目录
build目录:编译得到的uboot、内核、以及内核安装包。
deploy目录:编译的到的完整镜像目录。
ebf_linux_kernel目录:编译需要的内核源码路径。
ebf_linux_uboot目录:编译需要的uboot源码路径。
2.3. 编译系统镜像¶
野火的image-builder支持单独编译uboot、kernel以及完整的sd镜像。 接下来让我们使用野火image-builder编译出完整的sd镜像,编译之前先安装下编译所需要用到的工具。
2.3.1. 安装工具及依赖¶
1 2 | sudo apt update
sudo apt install make gcc-arm-none-eabi gcc-aarch64-linux-gnu gcc bison flex libssl-dev dpkg-dev lzop
|
2.3.2. 编译环境设置¶
设置ebf-image-builder编译环境, 如:选择安装方式、linux开发板型号、u-boot版本、linux版本、文件系统类型等等。
在SDK源码顶层目录运行如下命令:
1 | source env/setenv.sh
|
2.3.2.1. 选择安装介质类型¶
若想要编译出完整的sd烧写镜像,请选择安装介质ALL, 单独编译uboot则可以选择其他安装介质类型。
1 2 3 4 5 6 7 | #选择安装类型,
Choose install type:
1. ALL
2. NAND
3. eMMC/SD
Which install type would you like? [1] 1
|
2.3.2.2. 选择开发板¶
野火维护多种不同开发板,此处选择imx8m-mini开发板。
1 2 3 4 5 6 7 8 9 | Choose fire board:
1. ebf_imx_6ull_mini
2. ebf_imx_6ull_pro
3. ebf_imx_8m_mini
4. ebf_rockchip_3328
5. ebf_rockchip_3399
6. ebf_stm_imx8_star
Which board would you like? [1] 3
|
2.3.2.3. 选择uboot版本¶
1 2 3 4 5 6 7 8 9 10 | Choose uboot version:
1. uboot-2020.04
Which uboot version would you like? [1] 1
Choose uboot tag:
1. uboot-latest
Which uboot tag would you like? [1] 1
|
2.3.2.4. 选择linux内核版本¶
1 2 3 4 5 6 7 8 9 | Choose linux version:
1. linux-5.4.47
Which linux version would you like? [1]
Choose linux tag:
1. linux-latest
Which linux tag would you like? [1] 1
|
2.3.2.5. 选择发行版版本¶
支持debian/ubuntu文件系统,请根据实际需求选择。 若无特殊需求,使用默认选项即可。
1 2 3 4 5 6 7 8 9 10 11 12 | Choose distribution:
1. Debian
2. Ubuntu
Which distribution would you like? [1] 1
Choose Debian release:
1. buster
2. bullseye
Which Debian release would you like? [1] 2
|
2.3.2.6. 选择镜像版本¶
发行版系统有多种版本,请根据实际需求选择, - tiny:精简版镜像,不推荐,建议使用console版本。 - console:纯净版镜像,没有带桌面环境和野火的QT App。 - qt: 具有完整QT App功能的镜像,系统启动后会进入QT App的界面 - xfce:带有桌面环境的镜像,系统启动后会进入桌面环境。
1 2 3 4 5 6 7 | Choose Debian type:
1. tiny
2. console
3. qt
4. xfce
Which Debian type would you like? [1] 4
|
2.3.2.7. 最终配置信息¶
配置完成之后打印如下信息,若有想要修改配置信息,重新执行 source env/setenv.sh 即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ===========================================
#FIRE_BOARD=ebf_imx_8m_mini
#TFA=
#LINUX=5.4.47
#UBOOT=2020.04
#DISTRIBUTION=Debian
#DISTRIB_RELEASE=bullseye
#DISTRIB_TYPE=xfce
#INSTALL_TYPE=ALL
===========================================
Environment setup done.
Type 'make' or 'make DOWNLOAD_MIRROR=china' to build.
|
2.3.3. 编译完整固件¶
在编译过程中需请保持网络连接状态良好, 直接使用make便开始编译完整的鲁班猫系统固件,默认使用源码地址为GitHub链接,若是国内用户 推荐使用 DOWNLOAD_MIRROR=china 选项,将使用国内源,以提高文件下载速度。如下
make DOWNLOAD_MIRROR=china
当重复多次编译镜像时,uboot、内核并不会反复编译。 如果需要重新编译uboot、内核,可加入 FORCE_UPDATE=enable 选项。如下
make FORCE_UPDATE=enable
如果编译过程若出现以下提示,请输入密码获取root权限后继续编译。
Building rootfs stage requires root privileges, please enter your passowrd:
若编译成功将打印以下信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | sending incremental file list
ID.txt
SOC.sh
boot.scr.uimg
uEnv.txt
kernel/
kernel/System.map-5.4.47-imx8mm
kernel/config-5.4.47-imx8mm
kernel/initrd.img-5.4.47-imx8mm
kernel/vmlinuz-5.4.47-imx8mm
mmc0_extlinux/
mmc0_extlinux/extlinux.conf
mmc1_extlinux/
mmc1_extlinux/extlinux.conf
nand0_extlinux/
nand0_extlinux/extlinux.conf
sent 18,158,357 bytes received 295 bytes 36,317,304.00 bytes/sec
total size is 18,152,853 speedup is 1.00
/home/guest/imx8/ebf-image-builder/publish/fire-imx-stable.sh: line 22: 12523 Terminated keep_net_alive (wd: ~/imx8/ebf-image-builder)
/home/guest/imx8/ebf-image-builder
Done.
Thu Apr 18 02:56:13 UTC 2024
Time elapsed: 26 minute(s).
|
生成的image镜像位于deploy/lubancat-xxx-xxx-arm64-xxxx目录下, 后缀名为imx8m-mini-lubancat-xxx-xxx-arm64-xxx.img,可使用sd卡烧录工具将其烧录到sd卡中。其他组件可以替换usb烧录包里面的,通过usb烧录系统。
提示
在镜像的第一次编译过程中,脚本会检测你的电脑的编译环境, 安装编译需要的一些软件包,同时还会从野火官方仓库下载一些构建镜像所需的内容, 所需时间会比较长,请耐心等待。
2.3.4. 单独编译¶
除了能够编译完整的镜像之外,也能够单独编译uboot、内核以及内核安装包等,
编译uboot
在ebf-image-builder目录下,可使用以下命令只编译uboot
1 | make uboot
|
编译成功打印以下信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | self: 0x7e0fc0
csf: 0x80bdc0
reserved2: 0x0
boot_data.start: 0x7e0bc0
boot_data.size: 0x2d260
boot_data.plugin: 0x0
========= OFFSET dump =========
Loader IMAGE:
header_image_off 0x0
dcd_off 0x0
image_off 0x40
csf_off 0x2ae00
spl hab block: 0x7e0fc0 0x0 0x2ae00
Second Loader IMAGE:
sld_header_off 0x57c00
sld_csf_off 0x58c20
sld hab block: 0x401fcdc0 0x57c00 0x1020
make[1]: Leaving directory '/home/guest/imx8/ebf-image-builder/ebf_linux_uboot/ebf-imx-mkimage'
Done.
Fri Jun 7 03:47:24 UTC 2024
|
生成uboot文件位于build目录下
编译内核
在ebf-image-builder目录下,可使用以下命令只编译内核
1 | make kernel
|
编译成功打印以下信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | LD [M] sound/soc/codecs/snd-soc-es7134.ko
LD [M] sound/soc/codecs/snd-soc-es7241.ko
LD [M] sound/soc/codecs/snd-soc-max98357a.ko
LD [M] sound/soc/codecs/snd-soc-pcm3168a-i2c.ko
LD [M] sound/soc/codecs/snd-soc-pcm3168a.ko
LD [M] sound/soc/codecs/snd-soc-sgtl5000.ko
LD [M] sound/soc/codecs/snd-soc-spdif-rx.ko
LD [M] sound/soc/codecs/snd-soc-spdif-tx.ko
LD [M] sound/soc/codecs/snd-soc-tas571x.ko
LD [M] sound/soc/fsl/snd-soc-fsl-dai.ko
LD [M] sound/soc/sof/imx/snd-sof-imx8.ko
LD [M] sound/soc/sof/imx/snd-sof-imx8mm.ko
LD [M] sound/soc/sof/snd-sof-of.ko
LD [M] sound/soc/sof/snd-sof.ko
LD [M] sound/usb/snd-usb-audio.ko
LD [M] sound/usb/snd-usbmidi-lib.ko
make[2]: Leaving directory '/home/guest/imx8/ebf-image-builder/build/images'
make[1]: Leaving directory '/home/guest/imx8/ebf-image-builder/ebf_linux_kernel'
Done.
Fri Jun 7 04:01:05 UTC 2024
|
编译成功后,生成文件位于build/images目录下。
编译内核安装包
在ebf-image-builder目录下,可使用以下命令编译内核安装包
1 | make kernel-deb
|
编译成功打印以下信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | HDRINST usr/include/asm/swab.h
HDRINST usr/include/asm/ipcbuf.h
HDRINST usr/include/asm/stat.h
HDRINST usr/include/asm/msgbuf.h
HDRINST usr/include/asm/mman.h
HDRINST usr/include/asm/sockios.h
INSTALL ./debian/headertmp/usr/include
dpkg-deb: building package 'linux-headers-5.4.47-imx8mm' in '../linux-headers-5.4.47-imx8mm_1.2406stable_arm64.deb'.
dpkg-deb: building package 'linux-libc-dev' in '../linux-libc-dev_1.2406stable_arm64.deb'.
dpkg-deb: building package 'linux-image-5.4.47-imx8mm' in '../linux-image-5.4.47-imx8mm_1.2406stable_arm64.deb'.
dpkg-deb: building package 'linux-image-5.4.47-imx8mm-dbg' in '../linux-image-5.4.47-imx8mm-dbg_1.2406stable_arm64.deb'.
dpkg-genbuildinfo --build=binary
dpkg-genchanges --build=binary >../linux-5.4.47-imx8mm_1.2406stable_arm64.changes
dpkg-genchanges: info: binary-only upload (no source code included)
dpkg-source --after-build images
dpkg-buildpackage: info: binary-only upload (no source included)
make[1]: Leaving directory '/home/guest/imx8/ebf-image-builder/build/images'
Done.
Fri Jun 7 04:28:37 UTC 2024
|
编译成功后,生成deb包位于build/debs目录下。
2.4. 使用docker编译鲁班猫系统¶
除了使用以上方法能够构建新镜像之后,野火还提供了docker镜像, 供经常使用docker的读者,方便地使用docker进行编译。
2.4.1. 方式一:拉取野火ebf-image-builder编译环境镜像¶
ebf-image-builder编译环境镜像在dockerhub上的地址如下: https://hub.docker.com/repository/docker/lubancat/ebf-image-builder
可在安装了docker的主机上,执行以下命令拉取镜像
docker pull lubancat/ebf-image-builder:0.1
目前发布的TAG只有0.1版本,建议读者打开网址查看最新发布的TAG版本。
2.4.2. 方式二:构建ebf-image-builder编译环境镜像¶
除了能够在dockerhub上直接拉取ebf-image-builder编译环境镜像之外, 野火也提供了dockfile文件供读者对docker编译环境进行修改,其GitHub地址如下: https://github.com/Embedfire/lubancat_image_builder
使用以下命令直接构建ebf-image-builder编译环境镜像,
docker build -t ebf-image-builder:0.1 https://github.com/Embedfire/lubancat_image_builder.git#master
2.4.3. 使用docker编译鲁班猫系统注意事项¶
1、野火提供的ebf-image-builder编译环境镜像能够作为日常开发使用,编译内核以及uboot等, 若想要编译出完整的镜像则还需要在宿主机上些工具,安装命令如下
sudo apt update
sudo apt install qemu-user-static device-tree-compiler rsync gdisk u-boot-tools
2、 在创建容器,运行docker时,可以加下- -privileged参数,使container内的root拥有真正的root权限。
3、 在docker中编译系统的方法与前面章节部分相同,如果编译过程若出现以下提示,直接按回车跳过即可。
Building rootfs stage requires root privileges, please enter your passowrd:
提示
Docker只配置了环境,请按前面步骤获取SDK源码和进行编译。
2.4.4. docker参考文档¶
Docker–从实践到入门: https://yeasy.gitbook.io/docker_practice/