23. 构建野火鲁班猫镜像

23.1. 野火鲁班猫LubanCat OS简介

鲁班猫系统(LubanCat OS)是野火基于Debian ARM架构制作的Linux发行版, 该系统适配了野火的所有鲁班猫系列微电脑板卡,共同组成嵌入式平台, 为AI、工控、物联网、机器人以及编程教育等应用场景提供了便捷的示例和应用。

鲁班猫系统继承了Debian ARM系统的便捷性,可以直接使用APT包管理工具直接安装Debian维护的软件, 如 Python、Opencv、Nginx以及Docker等软件,免去了传统嵌入式应用部署时自行编译源码的繁琐操作, 提高了稳定性。

野火基于鲁班猫系统提供了大量的行业应用和教程,大大提升了嵌入式应用的部署体验。

关于鲁班猫系统镜像简介以及最新下载链接请访问以下链接: https://doc.embedfire.com/lubancat/os_release_note/zh/latest/index.html

接下来以野火2021-04-08的镜像为例介绍如何编译野火uboot、kernel以及完整的鲁班猫镜像。 (若有新镜像建议使用最新的镜像日志)。

2021-04-08镜像日志如下:

imx6ull-lubancat-carp-TYPE-armhf-2021-04-08

内容

说明

镜像名

imx6ull-lubancat-carp-TYPE-armhf-2021-04-08

TYPE = console

console为不带界面的纯净版本

TYPE = qt

qt为带野火出厂界面应用程序的版本

下载地址

百度云:https://pan.baidu.com/s/1pqVHVIdY97VApz-rVVa8pQ

提取码

uge1

日期

2020-02-20

支持平台

鲁班猫-i.MX6ULL系列板卡

LubanCat OS版本

2.0(鲤鱼-Carp)

Debian版本

基于Debian 10(Buster)

image-builder git

https://gitee.com/Embedfire/ebf-image-builder

image-builder branch

image-builder_2.0

image-builder tag

imx6ull-debian-buster-carp-2021-04-08

内核仓库 (kernel git)

https://github.com/Embedfire/ebf_linux_kernel

内核分支 (kernel branch)

ebf_4.19.35_imx6ul

内核提交ID (commit ID)

d08e788c54486300cbba3d68ddc878c68f98251d

U-Boot git

https://gitee.com/Embedfire/ebf_linux_uboot

U-Boot branch

ebf_v2020_10_imx

U-Boot commit ID

4f79a1a2de472a3646bbaf7a32295d69659dcd10

上游内核仓库 (kernel git)

https://source.codeaurora.org/external/imx/linux-imx/

上游内核分支 (kernel branch)

imx_4.19.35_1.1.0

在本教程的使用的开发主机系统为: Ubuntu18.04 。 强烈推荐读者使用linux主机系统与我们一致,以减少不必要的麻烦。

23.2. 关于image-builder项目

野火的image-builder项目 移植自BeagleBone公司的image-builder项目在此基础上做了大量的修改, 主要用于构建野火debian、Ubuntu系统镜像。源码开放,主要由shell脚本和配置文件构成, 读者可以灵活高效地修改debian文件系统的配置,还能根据实际项目需要在文件系统中预装某些应用软件。

23.2.1. 项目起源

BeagleBoard.org是一家非盈利公司,致力于在嵌入式计算 领域提供开源硬件和软件, 并且重点关注教育行业,BeagleBoneBlack是该公司最受欢迎的主板。 image-builder项目就是为BeagleBoneBlack之类的开发板构建debian系统镜像的开源项目。

源码地址: https://github.com/beagleboard/image-builder

23.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系统镜像。

23.2.3. ebf-image-builder目录分析

使用以下命令获取ebf-image-builder源码。

1
2
#获取源码
git clone  https://gitee.com/Embedfire/ebf-image-builder.git

将得到以下目录。

 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源码路径。

23.3. 编译鲁班猫LubanCat OS镜像

野火的image-builder支持单独编译uboot、kernel以及完整的sd镜像。 接下来让我们使用野火image-builder编译出完整的sd镜像,编译之前先安装下编译所需要用到的工具。

23.3.1. 安装工具及依赖

1
2
sudo apt update
sudo apt install make gcc-arm-none-eabi gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop

23.3.2. 获取image-builder项目源码

使用git clone获取野火image-builder项目。

1
2
3
4
5
#获取源码
git clone  https://gitee.com/Embedfire/ebf-image-builder.git

#进入ebf-image-builder目录
cd ebf-image-builder

23.3.3. 编译环境设置

设置ebf-image-builder编译环境, 如:选择安装方式、linux开发板型号、u-boot版本、linux版本、文件系统类型等等。

运行如下命令

