LV05-04-rootfs-02-Buildroot构建根文件系统

本文主要是rootfs——Buildroot构建根文件系统的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
PC端开发环境 Windows Windows11
Ubuntu Ubuntu20.04.2的64位版本
VMware® Workstation 17 Pro 17.6.0 build-24238078
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
Win32DiskImager Win32DiskImager v1.0
Linux开发板环境 Linux开发板 正点原子 i.MX6ULL Linux 阿尔法开发板
uboot NXP官方提供的uboot,使用的uboot版本为U-Boot 2019.04
linux内核 linux-4.19.71(NXP官方提供)
点击查看本文参考资料
分类 网址 说明
官方网站 https://www.arm.com/ ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.nxp.com.cn/ NXP官方网站
https://www.nxpic.org.cn/NXP 官方社区
https://u-boot.readthedocs.io/en/latest/u-boot官网
https://www.kernel.org/linux内核官网
点击查看相关文件下载
分类 网址 说明
NXP https://github.com/nxp-imx NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库
nxp-imx/linux-imx/releases/tag/v4.19.71 NXP linux内核仓库tags中的v4.19.71
nxp-imx/uboot-imx/releases/tag/rel_imx_4.19.35_1.1.0 NXP u-boot仓库tags中的rel_imx_4.19.35_1.1.0
I.MX6ULL i.MX 6ULL Applications Processors for Industrial Products I.MX6ULL 芯片手册(datasheet,可以在线查看)
i.MX 6ULL Applications ProcessorReference Manual I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网)
Source Code https://elixir.bootlin.com/linux/latest/source linux kernel源码
https://elixir.bootlin.com/u-boot/latest/source uboot源码

一、编译前的准备

1. 依赖安装

Buildroot的使用是需要依赖源码包的,它会去寻找要编译的源码包,我们可以选择网络上的的源码包也可以选择本地的源码包,那么在这里我们就只选择本地的kernel与uboot源码包,前面我们也编译了kernel与uboot。

有一点要注意,更新了本地的源码包要用git记录,否则Buildroot不知道我们已经更新过的。

根据Buildroot官方文档说明,Buildroot会强制性使用一些工具包(The Buildroot user manual):

1
sudo apt-get install -y sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio python unzip rsync file bc wget g++-multilib

这是为了Buildroot能正常编译,因此我们在使用前尽量查看一下当前系统的环境下是否存在这些软件包,或者可以直接通过sudo apt-get install命令去下载它们。

2. 选择配置文件

Buildroot为了方便用户使用,在configs目录下提前配置好了很多平台的配置,我们可以在这里找一个与我们开发板最符合的配置文件,然后根据文件中的配置来修改出我们开发板的配置文件即可。一般来说我们可以以imx6ulevk_defconfig这个文件为基础进行修改。我们现在不修改,直接以这个文件作为配置文件,我们可以运行以下命令将其写入到 .config 文件:

1
make imx6ulevk_defconfig
image-20241102191348911

很显然这操作过程与我们编译内核的过程是一样的,都是将配置文件的信息写入当前目录下的 .config文件中,然后通过make menuconfig 命令进行配置:

image-20241102191429975

这一张图好像有点大,后面就直接复制了,不截图了。

3. menuconfig配置项说明

我们前面已经可以用命令打开图形配置界面了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
─────────────────────────────────────────────────────────────────────────────────────
┌───────────────────── Buildroot 2024.08-rc3 Configuration ──────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ Target options ---> │ │
│ │ Toolchain ---> │ │
│ │ Build options ---> │ │
│ │ System configuration ---> │ │
│ │ Kernel ---> │ │
│ │ Target packages ---> │ │
│ │ Filesystem images ---> │ │
│ │ Bootloaders ---> │ │
│ │ Host utilities ---> │ │
│ │ Legacy config options ---> │ │
│ │ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘

3.1 Target options --->

目标单板架构配置,在这里主要是选择要编译的平台架构,如cortex-A7;选择CPU的大小端模式,选择支持浮点等等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
→ Target options ────────────────────────────────────────────────────────────────────
┌──────────────────────────────── Target options ────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ Target Architecture (ARM (little endian)) ---> │ │
│ │ Target Architecture Variant (cortex-A7) ---> │ │
│ │ Target ABI (EABIhf) ---> │ │
│ │ Floating point strategy (NEON/VFPv4) ---> │ │
│ │ ARM instruction set (ARM) ---> │ │
│ │ Target Binary Format (ELF) ---> │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘

3.2 Build options --->

编译相关的配置,主要是一些编译时用到的选项,比如设置当前配置的保存位置(Location to save buildroot config),根据自己的路径设置即可,设置dl的路径(下载代码包使用的路径:$(TOPDIR)/dl),多个线程编译的线程数量(如果设置为0则自动选择多个线程编译),是否使能编译器缓冲区;设置下载镜像Mirrors and Download locations:一般来说Buildroot会默认从国外的网站下载镜像,而在国内下载则很慢,我们可以修改镜像源:

