存储与自定义文件系统

本篇目标:搞懂板子 NAND 上的分区结构、为什么你能直接往根文件系统里写文件、以及怎么把你自己的文件/程序预置进出厂固件(而不是每次手动拷)。
涉及分区表与 overlay 机制,均为本 SDK 真实配置。


NAND 上的分区一览

固件烧录到 NAND 后,被划分成几个区(定义见 SDK 的 sys_partition.fex):

分区 作用 可否日常写
boot-resource 开机 Logo 等启动资源 一般只读(用 logo_update 写)
env / env-redund U-Boot 环境变量(双备份) 由 uboot/env 工具管理
bootA 内核镜像 否
rootfsA 根文件系统(ubifs,可读写) ✅ 是
private 厂商私有数据 视情况

根文件系统 rootfsA 是 ubifs 格式,可读可写。所以你在板子上 vi 改个配置、cp 放个程序、新建个目录,都是直接写进 NAND 的,重启不丢(前提是写到了根文件系统里、且没重烧固件)。


在板子上直接改(临时/调试最方便)

如果只是自己调试,直接操作即可:

root@YPT153EVB:~# echo "hello" > /root/myfile.txt     # 写文件
root@YPT153EVB:~# cp /mnt/app.bin /usr/bin/            # 放个程序
root@YPT153EVB:~# vi /etc/rc.local                     # 改启动脚本

⚠️ 这种方式重烧整包固件会丢(因为整包覆盖了 rootfsA)。如果只是自己用、不量产,完全够用。


把文件预置进固件(量产必看:overlay 机制)

如果想”烧完固件,板子一起来的时候就已经有你的文件/程序/配置”,要用 overlay(叠加)机制:

SDK 里有目录 BoardConfig/filesSystem/,构建时会把它原样叠加(overlay)到根文件系统里。也就是说:

  • 你在 BoardConfig/filesSystem/ 下建什么目录、放什么文件,最终都会出现在板子根文件系统的对应位置。

举例:想把 myapp 预置到 /usr/bin/、把自启脚本放到 /etc/init.d/:

# 在开发电脑的 SDK 目录
mkdir -p BoardConfig/filesSystem/usr/bin
mkdir -p BoardConfig/filesSystem/etc/init.d
cp myapp   BoardConfig/filesSystem/usr/bin/
cp S99myapp BoardConfig/filesSystem/etc/init.d/

然后重新打包并烧录:

./yz_build.sh pack        # 重新生成固件
# 再用 PhoenixSuit 烧录(见《固件烧录与系统升级》)

板子起来后,/usr/bin/myapp 和 /etc/init.d/S99myapp 就已经在了。


设置开机自启

overlay 放进 /etc/init.d/S9xmyapp 的脚本,会在系统启动时按序号执行(Tina 用 procd / init.d 机制)。最简示例:

#!/bin/sh /etc/rc.common
START=99
start() {
    /usr/bin/myapp &
}
stop() {
    killall myapp
}

具体 init 语法以本 SDK 的 procd 约定为准;不确定就直接把启动命令加到 /etc/rc.local(若存在)。


查看存储设备

root@YPT153EVB:~# cat /proc/mtd            # 看 mtd 分区(boot-resource 等)
root@YPT153EVB:~# df -h                    # 看根文件系统剩余空间
root@YPT153EVB:~# mount | grep ubi          # 确认根 fs 是 ubifs

排障

现象 处理
overlay 放的文件没出现 路径要相对于根 /;确认重新 pack 并重烧
根文件系统写满 df -h 看空间;删无用文件或扩大 rootfsA 分区(改 sys_partition.fex 重编)
改了配置重启丢失 你写到的是临时位置 / 或重烧了固件;用 overlay 预置
mtd 分区损坏 重新整包烧录(见《固件烧录与系统升级》)

作者:Mai  创建时间:2026-10-20 16:53
最后编辑:Mai  更新时间:2026-11-05 14:56
上一篇:
下一篇: