文章目录
- [1 buildroot简介及获取源码](#1 buildroot简介及获取源码)
-
- [1.1 简介](#1.1 简介)
- [1.2 源码获取](#1.2 源码获取)
- [2 buildroot构建根文件系统](#2 buildroot构建根文件系统)
-
- [2.1 解压](#2.1 解压)
- [2.2 配置buildroot](#2.2 配置buildroot)
-
- [2.2.1 配置Target options](#2.2.1 配置Target options)
- [2.2.2 配置Toolchain](#2.2.2 配置Toolchain)
- [2.2.3 配置System configuration](#2.2.3 配置System configuration)
- [2.2.4 配置Filesystem images](#2.2.4 配置Filesystem images)
- [2.2.5 配置禁止编译Linux内核和uboot](#2.2.5 配置禁止编译Linux内核和uboot)
- [2.2.6 配置Target packages](#2.2.6 配置Target packages)
-
- [2.2.6.1 使能内核模块相关命令](#2.2.6.1 使能内核模块相关命令)
- [2.2.6.2 使能VSFTPD服务](#2.2.6.2 使能VSFTPD服务)
- [2.2.6.3 使能SSH](#2.2.6.3 使能SSH)
- [2.2.7 备份配置项](#2.2.7 备份配置项)
- [2.2.8 buildroot初步编译](#2.2.8 buildroot初步编译)
- [2.2.9 配置busybox](#2.2.9 配置busybox)
- [2.2.10 编译busybox](#2.2.10 编译busybox)
- [2.2.11 重新编译buildroot](#2.2.11 重新编译buildroot)
- [2.3 修改生成根文件系统](#2.3 修改生成根文件系统)
-
- [2.3.1 创建自启动文件](#2.3.1 创建自启动文件)
- [2.3.2 修改终端显示](#2.3.2 修改终端显示)
- [2.4 网络加载](#2.4 网络加载)
-
- [2.4.1 准备加载文件](#2.4.1 准备加载文件)
- [2.4.2 根文件系统运行](#2.4.2 根文件系统运行)
- [2.4.3 uboot设置根文件系统网络加载](#2.4.3 uboot设置根文件系统网络加载)
- [3 buildroot根文件系统测试](#3 buildroot根文件系统测试)
-
- [3.1 depmod命令测试](#3.1 depmod命令测试)
- [3.2 vsftpd测试](#3.2 vsftpd测试)
-
- [3.2.1 vsftpd配置](#3.2.1 vsftpd配置)
- [3.3 sshd测试](#3.3 sshd测试)
-
- [3.3.1 sshd配置](#3.3.1 sshd配置)
- [4 烧写根文件系统到EMMC中](#4 烧写根文件系统到EMMC中)
-
- [4.1 rootfs.ext4文件制作](#4.1 rootfs.ext4文件制作)
- [4.2 根文件系统烧录](#4.2 根文件系统烧录)
-
- [4.2.1 文件准备](#4.2.1 文件准备)
- [4.2.2 使用USB烧写rootfs.ext4](#4.2.2 使用USB烧写rootfs.ext4)
- [4.3 根文件系统运行](#4.3 根文件系统运行)
- [4.4 uboot设置根文件系统从EMMC启动](#4.4 uboot设置根文件系统从EMMC启动)
说明说明
1 buildroot简介及获取源码
1.1 简介
Buildroot 是一个开源的嵌入式Linux系统构建工具,旨在简化嵌入式系统的开发流程。它通过自动化的方式生成交叉编译工具链、根文件系统、Linux内核镜像以及引导程序,适用于资源受限的平台和快速开发需求。
1.2 源码获取
可以在官网下载文件;

点击DOWNLOAD下载最新源码包;

点击上图中下方红框可以下载历史版本。

在历史版本中找到buildroot-2020.02.6.tar.bz2并下载;

下载完成后传输至Ubuntu中。
2 buildroot构建根文件系统
2.1 解压
bash
tar -vxjf buildroot-2020.02.6.tar.bz2
2.2 配置buildroot
bash
cd buildroot-2020.02.6
make menuconfig
2.2.1 配置Target options
此配置项用于配置目标开发板的信息,此项配置好的信息如下:

2.2.2 配置Toolchain
此配置项用于配置交叉编译工具链,即交叉编译器。此项配置好的信息如下:

Toolchain下比较重要的选项,如下所示:
- Toolchain:设置为Custom toolchain,表示使用用户自己的交叉编译器;
- Toolchain origin:设置为Pre-installedtoolchain,表示使用预装的交叉编译器;
- Toolchainpath:设置自己安装的交叉编译器绝对路径buildroot要用到;
- Toolchain prefix:设置交叉编译器前缀,要根据自己实际所使用的交叉编译器来设置,比如我们使用的是arm-none-linux-gnueabihf-gcc,因此前缀就是$(ARCH)-none-linux-gnueabihf,其中ARCH前面已经设置为了arm;
- External toolchain kernel headers series:设置的是交叉编译器所对应的linux内核版本号,gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf所对应的linux内核版本号为4.20,因此这里需要设置为4.20.x!一定要根据自己所使用的交叉编译器来设置,否则编译的时候会报版本不一致的错误。
2.2.3 配置System configuration
此配置项用于配置系统信息,比如开发板名字、欢迎语、用户名、密码等。需要配置的项目和其对应的内容如下:

2.2.4 配置Filesystem images
此配置项用于配置生成的根文件系统的格式,配置如下:

2.2.5 配置禁止编译Linux内核和uboot
buildroot不仅仅能构建根文件系统,也可以编译linux内核和uboot。当配置buildroot,使能linux内核和uboot以后buildroot就会自动下载最新的linux内核和uboot源码并编译。中间可能因为版本等问题会出现问题,所以不使用buildroot提供的linux内核和uboot编译。
linux内核禁止配置如下:

uboot禁止配置如下:

2.2.6 配置Target packages
此配置项用于要选择的第三方库和软件。可以根据自己需求进行配置。
2.2.6.1 使能内核模块相关命令
tex
-> Target packages
-> System tools
-> [*] kmod //使能内核模块相关命令
2.2.6.2 使能VSFTPD服务
tex
-> Target packages
-> Networking applications
-> [*] vsftpd //使能 vsftpd
2.2.6.3 使能SSH
tex
-> Target packages
-> Networking applications
-> [*] openssh //使能 openssh
2.2.7 备份配置项
bash
cd buildroot-2020.02.6
cp .config ./configs/stm32mp1_da_defconfig
2.2.8 buildroot初步编译
bash
cd buildroot-2020.02.6
make -j8
2.2.9 配置busybox
buildroot中busybox的源码在buildroot-2020.02.6/output/build/busybox-1.31.1中。
bash
make busybox-menuconfig
参考系统移植-STM32MP1_BusyBox移植配置buildroot下的busybox。
2.2.10 编译busybox
bash
cd buildroot-2020.02.6
make show-targets # 列出所有配置了的目标软件包
make busybox
# 需要重新编译 busybox 的话可以使用如下命令:
make busybox-rebuild
# busybox 编译完成之后,buildroot 需要重新编译
2.2.11 重新编译buildroot
bash
cd buildroot-2020.02.6
make -j8
buildroot在make之后会在buildroot-2020.02.6/output/images/目录下直接生成多种格式的rootfs。如图所示:

还需要修改一些文件信息,所有使用rootfs.tar文件解压到nfs/RootFS目录中(初次需要将nfs/RootFS清空)。
2.3 修改生成根文件系统
bash
cd buildroot-2020.02.6/output/images/
cp rootfs.tar /home/alientek/linux/nfs/RootFS -f # /home/alientek/linux/nfs 为nfs服务器目录
cd /home/alientek/linux/nfs/RootFS
tar -vxf rootfs.tar
rm rootfs.tar
如下所示:

2.3.1 创建自启动文件
buildroot构建的根文件系统中不需要直接在/etc/init.d/rcS中添加自启动命令了,默认情况下buildroot构建的根文件系统中rcS文件,内容如下所示:
shell
#!/bin/sh
# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do
# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac
done
rcS默认会在/etc/init.d目录下查找所有以S开头的脚本,然后一次执行这些脚本,在/etc/init.d文件夹下创建一个Sautorun的脚本:
bash
cd /etc/init.d/
sudo touch Sautorun
sudo chmod 777 Sautorun
在Sautorun文件中添加如下内容:
shell
#!/bin/sh
mount -t debugfs none /sys/kernel/debug # 使能 sysfs debug目录
2.3.2 修改终端显示
bash
cd /etc/profile.d/
sudo touch myprofile.sh
sudo chmod 777 myprofile.sh
在myprofile.sh文件中添加如下内容:
shell
#!/bin/sh
PS1='[\u@\h]:\w$ '
export PS1
2.4 网络加载
2.4.1 准备加载文件
通过USB_OTG将Linux内核移植阶段的da_image烧录至开发板。
2.4.2 根文件系统运行
打开MobaXterm软件,设置好与开发板连接的串口,波特率选择115200。
设置开发板拨码开关为010,也就是从EMMC启动,然后复位开发板!
在串口中观察启动过程。
2.4.3 uboot设置根文件系统网络加载
关于bootargs参数设置,可以在Linux内核源码目录中Documentation/filesystems/nfs/nfsroot.txt查看详细配置。
bash
setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.10.101:/home/alientek/linux/nfs/RootFS,proto=tcp rw ip=192.168.10.102:192.168.10.101:192.168.10.1:255.255.255.0::eth0:off'
saveenv
boot
3 buildroot根文件系统测试
3.1 depmod命令测试
根文件系统启动时报一个错误:

使用如下命令解决:
bash
mkdir /lib/modules/5.4.31 -p
cd /lib/modules/5.4.31/
depmod
depmod命令会在/lib/modules/5.4.31/目录下生成modules.alias、modules.dep、modules.symbols,这几个文件不需要用户操作,系统会自己使用这三个文件。
3.2 vsftpd测试
3.2.1 vsftpd配置
打开/etc/vsftpd.conf文件,将下述两行前的#去除:
tex
local_enable=YES
write_enable=YES
使用如下命令修改/etc/vsftpd.conf的所有用户及所属用户组:
bash
chown root:root /etc/vsftpd.conf
使用如下命令添加一个用户来完成FTP登录:
bash
adduser da
重启开发板,使用FileZilla工具连接开发板,成功如下图所示:

3.3 sshd测试
3.3.1 sshd配置
bash
chown root:root /var/empty
重启开发板,重启后在Ubuntu中使用ssh username@IP address格式测试sshd。比如在Ubuntu中,终端执行ssh da@192.168.10.102。如图所示:

也可以使用其他支持SSH的工具进行测试。
4 烧写根文件系统到EMMC中
4.1 rootfs.ext4文件制作
bash
# 第一步(仅初次使用):在家目录中选择合适位置,创建 rootfs 文件夹,并进入
mkdir rootfs
cd rootfs
# 第二步(仅初次使用):将生成的 uImage 和 stm32mp157d-da.dtb 文件拷贝到 rootfs 文件夹目录中
# 第三步(仅初次使用):新建 ext4 格式磁盘
# of为名称,bs为块大小,count为块数量,所以 rootfs.ext4 文件大小为1024MB,如果空间不够则调整 count
dd if=/dev/zero of=rootfs.ext4 bs=1M count=1024
# -L rootfs 为卷名,使用 mkfs.ext4 将 rootfs.ext4 文件格式化为 ext4 格式,且指定卷名为 rootfs
mkfs.ext4 -L rootfs rootfs.ext4
# 第四步:将系统镜像拷贝到 ext4 磁盘中
sudo mkdir /mnt/rootfs # (仅初次使用)
sudo mount rootfs.ext4 /mnt/rootfs/
sudo cp /home/alientek/linux/nfs/RootFS/* /mnt/rootfs/ -drf # 其中 /home/alientek/linux/nfs/RootFS/ 为根文件系统路径
# 第五步:卸载 /mnt/rootfs
sudo umount /mnt/rootfs
4.2 根文件系统烧录
4.2.1 文件准备
将制作好的的rootfs.ext4、bootfs.ext4、tf-a-stm32mp157d-da-trusted.stm32和tf-a-stm32mp157d-da-serialboot.stm32、u-boot.stm32文件(其中bootfs.ext4、u-boot.stm32、tf-a-stm32mp157d-da-trusted.stm32和tf-a-stm32mp157d-da-serialboot.stm32使用已经编译好的),统一放入文件夹中,例如:da-images文件夹。在da-images文件夹中添加da.tsv文件;文件内容如下所示:
tex
#Opt Id Name Type Device Offset Binary
- 0x01 fsbl1-boot Binary none 0x0 tf-a-stm32mp157d-da-serialboot.stm32
- 0x03 ssbl-boot Binary none 0x0 u-boot.stm32
P 0x04 fsbl1 Binary mmc1 boot1 tf-a-stm32mp157d-da-trusted.stm32
P 0x05 fsbl2 Binary mmc1 boot2 tf-a-stm32mp157d-da-trusted.stm32
P 0x06 ssbl Binary mmc1 0x00080000 u-boot.stm32
P 0x21 boot System mmc1 0x00280000 bootfs.ext4
P 0x22 rootfs FileSystem mmc1 0x04280000 rootfs.ext4
文件内容格式要严格遵循下图:

tsv语法要求只能用TAB键,不能用空格!以#开头为注释。
最终da-images文件夹中的内容如下:

4.2.2 使用USB烧写rootfs.ext4
通过USBType-C线将开发板的USB_OTG和USB_TTL连接到电脑上。

设置开发板拨码开关,设置为000,也就是从USB启动,然后复位开发板。
打开STM32CubeProgrammer,选择USB连接方式,Port选择USB1。

USB设置好以后点击右上角的"Connect"来连接开发板,连接成功以后左下角的log区域就会输出一些信息,右侧中间的数据区域也会显示开发板默认的分区情况,右下角会显示目标板信息,如图所示:

STM32CubeProgrammer要使用FlashLayout文件来烧写系统,也就是da-images文件夹下的da.tsv。点击界面上的"Open File",打开da.tsv,如下图所示:

根文件系统较大,烧写时间相对于之前的烧写时间略长,烧写完成后会有如下提示:

4.3 根文件系统运行
打开MobaXterm软件,设置好与开发板连接的串口,波特率选择115200。
设置开发板拨码开关为010,也就是从EMMC启动,然后复位开发板!
在串口中观察启动过程。
4.4 uboot设置根文件系统从EMMC启动
bash
setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw'
saveenv
boot