1
2
3
4
5
6
7
8
# 设置下载镜像Mirrors and Download locations:
内核镜像源:https://mirror.bjtu.edu.cn/kernel
GNU镜像源:https://mirrors.tuna.tsinghua.edu.cn/gnu/
清华镜像站汇总:https://mirrors.tuna.tsinghua.edu.cn/

# 提示:用清华镜像站会找不到内核。
北京交通大学镜像站:https://mirror.bjtu.edu.cn/
中国科学技术大学镜像站:http://mirrors.ustc.edu.cn/

Build options具体配置如下:

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
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
→ Build options ─────────────────────────────────────────────────────────────────────
┌──────────────────────────────── Build options ─────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ Commands ---> │ │
│ │ (/home/sumu/7Linux/buildroot-2024.08-rc3/configs/imx6ulevk_defconfig) Lo│ │
│ │ ($(TOPDIR)/dl) Download dir │ │
│ │ ($(BASE_DIR)/host) Host dir │ │
│ │ Mirrors and Download locations ---> │ │
│ │ (0) Number of jobs to run simultaneously (0 for auto) │ │
│ │ [ ] Enable compiler cache │ │
│ │ [ ] build packages with debugging symbols │ │
│ │ [ ] build packages with runtime debugging info │ │
│ │ [*] strip target binaries │ │
│ │ () executables that should not be stripped │ │
│ │ () directories that should be skipped when stripping │ │
│ │ gcc optimization level (optimization level 2) ---> │ │
│ │ [ ] build packages with link-time optimisation │ │
│ │ libraries (shared only) ---> │ │
│ │ ($(CONFIG_DIR)/local.mk) location of a package override file │ │
│ │ () global patch and hash directories │ │
│ │ Advanced ---> │ │
│ │ [ ] Build Y2038-ready code │ │
│ │ *** Security Hardening Options *** │ │
│ │ -*- Build code with PIC/PIE │ │
│ │ Stack Smashing Protection (-fstack-protector-strong) ---> │ │
│ │ RELRO Protection (Full) ---> │ │
│ │ Buffer-overflow Detection (FORTIFY_SOURCE) (Conservative) ---> │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘

