一、分区表基础概念

各位做数据采集的同行,咱们今天聊聊分区表。说实话,这玩意儿看着不起眼,但我在项目里见过太多因为分区表没规划好,导致设备跑着跑着就崩了的案例。

分区表是什么?说白了,它就是一张“地图”。这张地图告诉操作系统:你的存储芯片(比如 NAND Flash、eMMC、SD 卡)上,哪块区域归谁管,哪块区域存什么数据。

核心定义:分区表是存储在存储设备起始位置(通常是 LBA 0 或偏移 0)的一段元数据,它描述了存储空间的划分方式、每个分区的起始地址、大小、类型和属性。

1.1 为什么需要分区表?

你想想看,一块 64GB 的 eMMC,如果没有任何分区信息,操作系统怎么知道哪里放 bootloader、哪里放内核、哪里存采集数据?

我个人习惯把分区表比作“房子的户型图”。没有户型图,你只知道有一块空地,但不知道哪里是客厅、哪里是卧室、哪里是厨房。分区表就是给存储空间画好了房间。

具体来说,分区表解决了三个核心问题:

  • 空间隔离:系统程序和用户数据分开,防止误操作把系统搞崩。我在一个工业采集项目里遇到过,客户把采集数据写满了整个 Flash,结果系统启动不了——就是因为没做分区隔离。
  • 多系统共存:比如双系统升级场景,A 分区跑着,B 分区升级,互不干扰。
  • 磨损均衡与寿命管理:不同分区可以设置不同的擦写策略。日志分区频繁写,系统分区几乎只读,分区表能帮我们针对性地做优化。
对比维度 有分区表 无分区表(裸存储)
空间管理 清晰划分,各司其职 所有数据混在一起
系统安全性 系统区可设为只读 容易被用户数据覆盖
升级灵活性 支持 A/B 分区升级 升级风险极高
数据恢复 分区损坏可单独修复 全盘格式化才能恢复

1.2 分区表在数据采集设备中的特殊作用

数据采集设备和手机、电脑不一样。手机分区坏了,大不了刷机。采集设备呢?可能部署在深山老林的变电站里,或者飞在天上的无人机上。一旦分区表出问题,远程维护成本极高。

我记得有个风电场的项目,设备装在 80 米高的塔筒顶部。采集卡的分区表因为频繁掉电写坏了,结果我们工程师得爬上去换卡。从那以后,我对分区表的可靠性设计就特别较真。

数据采集设备对分区表有四个特殊要求:

  1. 掉电安全:采集设备经常面临意外断电。分区表必须支持原子写操作,不能写一半断电就坏了。
  2. 磨损均衡:采集数据是持续写入的,一天 24 小时不停。如果分区没规划好,某个块反复擦写,很快就报废了。
  3. 快速启动:很多采集设备要求上电后毫秒级启动。分区表结构要简单,解析要快。
  4. 冗余备份:主分区表坏了,得有备份分区表顶上。我一般会在存储末尾再放一份分区表副本。

实战建议:做采集设备分区时,我习惯把系统分区放在 Flash 的前端(低地址),数据分区放在后端。因为前端擦写次数少,系统更稳定。数据分区用大块擦写策略,减少元数据开销。

1.3 分区表的核心结构

目前主流的分区表格式有两种:MBR(主引导记录)和 GPT(GUID 分区表)。采集设备里,小容量存储(2GB 以下)常用 MBR,大容量或需要高可靠性的场景用 GPT。

下面这张图展示了分区表在存储设备中的位置和结构:

分区表在存储设备中的位置与结构 存储设备(eMMC / NAND Flash / SD卡) 分区表(MBR / GPT) 分区1:Bootloader 分区2:内核+系统 分区3:配置文件 分区4:采集数据 分区表内容示例(GPT格式): • 分区1:起始 LBA 34,大小 4MB,类型 EFI System,GUID: xxxx • 分区2:起始 LBA 8226,大小 256MB,类型 Linux Filesystem,GUID: xxxx • 分区3:起始 LBA 532514,大小 64MB,类型 Linux Filesystem,GUID: xxxx • 分区4:起始 LBA 663586,大小 剩余空间,类型 Linux Filesystem,GUID: xxxx

1.4 分区表的关键参数

做分区规划时,有几个参数你必须搞清楚。我曾经因为没注意对齐参数,导致采集性能掉了 30%,排查了两天才找到原因。

参数名称 说明 采集设备中的建议值
起始地址 分区在存储介质上的起始 LBA 对齐到 1MB 边界(2048 扇区)
分区大小 分区占用的总扇区数 系统分区 256MB~512MB,数据分区按需
分区类型 标识分区用途(FAT32、ext4、raw 等) 系统用 ext4,数据用 FAT32 或 raw
引导标志 标识该分区是否可引导 仅 bootloader 分区设为可引导
校验和 分区表自身的完整性校验 必须启用,防止分区表损坏

避坑指南:我曾经在一个 4GB eMMC 的项目里,直接把 PC 上的分区方案搬过来用。结果发现采集数据写入时,每写 4KB 就要做一次擦除,性能惨不忍睹。后来才发现是分区起始地址没对齐到擦除块边界。记住:NAND Flash 的擦除块通常是 128KB 或 256KB,分区起始地址必须对齐到这个粒度。

1.5 分区表在采集设备中的典型布局

我做了这么多年采集设备,总结了一套比较稳妥的分区布局方案。当然,具体项目要具体调整,但这个框架可以作为起点:

  • Bootloader 分区(2~4MB):存放 u-boot 或类似引导程序。只读挂载,几乎不擦写。
  • 系统分区(128~256MB):存放内核、设备树、根文件系统。建议用 squashfs 只读压缩文件系统,省空间又安全。
  • 配置分区(16~64MB):存放设备参数、校准数据、网络配置。用 ext4 或 FAT,允许少量写入。
  • 日志分区(64~128MB):存放运行日志。用 FAT32 或专门的小文件系统,注意磨损均衡。
  • 数据分区(剩余空间):存放采集数据。根据采集频率和保留周期计算大小,建议用 raw 分区或专用文件系统。

嗯,这里要注意:数据分区的大小不是拍脑袋定的。你得算清楚:采样率 × 通道数 × 数据位宽 × 存储天数 = 所需容量。然后再留出 20% 的余量。

我的习惯:每次做新项目,我都会先画一张分区布局图,标清楚每个分区的起始地址、大小、文件系统类型、挂载选项。然后贴在开发文档的第一页。这样不管是自己回头看,还是交接给同事,都一目了然。