从NFS到EMMC:STM32MP157开发板根文件系统固化实战指南
在嵌入式Linux开发中,NFS挂载根文件系统是调试阶段的黄金搭档——修改即时生效、无需反复烧录,极大提升了开发效率。但当产品进入量产阶段,这种依赖网络的启动方式就显得捉襟见肘了。本文将带你完成从"临时工"到"正式工"的转变,将Buildroot生成的根文件系统永久固化到EMMC存储中。
1. 环境准备与前期检查
1.1 硬件设备清单
确保你已备齐以下硬件:
- STM32MP157开发板(带EMMC存储)
- USB Type-C数据线(用于供电和OTG烧录)
- USB转TTL串口模块(用于控制台输出)
- 网线(可选,用于最后验证网络功能)
1.2 软件工具准备
需要提前安装的软件环境:
# Ubuntu环境下验证工具链 $ arm-none-eabi-gcc --version $ ls /opt/st/stm32mp1/2.6-openstlinux-5.10-dunfell-mp1-21-11-17/sdk/提示:建议使用VMware Workstation Pro 16+或VirtualBox 6.1+运行Ubuntu 20.04 LTS作为开发环境,避免权限问题。
1.3 文件系统验证
在开始烧录前,务必确认Buildroot生成的根文件系统完整性:
$ cd ~/buildroot/output/images $ file rootfs.ext4 # 应显示:Linux rev 1.0 ext4 filesystem data... $ sudo dumpe2fs rootfs.ext4 | grep "Inode count"2. EMMC分区规划与烧录策略
2.1 STM32MP157存储布局
典型EMMC分区方案建议:
| 分区 | 挂载点 | 文件系统 | 大小 | 内容 |
|---|---|---|---|---|
| mmcblk1p1 | /boot | vfat | 64MB | TF-A/u-boot |
| mmcblk1p2 | - | ext4 | 256MB | 内核镜像与设备树 |
| mmcblk1p3 | / | ext4 | 剩余空间 | 根文件系统 |
2.2 烧录工具链配置
STM32CubeProgrammer的三种连接方式对比:
USB DFU模式:
- 拨码开关设置为000
- 通过USB OTG接口连接
- 烧录速度:~5MB/s
ST-Link调试器:
- 需要额外硬件
- 支持调试接口
- 烧录速度:~1MB/s
UART模式:
- 最慢但兼容性最好
- 适合无USB接口场景
推荐使用USB DFU模式,执行以下命令检测设备连接:
$ lsusb | grep STM # 应显示:ID 0483:df11 STMicroelectronics STM Device in DFU Mode3. 根文件系统烧录全流程
3.1 镜像准备与验证
将Buildroot生成的rootfs.ext4转换为适合EMMC的格式:
$ sudo apt-get install e2fsprogs $ resize2fs -f rootfs.ext4 2G # 调整文件系统大小 $ e2fsck -f rootfs.ext4 # 强制检查3.2 使用STM32CubeProgrammer烧录
关键操作步骤:
- 关闭所有可能占用USB设备的程序
- 开发板拨码开关设为000(DFU模式)
- 连接USB OTG接口到PC
- 启动STM32CubeProgrammer选择USB连接
- 加载预先准备的TSV配置文件:
# my_flash.tsv 示例内容 P 0x01 0x0 bootloader/tf-a.stm32 P 0x03 0x0 bootloader/u-boot.stm32 P 0x04 0x0 images/rootfs.ext4
注意:烧录过程中不要断开USB连接,否则可能导致EMMC损坏。
3.3 验证烧录结果
通过串口终端检查分区内容:
# U-Boot环境下执行 STM32MP> mmc dev 1 STM32MP> ext4ls mmc 1:3 # 应显示根文件系统目录结构4. 启动环境深度配置
4.1 bootcmd与bootargs精讲
EMMC启动的标准环境变量配置:
# 设置启动命令 setenv bootcmd 'ext4load mmc 1:2 ${kernel_addr_r} uImage; \ ext4load mmc 1:2 ${fdt_addr_r} stm32mp157d-atk.dtb; \ bootm ${kernel_addr_r} - ${fdt_addr_r}' # 设置启动参数 setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw' # 保存配置 saveenv关键参数解析:
rootwait:等待存储设备就绪rw:以读写模式挂载根文件系统console:指定调试控制台设备
4.2 故障排查指南
常见启动问题及解决方案:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 卡在Starting kernel | 设备树不匹配 | 检查dtb文件版本 |
| 无法挂载rootfs | 分区编号错误 | 确认mmcblk1p3存在 |
| 文件系统只读 | EMMC写保护 | 检查硬件电路 |
| 环境变量丢失 | 存储损坏 | 重新烧写u-boot |
4.3 双启动方案实现
保留网络启动备用方案:
# 在U-Boot中设置启动菜单 setenv bootmenu_0 'EMMC Boot=run emmc_boot' setenv bootmenu_1 'Network Boot=run net_boot' setenv emmc_boot '...' # 前述EMMC启动命令 setenv net_boot '...' # 原NFS启动命令 saveenv5. 系统优化与生产准备
5.1 首次启动后的必要配置
登录系统后执行:
# 设置主机名 echo "stm32mp157" > /etc/hostname # 配置网络(示例) cat > /etc/network/interfaces <<EOF auto eth0 iface eth0 inet dhcp EOF # 创建持久化日志 mkdir /var/log/journal systemd-tmpfiles --create --prefix /var/log/journal5.2 生产环境加固建议
- 禁用调试服务:
systemctl mask debug-shell.service - 设置只读分区:
# /etc/fstab 添加 /dev/mmcblk1p2 /boot ext4 ro,noatime 0 2 - 启用看门狗:
apt-get install watchdog systemctl enable watchdog
5.3 批量烧录方案
对于量产环境,可以考虑:
- 使用
dd命令制作完整磁盘镜像:dd if=/dev/mmcblk1 of=production.img bs=4M status=progress - 通过USB Hub同时烧录多块开发板
- 定制Yocto镜像实现OTA升级支持
在实际项目中,我发现EMMC的寿命与文件系统配置密切相关。ext4的data=writeback模式能显著提升小文件写入性能,但建议仅在日志系统完善的场景使用。对于关键数据,还是应该考虑单独挂载为JFFS2或UBIFS等更适合闪存的文件系统。