Mirrors and Download locations --->配置项如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
→ Build options → Mirrors and Download locations ────────────────────────────────────
┌──────────────────────── Mirrors and Download locations ────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ () Primary download site │ │
│ │ (https://sources.buildroot.net) Backup download site │ │
│ │ (https://cdn.kernel.org/pub) Kernel.org mirror │ │
│ │ (http://ftpmirror.gnu.org) GNU Software mirror │ │
│ │ (http://rocks.moonscript.org) LuaRocks mirror │ │
│ │ (https://cpan.metacpan.org) CPAN mirror (Perl packages) │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘

3.3 Toolchain --->

工具链选项主要是让用户选择合适自己的交叉编译工具链,可以选择Buildroot提供的工具链(内部工具链 Buildroot toolchain ),也可以指定其他非Buildroot提供的工具链(外部工具链 External toolchain ),我们默认选择外部提供的工具链: arm-linux-gnueabihf-gcc ,C库可以选择uClibc-ng,、glibc 和musl,我们选择glibc,还有选择内核头文件版本(要求比目标内核版本新)、是否使能宽字符(WCHAR)支持(如果需要支持Python则需要使能)、选择gcc编译器版本、是否使能c++等,具体配置如下:

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
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
→ Toolchain ─────────────────────────────────────────────────────────────────────────
┌────────────────────────────────── Toolchain ───────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ Toolchain type (Buildroot toolchain) ---> │ │
│ │ *** Toolchain Buildroot Options *** │ │
│ │ (buildroot) custom toolchain vendor name │ │
│ │ C library (glibc) ---> │ │
│ │ *** Kernel Header Options *** │ │
│ │ Kernel Headers (Same as kernel being built) ---> │ │
│ │ Custom kernel headers series (5.15.x) ---> │ │
│ │ *** Glibc Options *** │ │
│ │ [ ] Enable compatibility shims to run on older kernels │ │
│ │ [ ] Install glibc utilities │ │
│ │ *** Binutils Options *** │ │
│ │ Binutils Version (binutils 2.41) ---> │ │
│ │ [ ] gprofng support │ │
│ │ () Additional binutils options │ │
│ │ *** GCC Options *** │ │
│ │ GCC compiler Version (gcc 13.x) ---> │ │
│ │ () Additional gcc options │ │
│ │ [ ] Enable C++ support │ │
│ │ [ ] Enable Fortran support │ │
│ │ [ ] Enable compiler OpenMP support │ │
│ │ [ ] Enable graphite support │ │
│ │ *** Host GDB Options *** │ │
│ │ [ ] Build cross gdb for the host │ │
│ │ *** Toolchain Generic Options *** │ │
│ │ [ ] Copy gconv libraries │ │
│ │ () Extra toolchain libraries to be copied to target │ │
│ │ () Target Optimizations │ │
│ │ () Target linker options │ │
│ │ *** Bare metal toolchain *** │ │
│ │ [ ] Build a bare metal toolchain │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘

3.4 System configuration --->

系统相关的配置,比如配置系统主机名,它的主要作用是:在一个局域网中,每台机器都有一个主机名,用于主机与主机之间的便于区分,就可以为每台机器设置主机名,以便于以容易记忆的方法来相互访问;设置登陆界面的欢迎信息。选择密码的加密方式,我们可以选择SHA256加密算法(sha-25),设置root登陆的密码、设置默认的命令行终端(我们默认选择bash)、设置默认的登陆串口(开发板连接到电脑的输入/输出)、设置系统默认的环境变量(PATH)、以及选择构建系统镜像版本,根文件系统覆盖(野火的配置中就将一些脚本与相关内容放到 board/embedfire/ebf-imx6ull-pro/rootfs-overlay 目录下,在制作成文件系统时将这些文件添加到文件系统中)、以及一些运行的脚本(buildroot官方为imx6ull制作的打包脚本: board/freescale/common/imx/post-image.sh )等,具体配置如下:

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
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
→ System configuration ──────────────────────────────────────────────────────────────
┌───────────────────────────── System configuration ─────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ Root FS skeleton (default target skeleton) ---> │ │
│ │ (buildroot) System hostname │ │
│ │ (Welcome to Buildroot) System banner │ │
│ │ Passwords encoding (sha-256) ---> │ │
│ │ Init system (BusyBox) ---> │ │
│ │ /dev management (Dynamic using devtmpfs only) ---> │ │
│ │ (system/device_table.txt) Path to the permission tables │ │
│ │ [ ] support extended attributes in device tables │ │
│ │ [ ] Use symlinks to /usr for /bin, /sbin and /lib │ │
│ │ [*] Enable root login with password │ │
│ │ () Root password │ │
│ │ /bin/sh (busybox' default shell) ---> │ │
│ │ [*] Run a getty (login prompt) after boot ---> │ │
│ │ [*] remount root filesystem read-write during boot │ │
│ │ () Network interface to configure through DHCP │ │
│ │ (/bin:/sbin:/usr/bin:/usr/sbin) Set the system's default PATH │ │
│ │ [*] Purge unwanted locales │ │
│ │ (C en_US) Locales to keep │ │
│ │ () Generate locale data │ │
│ │ [ ] Enable Native Language Support (NLS) │ │
│ │ [ ] Install timezone info │ │
│ │ () Path to the users tables │ │
│ │ () Root filesystem overlay directories │ │
│ │ () Custom scripts to run before commencing the build │ │
│ │ () Custom scripts to run before creating filesystem images │ │
│ │ () Custom scripts to run inside the fakeroot environment │ │
│ │ (board/freescale/common/imx/post-image.sh) Custom scripts to run after c│ │
│ │ () Extra arguments passed to custom scripts │ │
│ │ () Extra arguments passed to POST_IMAGE_SCRIPT │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘
  • Root FS skeleton (default target skeleton) : 根文件系统框架 [默认目标框架]

建议选择默认的根文件系统框架,因为默认的框架是非常小的,可以适应绝大部分的场合,当然,占用资源小也代表功能仅有一点点,读者可以自己往文件系统添加需要的功能,这是可以的。除此之外也可以选择自己的根文件系统框架(custom target skeleton)。

  • (buildroot) System hostname :系统主机名字(自取任意) [buildroot]
  • (Welcome to ixm6ull Buildroot!) System banner:系统开机提示 [Welcome to ixm6ull Buildroot!]
  • Passwords encoding (sha-256):密码编码 [sha-256格式编码]
  • Init system (busybox) →:初始化系统方案 [busybox]

初始化系统方案,目前buildroot中提供2种方案,一种是BusyBox:系统的init程序将在启动时读取/etc/inittab文件,以了解该做什么,默认inittab存储在./package/busybox/inittab中;inittab除了安装几个重要的文件系统之外 ,还要启动/etc/init.d/rcS中的shell脚本,并启动一个getty程序(提供一个登录提示)。另一种是systemV,使用传统sysvinit程序,之前大多数台式机Linux发行版都使用该方案,现在有些变为了Upstart或Systemd,在构建文件系统的时候会在/ect目录下会生成in it.d、rc0.d、rc1.d、rc2.d、rc3.d、rc4.d、rc5.d、rc6.d、rc.loacl等目录和脚本文件,init.d目录下包含的是真正的脚本。

  • /dev management (Dynamic using devtmpfs only) :dev管理方案 [Dynamic using devtmpfs only],就是/dev设备文件的管理方式,可选选项有四个:

(1)Static using device table: 使用静态的设备表,/dev将根据system/device_table _dev.txt的内容创建设备,进入系统添加或删除设备时,无法自动更新;

(2)Dynamic using devtmpfs only:在系统启动过程中,会动态生成/dev文件,进入系统添加或删除设备时,无法自动更新;

(3)Dynamic using devtmpfs + mdev:在前面devtmpfs的基础上加入mdev用户空间实用程序,进入系统添加或删除设备时,可以自动更新,自动创建规则在/etc/mdev.conf;

(4)Dynamic using devtmpfs + eudev:在前面devtmpfs的基础上加入eudev用户空间守护程序,eudev是udev的独立版本,是Systemd的一部分,提供更多的功能也更占用资源;

  • (system/device_table.txt) Path to the permission tables :权限表路径
  • [ ]support extended attributes in device tables:支持设备表中的扩展属性
  • [ ]Use symlinks to /usr for /bin, /sbin and /lib:是否将/bin,/sbin,/lib链接到/usr
  • [*] Enable root login with password:使能root登陆密码
  • () Root password:设置root密码
  • /bin/sh (bash) :选择shell类型 [bash]

一般选择bash即可,用户的体验会很好。除了bash外,还有很多shell工具,比如这里可选busybox自带的shell、小巧但功能很少的dash、高效紧凑的mksh、功能强大体积也稍大的zsh。

  • [*] Run a getty (login prompt) after boot:启动后运行getty(登录提示)
  • [*] remount root filesystem read-write during boot :在引导期间安装根文件系统支持读和写
  • (eth0) Network interface to configure through DHCP:设置DHCP配置的网络接口 [eth0]
  • (/bin:/sbin:/usr/bin:/usr/sbin) Set the system’s default PATH:设置系统的默认路径
  • [*] Purge unwanted locales:清除不需要的区域设置
  • (C en_US) Locales to keep:要保留的语言环境
  • () Generate locale data:生成区域设置数据
  • Enable Native Language Support (NLS) :启用本地语言支持(NLS)
  • -*- Install timezone info :安装时区信息
  • (default) timezone list:时区清单 [典型]
  • (Etc/UTC) default local time :用户表的路径
  • () Path to the users tables
  • () Root filesystem overlay directories:根文件系统覆盖目录

根文件覆盖目录,如果想将某些文件添加到文件系统中,那么可以按照根文件的目录框架进行添加到对应的路径中,在文件系统构建的时候,会将对应的文件添加到文件系统中,如果出现相同的文件则覆盖。

  • () Custom scripts to run before creating filesystem images:在创建文件系统映像之前运行的自定义脚本
  • () Custom scripts to run inside the fakeroot environment:自定义脚本在fakeroot(模拟root权限)环境中运行
  • (board/……) Custom scripts to run after creating filesystem images :创建文件系统映像后运行的自定义脚本
  • () Extra arguments passed to custom scripts:传递给自定义脚本的额外参数

3.5 Kernel --->

linux内核相关的配置,用户可以选择要编译的内核版本及源码,可以从网上下载,除此之外也可以从本地导入(其实对Buildroot来说也算是下载,因为这些文件都会被下载到dl目录下),还可以指定编译内核的默认配置文件( 此处的配置文件不需要后缀名defconfig)、内核二进制文件格式、选择是否编译设备树与指定编译的设备树(DTB)、以及其他的一些扩展。具体配置如下:

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
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
→ Kernel ────────────────────────────────────────────────────────────────────────────
┌──────────────────────────────────── Kernel ────────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ [*] Linux Kernel │ │
│ │ Kernel version (Custom version) ---> │ │
│ │ (5.15.11) Kernel version │ │
│ │ () Custom kernel patches │ │
│ │ Kernel configuration (Using an in-tree defconfig file) ---> │ │
│ │ (imx_v6_v7) Defconfig name │ │
│ │ () Additional configuration fragment files │ │
│ │ () Custom boot logo file path │ │
│ │ Kernel binary format (zImage) ---> │ │
│ │ Kernel compression format (gzip compression) ---> │ │
│ │ [*] Build a Device Tree Blob (DTB) │ │
│ │ [ ] DTB is built by kernel itself │ │
│ │ (imx6ul-14x14-evk) In-tree Device Tree Source file names │ │
│ │ () Out-of-tree Device Tree Source file paths │ │
│ │ [ ] Keep the directory name of the Device Tree │ │
│ │ [ ] Build Device Tree with overlay support │ │
│ │ [ ] Install kernel image to /boot in target │ │
│ │ [*] Needs host OpenSSL │ │
│ │ [ ] Needs host libelf │ │
│ │ [ ] Needs host pahole │ │
│ │ Linux Kernel Extensions ---> │ │
│ │ Linux Kernel Tools ---> │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘

3.6Target packages --->

这个是Buildroot的包管理相关的配置选项,读者可以从这里选择自己需要的软件包,Buildroot 提供了海量软件包可选,只需在配置界面选中所需要的软件包,交叉编译后即可使用。比如添加音视频应用相关的软件包、添加压缩和解压缩相关的软件包、添加字体、游戏、图形库(QT)、语言和脚本(Python、PHP等)、网络(蓝牙、wifi、http工具包)等软件包,在我们开发板就添加了支持QT与Python的软件包,因此可以在开发板中使用QT与Python,由于配置较多,就不再截图,根据配置文件查看即可。注意:Busybox是必选的

假设我们系统中缺失一些库,那么可以在这里选择有没有对应的软件包,如果没有则需要自己手动制作了。具体配置如下:

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
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
→ Target packages ───────────────────────────────────────────────────────────────────
┌─────────────────────────────── Target packages ────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ -*- BusyBox │ │
│ │ (package/busybox/busybox.config) BusyBox configuration file to use? │ │
│ │ () Additional BusyBox configuration fragment files │ │
│ │ [ ] Show packages that are also provided by busybox │ │
│ │ [ ] Individual binaries │ │
│ │ [ ] Install the watchdog daemon startup script │ │
│ │ Audio and video applications ---> │ │
│ │ Compressors and decompressors ---> │ │
│ │ Debugging, profiling and benchmark ---> │ │
│ │ Development tools ---> │ │
│ │ Filesystem and flash utilities ---> │ │
│ │ Fonts, cursors, icons, sounds and themes ---> │ │
│ │ Games ---> │ │
│ │ Graphic libraries and applications (graphic/text) ---> │ │
│ │ Hardware handling ---> │ │
│ │ Interpreter languages and scripting ---> │ │
│ │ Libraries ---> │ │
│ │ Mail ---> │ │
│ │ Miscellaneous ---> │ │
│ │ Networking applications ---> │ │
│ │ Package managers ---> │ │
│ │ Real-Time ---> │ │
│ │ Security ---> │ │
│ │ Shell and utilities ---> │ │
│ │ System tools ---> │ │
│ │ Text editors and viewers ---> │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘

3.7 Filesystem images --->

文件系统镜像配置。可以选择生成的文件系统镜像类型 ,如 tar、cpio、ext2/3/4、 jffs2、 yaffs2 和 ubifs 等。文件系统镜像可能会非常大,具体取决于我们选择的文件系统类型、软件包的数量以及是否配置的可用空间等,具体配置如下:

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
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
→ Filesystem images ─────────────────────────────────────────────────────────────────
┌────────────────────────────── Filesystem images ───────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ [ ] axfs root filesystem │ │
│ │ [ ] btrfs root filesystem │ │
│ │ [ ] cloop root filesystem for the target device │ │
│ │ [ ] cpio the root filesystem (for use as an initial RAM filesystem) │ │
│ │ [ ] cramfs root filesystem │ │
│ │ [ ] erofs root filesystem │ │
│ │ [*] ext2/3/4 root filesystem │ │
│ │ ext2/3/4 variant (ext4) ---> │ │
│ │ (rootfs) filesystem label │ │
│ │ (60M) exact size │ │
│ │ (0) exact number of inodes (leave at 0 for auto calculation) │ │
│ │ (256) inode size │ │
│ │ (5) reserved blocks percentage │ │
│ │ (-O ^64bit) additional mke2fs options │ │
│ │ Compression method (no compression) ---> │ │
│ │ [ ] f2fs root filesystem │ │
│ │ [ ] initial RAM filesystem linked into linux kernel │ │
│ │ [ ] jffs2 root filesystem │ │
│ │ [ ] oci image │ │
│ │ [ ] romfs root filesystem │ │
│ │ [ ] squashfs root filesystem │ │
│ │ [*] tar the root filesystem │ │
│ │ Compression method (no compression) ---> │ │
│ │ () other random options to pass to tar │ │
│ │ [ ] ubi image containing an ubifs root filesystem │ │
│ │ [ ] ubifs root filesystem │ │
│ │ [ ] yaffs2 root filesystem │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘
  • axfs root filesystem:XFS格式根文件系统
  • btrfs root filesystem :btrfs格式根文件系统
  • cloop root filesystem for the target device:clop方式压缩根文件系统
  • cpio the root filesystem (for use as an initial RAM filesystem) :cpio方式压缩根文件系统(用作初始RAM文件系统)
  • cramfs root filesystem:cramf格式根文件系统
  • [*] ext2/3/4 root filesystem :ext2/3/4格式根文件系统
  • ext2/3/4 variant (ext4) :ext4格式根文件系统
  • () filesystem label :文件系统标签
  • (200M) exact size :根文件系统空间大小[200M]
  • (0) exact number of inodes (leave at 0 for auto calculation) :确切的inode数(从0开始自动计算)
  • (5) reserved blocks percentage:保留块百分比 (保留的供root使用,默认5%)
  • (-O ^64bit) additional mke2fs options :额外的mke2fs选项 [禁用64位文件系统]
  • Compression method (no compression) :压缩方式 [无压缩]
  • f2fs root filesystem :f2fs格式根文件系统
  • initial RAM filesystem linked into linux kernel:初始RAM文件系统链接到Linux内核
  • jffs2 root filesystem:jffs2格式根文件系统
  • romfs root filesystem:romfs格式根文件系统
  • squashfs root filesystem :squashfs格式根文件系统
  • [*] tar the root filesystem:tar压缩格式根文件系统
  • Compression method (no compression) :压缩方式 [无压缩]
  • () other random options to pass to tar:传递给tar的其他选项
  • ubi image containing an ubifs root filesystem:ubifs格式根文件系统包含ubi镜像
  • ubifs root filesystem :ubifs格式根文件系统
  • yaffs2 root filesystem:yaffs2格式根文件系统

3.8 Bootloaders --->

Bootloaders相关的配置,在这个配置选项中,读者可以选择要编译的Bootloaders 引导程序(如 grub2、ts4800-mbrboot、uboot 等,我们默认选择uboot),指定uboot的名字、下载的位置(可以是从网上下载,写入正确的URL即可;也可以从本地导入,写入本地路径即可),指定uboot的版本,我们默认使用野火的uboot仓库,使用最新发布的uboot版本,具体配置如下:

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
/home/sumu/7Linux/buildroot-2024.08-rc3/.config - Buildroot 2024.08-rc3 Configuration
→ Bootloaders ───────────────────────────────────────────────────────────────────────
┌───────────────────────────────── Bootloaders ──────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> selects a │
│ feature, while <N> excludes a feature. Press <Esc><Esc> to exit, <?> for │
│ Help, </> for Search. Legend: [*] feature is selected [ ] feature is │
│ ┌────────────────────────────────────────────────────────────────────────────┐ │
│ │ [ ] afboot-stm32 │ │
│ │ [ ] AT91 Bootstrap 3+ │ │
│ │ [ ] ARM Trusted Firmware (ATF) │ │
│ │ [ ] Barebox │ │
│ │ [ ] grub2 │ │
│ │ [ ] mxs-bootlets │ │
│ │ [ ] optee_os │ │
│ │ [ ] s500-bootloader │ │
│ │ [ ] shim │ │
│ │ [*] U-Boot │ │
│ │ Build system (Legacy) ---> │ │
│ │ (mx6ul_14x14_evk) U-Boot board name │ │
│ │ U-Boot Version (Custom version) ---> │ │
│ │ (2021.10) U-Boot version │ │
│ │ () Custom U-Boot patches │ │
│ │ [*] U-Boot needs dtc │ │
│ │ [ ] U-Boot needs host python 3.x │ │
│ │ [ ] U-Boot needs pylibfdt │ │
│ │ [ ] U-Boot needs pyelftools │ │
│ │ [*] U-Boot needs OpenSSL │ │
│ │ [ ] U-Boot needs lzop │ │
│ │ [ ] U-Boot needs gnutls │ │
│ │ [ ] U-Boot needs util-linux │ │
│ │ [ ] U-Boot needs xxd │ │
│ │ [ ] U-Boot use binman │ │
│ │ U-Boot binary format ---> │ │
│ │ [ ] produce a .ift signed image (OMAP) │ │
│ │ [*] Install U-Boot SPL binary image │ │
│ │ (SPL) U-Boot SPL/TPL binary image name(s) │ │
│ │ [ ] Install u-boot-initial-env │ │
│ │ [ ] CRC image for Altera SoC FPGA (mkpimage) │ │
│ │ () Custom make options │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└────────────────────────────────────────────────────────────────────────────────┘

3.9 Host utilities --->

主机通用配置,使用默认配置即可。

3.10 Legacy config options --->

使用默认配置即可。

4. 保存配置文件

当配置完成,退出后会发现所有的配置都被写入当前目录下的 .config文件。如果想将这次配置的文件保存起来,那么可以通过以下命令保存:

1
make savedefconfig

这个命令我也不知道是存了什么东西,我自己就是直接保存.config文件重命名一下就是了。

5. 编译命令

然后我们可以执行 make 命令进行编译操作, make 命令通常会执行以下步骤:

(1)根据配置需要下载源文件

(2)配置、构建和安装交叉编译工具链,或者只是导入外部工具链

(3)配置、构建和安装选定的目标软件包

(4)则构建内核镜像

(5)构建引导加载程序镜像

(6)以所选格式创建根文件系统

执行 make 命令后就等待它编译完成即可,在编译完成后可以在 output/images 目录下找到编译产生的镜像。里面会有编译生成的设备树、内核、文件系统等。

二、Buildroot其他分析

Buildroot是一个非常强大的工具,它可以随意依赖第三方的库以及工具,能快速构建我们需要的内容,如果你想了解一下Buildroot编译生成的内容的一些时间、依赖、大小等情况,通过代码肯定是不方便,Buildroot还提供可视化分析的工具,我们只需一句命令即可使用它们。

照官方文档的说明,需要在主机上安装必须的软件包python-matplotlib 和python-numpy,我们可以通过以下命令进行安装:

1
sudo apt-get install -y python-matplotlib python-numpy

Buildroot的工作之一是了解包之间的依赖关系,并确保它们以正确的顺序构建。 这些依赖关系有时可能非常复杂,对于给定的系统,通常不容易理解为什么这样或那样的包被Buildroot引入并且成功构建。为了帮助理用户解依赖关系,从而更好地理解嵌入式Linux系统中不同组件的作用,Buildroot能够生成依赖关系图,通过make graph-depends命令即可生成对应的依赖文件(默认是PDF格式),具体情况如下:

1
2
# 命令
make graph-depends

当然,Buildroot还能生成关于编译时间与编译占用资源大小的分析图,只需要通过make graph-build与make graph-size命令生成即可,具体见(已删减输出信息):

1
2
make graph-build
make graph-size

然后可以看到在output/graphs目录下多了一些pdf文件,这些就是Buildroot生成的可视化分析文件,可以直接打开他们,具体见:

buildroot buildroot buildroot

三、其他的一些问题

由于buildroot会在国外的网站下载很多东西,所以在下载时会很慢很慢,有可能出现下载失败的情况,那么可以根据日志信息手动去下载对应的软件包。

四、构建根文件系统

1. 简单了解下文件系统

我们先来看一下Linux是如何存储数据的。一般情况下,字符设备以串行方式存储和获取数据,串口是最典型的字符设备;而块设备会一次存取或者获取大小相同的一块区域内的数据。例如,一个硬 盘控制器可以向物理存储介质上指定可寻址地址,一次传送或接收512字节的数据,文件系统正是建立在块设备之上的。

文件系统是存在于一个物理设备的逻辑分区之上的。分区就是对一个物理介质(磁盘、闪存)的逻辑划分,该物理介质上的数据在给定分区类型上按照特定的规则进行组织,物理设备可以只有一个独立分区包含所有可用空间,也可以被划分为多个分区以满足特定需要,就好比我们电脑的磁盘,划分为多个分区以用于不同的需求。

简单了解了文件系统的概念,那么我们就动手制作一个文件系统。

2. buildroot构建根文件系统

文件系统通常要包含很多第三方软件,比如busybox,tslib,qt,vim,交叉编译工具等,为了避免繁杂的移植工作,buildroot应运而生。用户可以直接通过make menuconfig配置自己需要的功能,把不需要的功能去掉,再执行make指令编译,buildroot就会自动从指定的服务器上下载源码包,自动编译,自动搭建成我们所需要的嵌入式根文件系统。

buildroot的文件系统(rootfs)构建流程有一个框架,有些部分是buildroot本身就集成的,但还是有些细节需要自己来实现,我们需要按照格式写脚本,提供必要的构建细节,并且配置整个系统,总之,rootfs是Buildroot中最为复杂的部分。

一般来说,buildroot构建文件系统的运作过程如下:

(1)buildroot将system/skeleton/目录下的内容拷贝到output/target目录下下作为rootfs的模板。

(2)将output/staging/目录下的工具链中动态库拷贝到output/target/对应的目录下。

(3)分别编译每一个应用的package,并将生成的动态库和bin文件install到output/target/对应的目录下。

(4)将package/initscripts/目录下的系统启动脚本install到output/target/对应的目录下。

(5)构建fakeroot环境,在fakeroot环境下修改output/target/中对应的目录文件权限,制作dev节点,并根据用户的配置制作出rootfs 镜像。

fakeroot是一个主机上使用的软件包,它会被buildroot下载编译,用于为构建rootfs提供一个虚拟的root权限环境,只有在root权限下,才能把output/target/中的目录和文件变成root用户,并创建dev节点。有了fakeroot环境,系统构建者无需获取主机的root权限, 也能在fakeroot下把文件改为root用户,并制作root方式。

3. uClibc与glibc的差异

glibc和libc都是Linux下的C函数库,libc是Linux下的ANSI C的函数库;glibc是Linux下的GUN C的函数库;GNU C是一种ANSI C的扩展实现。ANSI C是基本的C语言函数库,包含了C语言最基本的库函数。在写程序时,需要用到很多c语言的库函数,这些所有的库函数整合起来,就是对应的C语言(标准)函数库。

目前在普通GNU/Linux系统中所用的C语言标准库,叫做glibc。它的功能很全,函数很多,但是就是因为代码太多,编译出来的函数库的大小也很大,占用的资源也很多,可以简单地认为glibc就是为了实现完整功能设计的。

由于在嵌入式系统中,也需要C语言写代码实现特定功能,因此需要用到C语言函数库,但是由于嵌入式系统中,一般资源比较有限,所以不适合直接使用太占用资源的glibc。uClibc 是一个面向嵌入式Linux系统的小型的C标准库,最初uClibc是为了支持uClinux而开发,这是一个不需要内存管理单元(MMU)的Linux版本。uClibc比一般用于Linux发行版的C库GNU C Library (glibc)要小得多, 因此uClibc专注于嵌入式Linux,除此之外uClibc比glibc更可配置,这意味着开发人员可以根据功能与空间需求进行裁剪。

简单总结以下几点:

(1)uClibc比glibc占用的资源小,虽然uClibc和glibc在已有的接口上是兼容的,而且采用uClibc编译应用程序比采用glibc编译应用程序要更方便,但是uClibc并没有包括glibc中的所有接口实现,因此有些应用可能在uClibc中不能编译。

(2)uClibc在可配置性上比glibc要好。

提示:关于uClibc与glibc更多的差异比较信息请看 简单总结以下几点:

  1. uClibc比glibc占用的资源小,虽然uClibc和glibc在已有的接口上是兼容的,而且采用uClibc编译应用程序比采用glibc编译应用程序要更方便,但是uClibc并没有包括glibc中的所有接口实现,因此有些应用可能在uClibc中不能编译。
  2. uClibc在可配置性上比glibc要好。

提示:关于uClibc与glibc更多的差异比较信息请看:简单总结以下几点:

  1. uClibc比glibc占用的资源小,虽然uClibc和glibc在已有的接口上是兼容的,而且采用uClibc编译应用程序比采用glibc编译应用程序要更方便,但是uClibc并没有包括glibc中的所有接口实现,因此有些应用可能在uClibc中不能编译。
  2. uClibc在可配置性上比glibc要好。

关于uClibc与glibc更多的差异比较信息请看:Comparison of C/POSIX standard library implementations for Linux (etalabs.net)

4. 配置Buildroot

按这里配置:《01嵌入式开发/02IMX6ULL平台/LV05-uboot与内核/LV05-03-根文件系统-03-buildroot-02-构建根文件系统.md》我们可以直接导入这个配置文件:

5. 编译Buildroot

我们执行make命令:

1
sudo make

需要加sudo,否则报错:

image-20241102201510703

然后还会有这样一个报错:

image-20241102201541457

说是要这样解决:

1
2
echo "export set FORCE_UNSAFE_CONFIGURE=1"  >> /etc/profile
source /etc/profile

但是还是有问题,没解决掉,先不管了,我换了这个版本的buildroot:

1
https://buildroot.org/downloads/buildroot-2023.05.1.tar.gz

编译完成后(反正只要没报错,基本就是编译成功了)

image-20241102203639580

我么就可以得到根文件系统了:

image-20241102203727046
1
2
rootfs.ext2 # ext2 格式根文件系统
rootfs.ext4 -> rootfs.ext2 # ext2 格式根文件系统

6. 根文件系统测试

编译结束后,会在buildroot源码目录的output目录中生成根文件系统:

image-20241102203727046

可以看出,编译出来了多种格式的 rootfs,比如 ext2、 ext4、 ubi 等。其中rootfs.tar 就是打包好的根文件系统,我们就使用 rootfs.tar 进行测试。在 nfs 目录下新建一个名为 buildrootfs 的文件夹 ,然后将rootfs.tar 拷贝到 buildrootfs 目录下并解压,命令如下:

1
2
3
4
5
mkdir -p ~/4nfs/buildroot
cp ~/7Linux/buildroot-2023.05.1/output/images/rootfs.tar ~/4nfs/buildroot
cd ~/4nfs/buildroot
tar -xf rootfs.tar
rm rootfs.tar

然后修改uboot的bootargs参数:

1
2
=> setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.101:/home/sumu/4nfs/buildroot,proto=tcp rw ip=192.168.10.102:192.168.10.101:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc'
=> saveenv

然后重启就可以啦,要是制作没问题的话,是可以挂载成功的。首先要进入到/lib/modules 目录,但是默认没有,因此需要我们自行创建此目录。 buildroot 构建的根文件系统启动以后会输出我们前面设置的欢迎语“Welcome to alphai.mx6ull”。然后需要输入用户名和密码,用户名是“root”,密码就是我们前面配置 buildroot 的时候设置的 “123456” 。

1
2
3
4
5
6
7
System configuration
-> System hostname = alpha_imx6ull # 平台名字,自行设置
-> System banner = Welcome to alpha i.mx6ull # 欢迎语
-> Init system = BusyBox # 使用 busybox
-> /dev management = Dynamic using devtmpfs + mdev # 使用 mdev
-> [*] Enable root login with password (NEW) # 使能登录密码
-> Root password = 123456 # 登录密码为 123456

输入用户名和密码以后就可以进入系统中,上面是之前的配置,我后来嫌麻烦把密码去掉了:

image-20230805214354595

可以看出的 buildroot 构建的根文件系统运行基本没有问题,但是这个根文件系统是最简单的,我们并没有在 buildroot 里面配置任何第三方的库和软件,接下来我们就配置 buildroot,使能一些常见的第三方软件。