1
source env/setenv.sh

23.3.3.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

23.3.3.2. 选择开发板

野火维护多种不同开发板,此处选择imx6ull pro开发板。

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_mp157_star

Which board would you like? [1] 2

23.3.3.3. 选择uboot版本

野火维护多种不同版本uboot,如无特殊需求,使用默认选项即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Choose uboot version:
1. uboot-2020.10

Which uboot version would you like? [1] 1

Choose uboot tag:
1. uboot-latest
2. uboot-ebf_imx_4.19_2020_12_09

Which uboot tag would you like? [1] 1

23.3.3.4. 选择linux版本

野火维护多种不同版本linux内核, 其中linux-4.19.35为NXP官方提供内核,推荐使用linux-4.19.35版本内核。 其他项若无特殊需求,使用默认选项即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Choose linux version:
1. linux-4.19.71
2. linux-4.19.35

Which linux version would you like? [1] 2

Choose linux tag:
1. linux-latest
2. linux-ebf_imx_4.19_2020_12_09

Which linux tag would you like? [1] 1

23.3.3.5. 选择发行版版本

支持debian/ubuntu文件系统,请根据实际需求选择。 若无特殊需求,使用默认选项即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Choose distribution:
1. Debian
2. Ubuntu

Which distribution would you like? [1] 1

Choose Debian release:
1. buster

Which Debian release would you like? [1] 1

23.3.3.6. 选择镜像版本

发行版系统有多种版本,请根据实际需求选择, - console:纯净版镜像,没有带桌面环境和野火的QT App。 - qt: 具有完整QT App功能的镜像,系统启动后会进入QT App的界面 - desktop:带有桌面环境的镜像,系统启动后会进入桌面环境(板子性能有限,不推荐)。

1
2
3
4
5
6
Choose Debian type:
1. console
2. qt
3. desktop

Which Debian type would you like? [1] 1

23.3.3.7. 最终配置信息

配置完成之后打印如下信息,若有想要修改配置信息,重新执行 source env/setenv.sh 即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Set architecture to 'armhf' by default.
===========================================

#FIRE_BOARD=ebf_imx_6ull_pro
#LINUX=4.19.35
#UBOOT=2020.10
#DISTRIBUTION=Debian
#DISTRIB_RELEASE=buster
#DISTRIB_TYPE=console
#DISTRIB_ARCH=armhf
#INSTALL_TYPE=ALL

===========================================

Environment setup done.
Type 'make' to build.

23.3.4. 编译完整固件

在编译过程中需请保持网络连接状态良好, 直接使用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
Cloning into '/tmp/tmp.rcRwd2j3CS/disk/opt/scripts'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 29 (delta 4), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (29/29), done.
making ping/ping6 setuid root
Patching: /etc/profile
patching file etc/profile
patch unexpectedly ends in middle of line
Info: [Running: /home/zhan/ebf-image-builder/publish/fire-imx-stable.sh]
Finished populating rootfs Partition
-----------------------------
setup_sdcard.sh script complete
-----------------------------
The default user:password for this image:
debian:temppwd
-----------------------------
Image file: imx6ull-lubancat-carp-console-armhf-2021-04-13.img
-----------------------------
/home/zhan/ebf-image-builder/publish/fire-imx-stable.sh: line 22: 62735 Terminated              keep_net_alive  (wd: ~/ebf-image-builder)

Done.

Tue Apr 13 08:28:58 UTC 2021
Time elapsed: 15 minute(s).

生成的image镜像位于deploy/lubancat-carp-xxx-armhf-202x-xx-xx/目录下, 后缀名为.img,可使用sd卡烧录工具将其烧录到sd卡中。

提示

在镜像的第一次编译过程中,脚本会检测你的电脑的编译环境, 安装编译需要的一些软件包,同时还会从野火官方仓库下载一些构建镜像所需的内容, 所需时间会比较长,请耐心等待。

23.3.5. 单独编译

除了能够编译完整的镜像之外,也能够单独编译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
DTC     arch/arm/dts/imx6ull-14x14-evk.dtb
DTC     arch/arm/dts/imx6ull-fire-mmc.dtb
DTC     arch/arm/dts/imx6ull-fire-nand.dtb
DTC     arch/arm/dts/imx6ull-colibri.dtb
DTC     arch/arm/dts/imx6ull-myir-mys-6ulx-eval.dtb
DTC     arch/arm/dts/imx6ull-phytec-segin-ff-rdk-emmc.dtb
DTC     arch/arm/dts/imx6ull-dart-6ul.dtb
DTC     arch/arm/dts/imx6ull-somlabs-visionsom.dtb
DTC     arch/arm/dts/imx6ulz-14x14-evk.dtb
DTC     arch/arm/dts/imx6-apalis.dtb
DTC     arch/arm/dts/imx6-colibri.dtb
SHIPPED dts/dt.dtb
FDTGREP dts/dt-spl.dtb
CAT     u-boot-dtb.bin
COPY    u-boot.dtb
COPY    u-boot.bin
CFGS    u-boot-dtb.cfgout
MKIMAGE u-boot-dtb.imx
make[1]: Leaving directory '/home/zhan/ebf-image-builder/ebf_linux_uboot'

