24. image-builder编译流程及用户配置

上个章节中介绍使用image-builder项目编译了出野火的鲁班猫镜像, 整个流程相对复杂,普通用户只要能够修改文件配置 编译出适合自己想要的img即可,部分喜欢研究的用户可能想要深入知道整个编译流程的怎么样, 下图展示了完整镜像的大致编译流程,以提供一个分析思路。

未找到图片00|

从中涉及到的脚本文件较多,若有兴趣可根据以上流程逐一展开查看每个脚本中的具体内容。

在本章重点中将介绍一些相关配置文件,方便用户修改出属于自己的镜像。

24.1. image-builder目录

image-builder整体目录如下所示。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#编译前的目录
├── configs          #编译配置信息
├── doc              #说明文档
├── env              #编译环境相关
├── LICENSE          #授权信息
├── local_directory  #本地文件目录
├── local_pkg        #想要往镜像中安装的软件包目录
├── Makefile         #Makefile文件
├── publish          #构建Debian根文件系统相关内容
├── readme.md
├── scripts          #构建脚本
├── target           #目标目录
└── tools            #构建需要的一些工具

#编译后增加的目录
├── build            #编译得到的uboot、内核、内核安装包
├── deploy           #编译得到完整镜像
├── ebf_linux_kernel #编译过程中下载的内核源码
├── ebf_linux_uboot  #编译过程中下载的uboot源码
├── git
├── ignore           #编译过程中产生的临时目录
└── latest_version   #最后一次编译产生得到的镜像名

用户若想要对编译出来的镜像做些调整,主要需要涉及到的目录为configs目录, configs目录也是本章讲解的重点章节。其中config目录文件如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
.
├── boards
│   ├── ebf_imx_6ull_mini.conf
│   └── ebf_imx_6ull_pro.conf
├── common.conf
├── functions
│   ├── build
│   ├── common-functions
│   ├── functions
│   └── git-repo
└── user.conf
  • boards: 该目录主要存放板级相关配置信息,在后面将逐渐添加新的板子。

  • common.conf: 通用的配置信息,包括软件源、需要预安装的软件包等信息。

  • function: 编译相关脚本,实现uboot、kernel等编译,用户可以不关心。

  • user.conf: 用户的配置文件,用户账号密码、以及上电时打印提示信息等。

24.2. local_directory和local_pkg目录

用户若想要往板子里添加一些自己的文件,可将这些文件放在local_directory目录下, 在构建完整的镜像时,这些文件将被拷贝到/usr/share/目录下。

同样若用户想要添加一些自己编译的deb包,可将这些deb包放在local_pkg目录下, 在构建镜像时将会自动安装。

24.3. config/boards目录

config/boards目录主要存在野火linux具体开发板的配置信息, 在通常情况下这个目录下的配置文件不需要用户修改,仅做为了解即可。 目前仅包含6ull mini开发板以及6ull pro开发板的配置信息, 在未来随着新开发板的发布将添加新单板的配置信息,6ull mini开发和6ull pro开发板最大的区别在于pro开发板 的板载外设更为丰富,开启了更多的设备树插件。接下来以ebf_imx_6ull_pro.conf为例介绍相关配置内容。

config/boards/ebf_imx_6ull_pro.conf
  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
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
## [Git Remote Repository]
SUPPORTED_UBOOT=("2020.10")
SUPPORTED_UBOOT_TAGS=("latest" "ebf_imx_4.19_2020_12_09")
SUPPORTED_LINUX=("4.19.71" "4.19.35")
SUPPORTED_LINUX_TAGS=("latest" "ebf_imx_4.19_2020_12_09")

case "$UBOOT" in
        2020.10)
                UBOOT_GIT_BRANCH="ebf_v2020_10_imx"
                UBOOT_COMPILER="arm-linux-gnueabihf-"
                UBOOT_DIR="$ROOT/ebf_linux_uboot"
                UBOOT_BUILD_FILE="u-boot-dtb.imx"
                NUBOOT_FILE="u-boot-nand.imx"
                MUBOOT_FILE="u-boot-mmc.imx"
                UBOOT_MMC_DEFCONFIG="mx6ull_fire_mmc_defconfig"
                UBOOT_NAND_DEFCONFIG="mx6ull_fire_nand_defconfig"
                ;;
esac

