系统移植-STM32MP1_Buildroot根文件系统移植

文章目录

  • [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下比较重要的选项,如下所示:

  1. Toolchain:设置为Custom toolchain,表示使用用户自己的交叉编译器;
  2. Toolchain origin:设置为Pre-installedtoolchain,表示使用预装的交叉编译器;
  3. Toolchainpath:设置自己安装的交叉编译器绝对路径buildroot要用到;
  4. Toolchain prefix:设置交叉编译器前缀,要根据自己实际所使用的交叉编译器来设置,比如我们使用的是arm-none-linux-gnueabihf-gcc,因此前缀就是$(ARCH)-none-linux-gnueabihf,其中ARCH前面已经设置为了arm;
  5. 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.aliasmodules.depmodules.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.ext4bootfs.ext4tf-a-stm32mp157d-da-trusted.stm32tf-a-stm32mp157d-da-serialboot.stm32u-boot.stm32文件(其中bootfs.ext4u-boot.stm32tf-a-stm32mp157d-da-trusted.stm32tf-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
相关推荐
cmpxr_9 小时前
【单片机】STM32晶振引脚不连晶振时的做法
stm32·单片机·嵌入式硬件
cmpxr_10 小时前
【单片机】STM32Fxx中RTC掉电不走
stm32·单片机
qq_1508419910 小时前
关于TTL单端到RS485差分
嵌入式硬件
cmpxr_10 小时前
【单片机】STM32的FSMC总线什么情况需要复用
stm32·单片机·嵌入式硬件
记录无知岁月11 小时前
【GD32】(二) 基本外设使用
单片机·can·iic·gd32·dwt
划水的code搬运工小李11 小时前
Ubuntu18.04读取串口信息
stm32·ubuntu·串口·嵌入式
LCG元11 小时前
STM32实战:基于STM32F103的智能药盒定时提醒系统
stm32·单片机·嵌入式硬件
小向是个Der12 小时前
嵌入式进阶——嵌入式MCU编译工具链总结
单片机·编译·嵌入式软件·cline+glm5.0
Linux猿20 小时前
基于单片机的自行车里程表设计|附源码
单片机·嵌入式硬件·嵌入式·课程设计