适用平台:米联客MLK-F20-CM02-2CG ZYNQ MPSoC开发板
软件版本:Petalinux 2021.1、Ubuntu 18.04
串口环境下载地址:https://www.uisrc.com/t-3177.html
前言
默认Petalinux编译生成的系统采用ramdisk临时文件系统,文件系统运行在内存中,开发板断电后所有修改的数据、配置都会丢失,无法满足实际项目持久化存储需求。
本文基于米联客F20-2CG开发板,手把手教大家将Petalinux根文件系统修改为EXT4持久化文件系统,通过SD卡分区存储根文件系统,实现断电数据保存,全程采用离线编译方式,规避在线编译网络报错问题,适配2021.1版本Petalinux。
本文涵盖:工程配置修改、设备树适配、SD卡分区格式化、系统编译、镜像部署、板卡启动测试全流程。
图1 开发板功能示意图
前置环境
1. 已搭建完成Petalinux2021.1开发环境(米联客定制Ubuntu18.04虚拟机)
2. 已准备好离线编译依赖包(适配MPSoC 64位处理器)
3. 提前获取F20-2CG对应的Vivado导出XSA硬件描述文件
4. 8G及以上SD卡(格式清空,用于分区制作启动卡)
5. 开发板、串口线、SD卡读卡器、电源适配器
一、核心原理说明
1. ramdisk模式:根文件系统挂载在内存,读写速度快,但断电数据清零,仅适用于调试测试
2. EXT4持久化模式:将根文件系统挂载在SD卡EXT4分区,所有文件修改、程序安装、配置保存均可永久生效,断电不丢失
3. SD卡双分区设计:
- FAT32分区(boot):存放BOOT.BIN、boot.scr、Image、system.dtb等启动镜像
- EXT4分区(rootfs):挂载Linux根文件系统,持久化存储系统数据
二、进入工程并配置离线编译(必做)
为避免在线编译网络超时、服务器连接失败问题,全程使用离线编译配置,沿用前文搭建的工程目录。
1. 进入Petalinux工程目录,加载环境变量
cd /home/uisrc/project/system
source ../../petalinux2021.1/settings.sh
图2 进入工程并加载环境变量
2. 打开工程配置界面
petalinux-config
图3 petalinux-config配置界面
3. 配置Yocto离线编译参数(已有配置可跳过,新工程必须配置)
- 进入 Yocto Settings -> Add pre-mirror url,输入路径:file:///home/uisrc/downloads_2021.1_update1
- 进入 Yocto Settings -> Local sstate feeds settings,输入64位MPSoC路径:/home/uisrc/sstate_aaarch64_2021.1_update1/aarch64
- 取消勾选 Enable Network sstate feeds,关闭网络编译模式
配置完成后暂不保存,继续下一步文件系统配置。
三、修改根文件系统为EXT4模式
3.1 配置文件系统类型与挂载盘符
在petalinux-config配置界面,依次进入:
Image Packaging Configuration -> Root filesystem type
默认为ramdisk模式,修改为:EXT4(SD/eMMC/SATA/USB)
图4 修改Root filesystem type为EXT4
选中后界面会新增盘符配置项,填写F20-2CG开发板SD卡挂载节点:
Device node of SD device = /dev/mmcblk1p2
图5 Image Packaging Configuration配置界面
图6 填写Device node of SD device(/dev/mmcblk1p2)
关键说明:F20-2CG板卡sdhci0对应SD卡设备,系统识别为mmcblk1,第二分区p2专门用于挂载EXT4根文件系统,切勿填错盘符,否则系统启动失败。
图7 设备树SDHCI节点(mmcblk设备映射)
3.2 设备树适配SD卡(防止写保护报错)
修改设备树文件,关闭SD卡写保护,避免挂载失败:
编辑设备树配置文件:
vim /home/uisrc/project/system/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
在文件末尾添加如下配置:
&sdhci0 {
disable-wp;
};
&sdhci1 {
disable-wp;
};
图8 system-user.dtsi 添加disable-wp配置
保存退出(ESC :wq),完成设备树适配。
四、清理缓存并编译系统
1. 清理历史编译缓存,避免配置残留冲突
petalinux-build -x cleanall
2. 执行离线编译(耗时取决于电脑配置,无网络依赖)
petalinux-build
图9 执行编译命令
图10 petalinux-build编译成功
编译成功会提示:Successfully built project
3. 打包生成BOOT.BIN启动镜像
petalinux-package --boot --format BIN --fsbl images/linux/zynqmp_fsbl.elf --u-boot images/linux/u-boot.elf --pmufw images/linux/pmufw.elf --fpga images/linux/*.bit --force
图11 打包生成BOOT.BIN启动镜像
执行完成后,images/linux目录下生成核心启动文件:BOOT.BIN、image.ub、system.dtb、rootfs.tar.gz
五、SD卡双分区格式化与系统部署
将SD卡通过读卡器接入Ubuntu虚拟机,使用系统自带磁盘工具分区,禁止Windows格式化(会导致分区格式异常)。
5.1 SD卡分区划分
1. 打开Ubuntu磁盘工具,选中接入的SD卡,删除原有所有分区
图12 磁盘工具删除原有分区
2. 新建第一个分区:
- 分区大小:500MB
- 格式:FAT32
- 分区名称:boot
图13 新建boot分区
图14 分区配置
图15 分区配置
3. 新建第二个分区:
- 占用剩余全部空间
- 格式:EXT4
- 分区名称:rootfs
图16 新建rootfs分区
图17 分区配置
图18 分区配置
保存分区方案,等待格式化完成,手动挂载两个分区。
图19 分区完成
图20 挂载boot/rootfs分区
5.2 部署启动文件与根文件系统
1. 拷贝启动文件到FAT32 boot分区
将 images/linux 目录下的 boot.scr、BOOT.BIN、image.ub 三个文件复制到SD卡boot分区。
图21 拷贝启动文件到boot分区
2. 解压根文件系统到EXT4 rootfs分区
sudo tar zxvf rootfs.tar.gz -C /media/uisrc/rootfs/
图22 解压根文件系统到rootfs分区
3. 强制写入缓存,避免文件丢失
sync
操作完成后安全弹出SD卡,完成系统部署。
六、开发板启动配置与测试
6.1 拨码开关配置(F20-2CG专用)
将开发板拨码开关调整为 SD卡启动模式:OFF-ON-OFF
接线说明:插入SD卡,连接USB串口、电源,打开Putty串口工具,波特率默认115200。
6.2 持久化功能验证
1. 上电启动开发板,系统正常进入Linux终端
图23 系统启动并查看内核版本(uname -a)
2. 创建测试文件
touch test.txt
echo "EXT4持久化测试" > test.txt
图24 创建并写入测试文件
3. 断电重启开发板,重新进入系统
4. 查看文件是否存在
ls
图25 断电重启后文件保留
若test.txt文件保留、内容未丢失,说明EXT4持久化文件系统配置成功。
七、常见问题与解决方案
问题1:系统启动提示mmcblk0p1挂载失败
解决方案:检查设备树是否添加disable-wp配置,关闭SD卡写保护,重新编译烧录。
问题2:断电后数据依旧丢失
解决方案:确认petalinux-config中文件系统类型已改为EXT4,且盘符/dev/mmcblk1p2填写正确,重新配置编译。
问题3:编译过程sstate匹配失败
解决方案:检查离线包路径配置,确认64位离线包适配MPSoC架构,关闭网络编译模式。
问题4:SD卡分区后无法挂载
解决方案:使用Ubuntu原生磁盘工具分区,禁止Windows格式化,确保分区格式为纯FAT32和EXT4。