case "$UBOOT_TAGS" in
        latest)
                UBOOT_GIT_TAGS=""
                ;;
        ebf_imx_4.19_2020_12_09)
                UBOOT_GIT_TAGS="ebf_imx_4.19_2020_12_09"
                ;;
esac

case "$LINUX" in
        4.19.71)
                LINUX_MMC_DTB="imx6ull-mmc-npi.dtb"
                LINUX_NAND_DTB="imx6ull-nand-npi.dtb"
                LINUX_GIT_BRANCH="ebf_4.19_imx"
                LINUX_DEFCONFIG="npi_v7_defconfig"
                KERNEL_COMPILER="arm-linux-gnueabihf-"
                LINUX_DIR="$ROOT/ebf_linux_kernel"
                LOCAL_VERSION="-imx6"
                KERNEL_DEB="linux-image-${LINUX}${LOCAL_VERSION}_${KDEB_VERSION}_armhf.deb"
                ;;

        4.19.35)
                LINUX_MMC_DTB="imx6ull-mmc-npi.dtb"
                LINUX_NAND_DTB="imx6ull-nand-npi.dtb"
                LINUX_GIT_BRANCH="ebf_4.19.35_imx6ul"
                LINUX_DEFCONFIG="npi_v7_defconfig"
                KERNEL_COMPILER="arm-linux-gnueabihf-"
                LINUX_DIR="$ROOT/ebf_linux_kernel"
                LOCAL_VERSION="-imx6"
                KERNEL_DEB="linux-image-${LINUX}${LOCAL_VERSION}_${KDEB_VERSION}_armhf.deb"
                ;;
esac

case "$LINUX_TAGS" in
        latest)
                LINUX_GIT_TAGS=""
                ;;
        ebf_imx_4.19_2020_12_09)
                LINUX_GIT_TAGS="ebf_imx_4.19_2020_12_09"
                ;;
esac

## [Image Build Info]
   ARCH="arm"
   time=$(date +%Y-%m-%d)
   image_name="${deb_distribution}-${release}-${DISTRIB_TYPE}-${deb_arch}-${time}"
   target_name="imx6ull"
   options="--img-2gb ${target_name}-${image_name} --enable-fat-partition"
   options="${options} --enable-uboot-cape-overlays --force-device-tree ${LINUX_MMC_DTB} "
   options="${options} --backup-device-tree ${LINUX_NAND_DTB} --bootloader ${BUILD}"
   conf_board="fire-imx6ull-npi"
   chroot_COPY_SETUP_SDCARD="enable"
   chroot_bootPart_logo="enable"
   chroot_custom_setup_sdcard="imxv7_setup_sdcard.sh"

## [Bootloader Partition]
   bootloader_location="dd_uboot_boot"
   boot_name="$MUBOOT_FILE"
   dd_uboot_count=""
   dd_uboot_seek="2"
   dd_uboot_conf=""
   dd_uboot_bs="512"
   conf_boot_startmb="4"
   conf_boot_endmb="40"
   conf_boot_fstype="fat"
   conf_root_device="/dev/mmcblk0"
   USE_LOCAL_BOOT="yes"

##      [CPU Perfermance]
   CPUMIN=19800000
   CPUMAX=79200000
   GOVERNOR=performance

##      [Device Tree Overlays]
OVERLAYS="
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-i2c1.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-i2c2.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-74hc595.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-485r1.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-485r2.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-adc1.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-hdmi.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-cam.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-btwifi.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-can1.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-can2.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-dht11.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-ecspi3.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-key.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-lcd.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-touch-capacitive-goodix.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-led.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-sound.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-uart2.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-uart3.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/overlays/imx-fire-mpu6050.dtbo
"
  • 第2-5行,关于uboot、linux内核git远程仓库的版本信息。

  • 第7-27行,关于uboot编译相关的一些信息,如git仓库分支,编译工具链,编译生成的uboot文件名, 以及uboot配置文件信息等。

  • 第29-53行,关于内核设备树文件,git仓库分支,编译工具链,内核仓库分支,内核配置文件,以及生成的 deb包文件。

  • 第75-81,关于uboot需要烧录到sd卡的位置,其中 dd_uboot_seek 表示块偏移, dd_uboot_bs 表示块大小(单位为字节),imx6ull规定若想从sd启动 u-boot.imx要有一个 1Kbyte 的偏移。

  • 第82-86,设置boot分区大小以及文件系统类型等。其中 conf_boot_endm表示boot分区的大小, conf_boot_startmb表示整个uboot的起始地址,两个单位都是mb。

  • 第94-116行,镜像默认配置的设备树插件。