Done.

生成uboot文件位于build目录下

编译内核

在ebf-image-builder目录下,可使用以下命令只编译内核

1
make kernel

编译内核过程若出现以下提示,请输入密码获取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
LD [M]  sound/soc/fsl/imx-pcm-dma-v2.ko
LD [M]  sound/soc/fsl/imx-pcm-dma.ko
LD [M]  sound/soc/fsl/imx-pcm-fiq.ko
LD [M]  sound/soc/fsl/snd-soc-fsl-acm.ko
LD [M]  sound/soc/fsl/snd-soc-fsl-asrc.ko
LD [M]  sound/soc/fsl/snd-soc-fsl-esai.ko
LD [M]  sound/soc/fsl/snd-soc-fsl-audmix.ko
LD [M]  sound/soc/fsl/snd-soc-fsl-micfil.ko
LD [M]  sound/soc/fsl/snd-soc-fsl-rpmsg-i2s.ko
LD [M]  sound/soc/fsl/snd-soc-fsl-sai.ko
LD [M]  sound/soc/fsl/snd-soc-fsl-ssi.ko
LD [M]  sound/soc/fsl/snd-soc-fsl-utils.ko
LD [M]  sound/soc/fsl/snd-soc-imx-audmux.ko
LD [M]  sound/soc/generic/snd-soc-simple-card-utils.ko
LD [M]  sound/soc/generic/snd-soc-simple-card.ko
LD [M]  sound/soc/fsl/snd-soc-imx-wm8960.ko
LD [M]  sound/soc/generic/snd-soc-simple-scu-card.ko
LD [M]  sound/soc/snd-soc-core.ko
LD [M]  sound/usb/snd-usbmidi-lib.ko
LD [M]  sound/usb/snd-usb-audio.ko
make[2]: Leaving directory '/home/zhan/ebf-image-builder/build/images'
make[1]: Leaving directory '/home/zhan/ebf-image-builder/ebf_linux_kernel'

Done.

Tue Apr 13 08:50:17 UTC 2021

编译成功后,生成文件位于build/images目录下。

编译内核安装包

在ebf-image-builder目录下,可使用以下命令编译内核安装包

1
make kernel-deb

编译内核过程若出现以下提示,请输入密码获取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
INSTALL debian/headertmp/usr/include/linux/spi/ (1 file)
INSTALL debian/headertmp/usr/include/linux/sunrpc/ (1 file)
INSTALL debian/headertmp/usr/include/linux/wimax/ (1 file)
INSTALL debian/headertmp/usr/include/linux/tc_ematch/ (5 files)
INSTALL debian/headertmp/usr/include/linux/tc_act/ (15 files)
INSTALL debian/headertmp/usr/include/linux/usb/ (13 files)
INSTALL debian/headertmp/usr/include/linux/netfilter/ (88 files)
INSTALL debian/headertmp/usr/include/linux/netfilter/ipset/ (4 files)
INSTALL debian/headertmp/usr/include/asm/ (38 files)
dpkg-deb: building package 'linux-headers-4.19.35-imx6' in '../linux-headers-4.19.35-imx6_2.2LubanCat_armhf.deb'.
dpkg-deb: building package 'linux-libc-dev' in '../linux-libc-dev_2.2LubanCat_armhf.deb'.
dpkg-deb: building package 'linux-image-4.19.35-imx6' in '../linux-image-4.19.35-imx6_2.2LubanCat_armhf.deb'.
dpkg-genbuildinfo --build=binary
dpkg-genchanges --build=binary >../linux-4.19.35-imx6_2.2LubanCat_armhf.changes
dpkg-genchanges: warning: package linux-image-4.19.35-imx6-dbg in control file but not in files list
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/zhan/ebf-image-builder/build/images'

Done.

Tue Apr 13 09:00:28 UTC 2021

编译成功后,生成deb包位于build/debs目录下。

23.4. 使用docker编译鲁班猫系统

除了使用以上方法能够构建新镜像之后,野火还提供了docker镜像, 供经常使用docker的读者,方便地使用docker进行编译。

23.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版本。

23.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

23.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:

23.4.4. docker参考文档

Docker–从实践到入门: https://yeasy.gitbook.io/docker_practice/