3. SDK编译流程及用户配置¶
上个章节中介绍使用image-builder项目编译了出野火的imx8mmini系统镜像, 整个流程相对复杂,普通用户只要能够修改文件配置 编译出适合自己想要的img即可,部分喜欢研究的用户可能想要深入知道整个编译流程的怎么样, 下图展示了完整镜像的大致编译流程,以提供一个分析思路。
从中涉及到的脚本文件较多,若有兴趣可根据以上流程逐一展开查看每个脚本中的具体内容。
在本章重点中将介绍一些相关配置文件,方便用户修改出属于自己的镜像。
3.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 | configs
├── boards
│ └── ebf_imx_8m_mini.conf
├── common.conf
├── functions
│ ├── build
│ ├── common-functions
│ ├── functions
│ └── git-repo
└── user.conf
|
boards: 该目录主要存放板级相关配置信息,在后面将逐渐添加新的板子。
common.conf: 通用的配置信息,包括软件源、需要预安装的软件包等信息。
function: 编译相关脚本,实现uboot、kernel等编译,用户可以不关心。
user.conf: 用户的配置文件,用户账号密码、以及上电时打印提示信息等。
3.2. local_directory和local_pkg目录¶
用户若想要往板子里添加一些自己的文件,可将这些文件放在local_directory目录下, 在构建完整的镜像时,这些文件将被拷贝到/usr/share/目录下。
同样若用户想要添加一些自己编译的deb包,可将这些deb包放在local_pkg目录下, 在构建镜像时将会自动安装。
3.3. config/boards目录¶
config/boards目录主要存在野火linux具体开发板的配置信息, 在通常情况下这个目录下的配置文件不需要用户修改,仅做为了解即可。
接下来以ebf_imx_8m_mini.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 | ## [Git Remote Repository]
SUPPORTED_UBOOT=("2020.04")
SUPPORTED_UBOOT_TAGS=("latest")
SUPPORTED_LINUX=("5.4.47")
SUPPORTED_LINUX_TAGS=("latest")
case "$UBOOT" in
2020.04)
UBOOT_GIT_BRANCH="imx_v2020.04_5.4.47_2.2.0"
UBOOT_COMPILER="aarch64-linux-gnu-"
UBOOT_DIR="$ROOT/ebf_linux_uboot"
SPL_BUILD_FILE="u-boot-spl.bin"
UBOOT_BUILD_FILE="u-boot-nodtb.bin"
NUBOOT_FILE="u-boot-nodtb.bin"
MUBOOT_FILE="u-boot-nodtb.bin"
UBOOT_MMC_DEFCONFIG="imx8mm_fire_mmc_defconfig"
UBOOT_NAND_DEFCONFIG="imx8mm_fire_mmc_defconfig"
UBOOT_DTB="imx8mm-fire-mmc.dtb"
BUILD_BIN_SCRIPT="create_imx8mm_uboot_bin.sh"
SCRIPT_URL="https://gitee.com/Embedfire/ebf-imx-mkimage.git"
SCRIPT_DIR="ebf-imx-mkimage"
;;
esac
case "$UBOOT_TAGS" in
latest)
UBOOT_GIT_TAGS=""
;;
esac
case "$LINUX" in
5.4.47)
LINUX_MMC_DTB="freescale/imx8mm-ebf-basic.dtb"
LINUX_NAND_DTB="freescale/imx8mm-ebf-basic.dtb"
LINUX_GIT_BRANCH="ebf_5.4.47_imx8mmini"
LINUX_DEFCONFIG="imx_v8_defconfig"
KERNEL_COMPILER="aarch64-linux-gnu-"
LINUX_DIR="$ROOT/ebf_linux_kernel"
LOCAL_VERSION="-imx8mm"
KERNEL_DEB="linux-image-${LINUX}${LOCAL_VERSION}_${KDEB_VERSION}_arm64.deb"
;;
esac
case "$LINUX_TAGS" in
latest)
LINUX_GIT_TAGS=""
;;
esac
## [Image Build Info]
ARCH="arm64"
deb_arch="arm64"
time=$(date +%Y-%m-%d)
image_name="${deb_distribution}-${release}-${DISTRIB_TYPE}-${deb_arch}-${time}"
target_name="imx8m-mini"
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-imx8m-mini-npi"
chroot_COPY_SETUP_SDCARD="enable"
chroot_bootPart_logo="enable"
chroot_custom_setup_sdcard="imxv7_setup_sdcard.sh"
include_firmware="enable"
##chroot_very_small_image="enable"
## [extern pakage]
ebf_repo_dist="carp-imx8"
repo_external_arch="arm64"
if [[ $DISTRIB_RELEASE == bullseye ]]; then
deb_release_pkgs="systemd-timesyncd"
fi
##repo_local_file="enable"
##python3_pkgs="Adafruit-Blinka python-periphery pyserial"
## [system conf]
rfs_default_locale="zh_CN.UTF-8"
## use systemdnetwork
## rfs_use_systemdnetworkd="enable"
## [Bootloader Partition]
bootloader_location="dd_uboot_boot"
boot_name="$MUBOOT_FILE"
dd_uboot_count=""
dd_uboot_seek="66"
dd_uboot_conf=""
dd_uboot_bs="512"
conf_boot_startmb="4"
conf_boot_endmb="200"
conf_boot_fstype="fat"
conf_root_device="/dev/mmcblk1"
USE_LOCAL_BOOT="yes"
## [Firmware]
ROOT_FIRMWARE_PATH=""
NEED_EXT4_IMG="false"
## [Device Tree Overlays]
OVERLAYS="
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-i2c2.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-i2c3.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-i2c4.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-rx8010sj.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-leds.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-keys.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-uart3.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-uart4.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-rs485.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-rs232.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-pwm1.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-pwm2.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-pwm3.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-pwm4.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-spi2.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-cam.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-hdmi.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-mipi-hx8399.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-touch-capacitive-goodix.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-sound.dtbo
dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-pcie.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx8mm-fire-rpmsg.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx-fire-dht11.dtbo
#dtoverlay=/usr/lib/linux-image-${LINUX}${LOCAL_VERSION}/freescale/overlays/imx-fire-ds18b20.dtbo
"
|
第2-6行,关于uboot、linux内核git远程仓库的版本信息。
第7-30行,关于uboot编译相关的一些信息,如git仓库分支,编译工具链,编译生成的uboot文件名, 以及uboot配置文件信息等。
第31-48行,关于内核设备树文件,git仓库分支,编译工具链,内核仓库分支,内核配置文件,以及生成的 deb包文件。
第50-78行,设置镜像名称、框架,以及一些标志是否使能开启。
第80-94行,设置boot分区大小以及文件系统类型等。其中 conf_boot_endm表示boot分区的大小, conf_boot_startmb表示整个uboot的起始地址,两个单位都是mb。
第97-120行,镜像默认配置的设备树插件。
3.4. config/common.conf配置文件¶
在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 选择不同的源码下载地址。
3.5. configs/user.conf文件¶
configs/user.conf文件 包含debian和ubuntu版本的用户配置信息,其中包括 用户账号密码、本地语言、以及上电时打印提示信息等。
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登录的打印提示信息。