24.4. config/common.conf配置文件

在common.conf文件的内容主要是一些通用的配置文件, 在通常情况下该配置文件不需要用户修改,仅做简单了解即可。

config/common.conf
  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
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
## [Project Path]
   ROOT="$(dirname "$(dirname "$(readlink -fm "$0")")")"
   CONFIG="$ROOT/configs"
   BOARD_CONFIG="$CONFIG/boards"
   BUILD="$ROOT/build"
   BUILD_IMAGES="$BUILD/images"
   BUILD_DEBS="$BUILD/debs"
   BUILD_SCRIPT="$ROOT/scripts"
   LOCAL_PKG="$ROOT/local_pkg"
   LOCAL_DIR="$ROOT/local_directory"

## [download mirror]
   DEBIAN_MIRROR='deb.debian.org/debian'
   UBUNTU_MIRROR='ports.ubuntu.com/'
   if [[ $DOWNLOAD_MIRROR == china ]] ; then
         DEBIAN_MIRROR='mirrors.tuna.tsinghua.edu.cn/debian'
         UBUNTU_MIRROR='mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/'
   fi
   #repo_external_server="https://Embedfire.github.io"
   repo_external_server="https://cloud.embedfire.com/mirrors/ebf-debian"
   #repo_external_server="https://cloud.embedfire.com/mirrors/ebf-test"
   repo_external_server_backup1="https://Embedfire.github.io/"
   repo_external_server_backup2="https://sourceforge.net/projects/embedfire-debian-sources/files/"

## [pakage features]
   if [[ $DISTRIBUTION == Debian ]]; then
         release="carp"
         deb_distribution="lubancat"
         deb_codename=$DISTRIB_RELEASE
         deb_arch="armhf"
         deb_components="main contrib non-free"
         deb_mirror=$DEBIAN_MIRROR
         repo_external_dist=$DISTRIB_RELEASE
         repo_external_components="main"
         KDEB_VERSION="2.2LubanCat"
   else
         deb_distribution="ubuntu"
         deb_codename=$DISTRIB_RELEASE
         deb_arch="armhf"
         deb_components="main universe multiverse"
         repo_external_dist=$DISTRIB_RELEASE
         repo_external_components="main"
         deb_mirror=$UBUNTU_MIRROR
         if [[ $DISTRIB_RELEASE == bionic ]]; then
         release="18.04"
         KDEB_VERSION="18.04-Ubuntu"
         fi

         if [[ $DISTRIB_RELEASE == focal ]]; then
         release="20.04"
         KDEB_VERSION="20.04-Ubuntu"
         fi

   fi
   chroot_tarball="enable"

## [install default pakage]
   deb_arch="armhf"
   deb_include="apt-transport-https ca-certificates connman curl dosfstools\
                           gnupg gnupg2 ifupdown initramfs-tools isc-dhcp-client nano \
                           net-tools netcat rsync sudo udhcpd parted mtd-utils mmc-utils\
                           rng-tools haveged wpasupplicant udhcpc openssh-server avahi-daemon\
                           gpiod kpartx jq libgpiod-dev rfkill usbutils exfat-fuse exfat-utils"
   deb_exclude="aptitude aptitude-common groff-base info install-info man-db manpages\
                           manpages-dev tasksel tasksel-data"

## [install extern pakage]
   repo_external_arch="armhf"
   repo_external="enable"
   repo_external_key="keyfile"
   repo_local_file="enable"
   case $DISTRIB_TYPE in
   console)
         repo_external_pkg_list="kobs-ng-for-imx6ull fire-config-v2 wifi-depent"
         system_directory="/usr/share"
   ;;
   qt)
         repo_external_pkg_list="kobs-ng-for-imx6ull fire-config-v2 wifi-depent ebf-qtdemo"
         system_directory="/usr/share"
   ;;
   desktop)
         repo_external_pkg_list="kobs-ng-for-imx6ull fire-config-v2 wifi-depent xfce4"
         system_directory="/usr/share"
   ;;
   esac

## [U-boot & Linux GitHub info]
   if [[ $DOWNLOAD_MIRROR == china ]] ; then
         LINUX_SOURCE_URL="https://e.coding.net/embedfire/lubancat/ebf_linux_kernel"
         UBOOT_SOURCE_URL="https://gitee.com/Embedfire/ebf_linux_uboot"
   else
         LINUX_SOURCE_URL="https://github.com/Embedfire/ebf_linux_kernel"
         UBOOT_SOURCE_URL="https://github.com/Embedfire/ebf_linux_uboot"
   fi
   GIT_CLONE_OPTIONS="--depth=1"
   FENIX_BRANCH="master"
   ROOTFSCACHE_VERSION=6
   DATE=$(date +%F | sed 's/-//g')
   IMAGE_RELEASE_VERSION="${DATE:2}"

## [CPU info]
   NR_JOBS_MAX=20
   NR_CPUS=$(grep -c processor /proc/cpuinfo)
   if [ ${NR_CPUS} -le ${NR_JOBS_MAX} ]; then
         NR_JOBS=${NR_CPUS}
   else
         NR_JOBS=${NR_JOBS_MAX}
fi

## [Define colors]
   BLACK="\e[0;30m"
   BOLDBLACK="\e[1;30m"
   RED="\e[0;31m"
   BOLDRED="\e[1;31m"
   GREEN="\e[0;32m"
   BOLDGREEN="\e[1;32m"
   YELLOW="\e[0;33m"
   BOLDYELLOW="\e[1;33m"
   BLUE="\e[0;34m"
   BOLDBLUE="\e[1;34m"
   MAGENTA="\e[0;35m"
   BOLDMAGENTA="\e[1;35m"
   CYAN="\e[0;36m"
   BOLDCYAN="\e[1;36m"
   WHITE="\e[0;37m"
   BOLDWHITE="\e[1;37m"
   ENDCOLOR="\e[0m"

## [Enable Proxy?]
   #apt_proxy=localhost:3142/

## [info colors]
   ERROR="${RED}Error:${ENDCOLOR}"
   WARNING="${YELLOW}Warning:${ENDCOLOR}"
   INFO="${GREEN}Info:${ENDCOLOR}"
  • 第2-10行,定义一些工程路径。

  • 第13-23行,构建的镜像源定义,可通过修改这部分修改默认的镜像源。

  • 第26-54行,关于系统版本的一些定义。

  • 第58-65行,关于镜像需要安装的软件包,用户可自行添加需要默认软件名,如gcc之类的。

  • 第72-85行,根据纯净版、qt版以及桌面版镜像选择不同的软件包安装。

  • 第88-94行,通过编译是否选择参数DOWLOAD_MIRROR=china 选择不同的源码下载地址。

24.5. configs/user.conf文件

configs/user.conf文件 包含debian和ubuntu版本的用户配置信息,其中包括 用户账号密码、本地语言、以及上电时打印提示信息等。

config/user.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## [user setting]
if [[ $DISTRIBUTION == Debian ]]; then
    rfs_username="debian"
    rfs_fullname="DemoUser"
    rfs_password="temppwd"
    rfs_hostname="npi"
    rfs_default_locale="en_US.UTF-8"
    rfs_etc_dogtag="embedfire.com Debian Image"
    rfs_console_banner="Support/FAQ: www.firebbs.cn/forum.php"
    rfs_console_user_pass="enable"
    rfs_ssh_banner="Support/FAQ: www.firebbs.cn/forum.php"
    rfs_ssh_user_pass="enable"

else
    rfs_username="ubuntu"
    rfs_fullname="DemoUser"
    rfs_password="temppwd"
    rfs_hostname="npi"
    rfs_default_locale="en_US.UTF-8"
    rfs_etc_dogtag="embedfire.com Debian Image"
    rfs_console_banner="Support/FAQ: www.firebbs.cn/forum.php"
    rfs_console_user_pass="enable"
    rfs_ssh_banner="Support/FAQ: www.firebbs.cn/forum.php"
    rfs_ssh_user_pass="enable"
  • 第3、5行,可配置用户创建的账户密码。

  • 第7行,可配置系统使用的本地语言。

  • 第8-9行,可配置开发板启动完成后,串口打印的信息。

  • 第11行,可配置使用ssh登录时,打印的信息。

进入系统之后可以通过修改 /etc/issue文件,修改串口上电以及ssh登录的打印提示信息。