ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

FDRAM分区挂载到根目录实操指南:扩容与根文件系统迁移详解

FDRAM分区挂载到根目录实操指南:扩容与根文件系统迁移详解 简介面向联发科平台 Android 系统工程师的实操资源围绕新增 FDRAM 分区并挂载到根目录这一主题基于 MT6761 与 Android 9.0解决分区表修改、文件系统格式化、fstab 挂载和 SELinux 权限适配等关键问题。包内共 21 个文件、约 133KB含 6 个 mk 构建脚本、5 个 te 策略文件、2 个 csv 配置、2 个 py 辅助脚本以及 makefile、file_contexts、rc、C 源码等类型覆盖分区规划至启动挂载的完整链路目录结构清晰便于按模块查找。适合具备一定内核与文件系统基础、需要为 MTK 设备扩展存储或适配 Android 9.0 A/B 分区的工程师参考。已有 679 人学习内容紧贴实际操作可指导修改 partition.map、partition.bin 与 fstab规避分区无法识别、挂载失败或权限不足等常见问题。 搞懂FDRAM分区并挂载到根目录是很多玩开发板、安卓设备改造和车机系统的朋友迟早要面对的一件事。我手头这块开发板最近就出了个典型状况系统根分区被各种日志、容器镜像和编译产物挤爆了重新刷固件又太折腾。好在这类板子的存储芯片上通常预留着个叫FDRAM的分区厂家出厂时只做了基础初始化大部分情况下处于闲置状态正好拿来当扩展存储用。这篇文章我打算把整个“添加新分区FDRAM并挂载到根目录”的过程完整拆开聊一遍包括怎么识别这个分区、怎么分区和格式化、怎么挂载才能开机自动生效以及如果你想把新分区直接当成根文件系统引导启动又该怎么操作。这些都是我在实际项目中踩过坑、验证过可行性的方案适合开发板玩家、嵌入式Linux工程师、NAS改造爱好者以及一切在用Linux系统但根目录空间告急的朋友参考。1. FDRAM分区到底是什么以及为什么要动它1.1 FDRAM不是内存是闪存里的预留区很多朋友第一次看到FDRAM这个词都会懵一下以为跟电脑里的DRAM内存有什么亲戚关系。其实它压根不是运行内存而是厂商在eMMC、NAND这类闪存芯片上划分出来的一个固定逻辑分区名。不同方案商叫法不一样有的叫FDRAM有的叫factory、misc、reserved本质上都属于出厂阶段预留的存储区。这类分区被设计出来的原始用途通常是存放启动阶段需要的驱动镜像、记录掉电保护数据、作为OTA升级的备份区或者干脆就是给后续业务扩展做的空白预留。问题在于没有哪个标准规定它必须存什么很多设备刷完出厂固件后这块区域就一直空着白白浪费了几十GB的存储空间。搞清楚这点你就会明白为什么有人盯上它——不是它有什么特殊魔力纯粹是闲置资源再利用。1.2 “挂载到根目录”的两种真实诉求“挂载到根目录”这个说法听起来有点绕实际操作中其实对应两种完全不同的诉求动手前必须先分清楚。第一种诉求最常见根分区/容量不够用比如/usr、/var被日志和容器镜像塞满于是想把FDRAM分区挂到根目录下的某个子目录比如/opt、/data、/home等于给系统存储扩容。这种操作属于正常的文件系统挂载风险可控恢复也容易。第二种诉求更彻底嵌入式开发场景下想让板子直接从FDRAM分区启动根文件系统也就是把“/”本身放到新分区上。这涉及到内核引导参数root的调整在启动ramdisk里也要做对应修改操作不当可能直接变砖。两种诉求的工作量天差地别我下面分别给出完整的操作路径。2. 动手之前的检查工作这部分偷懒必出事2.1 先认清楚FDRAM对应的块设备节点不管你是打算把FDRAM当数据盘用还是想把它做成根文件系统第一步永远是先搞清楚它在Linux内核里的设备名。我习惯用lsblk和cat /proc/partitions两条命令交叉确认# 查看所有块设备及其挂载情况 lsblk -f # 查看内核识别的分区表 cat /proc/partitions # 如果没有lsblk用fdisk也能看 fdisk -l以我实际调试过的某款车机板为例eMMC通常挂在/dev/mmcblk0上里面的分区就是一系列/dev/mmcblk0p1、/dev/mmcblk0p2这样的节点。FDRAM一般会排在比较靠后的位置比如/dev/mmcblk0p15或者/dev/mmcblk0p16。有些设备用的是SATA盘或者U盘启动那就是/dev/sda、/dev/sdb这类命名。用lsblk -f的好处是能直接看到文件系统类型如果显示ext4、vfat之类的说明它已经格式化了如果什么都没有说明分区还在但没格式化。2.2 操作前必须确认的三件事我见过太多次翻车事故几乎都是因为跳过了这块基础检查。第一确认目标分区没有被系统占用。用mount命令或者上面lsblk的输出看它是否已经在挂载状态如果已经被挂载到某个路径先停掉相关服务再umount卸载千万别在挂载状态下直接重新分区。第二确认分区表类型是MBR还是GPT。现在的设备基本都是GPT但老一点的板子可能是MBRfdisk -l里会明确显示Disklabel type这决定了我后面用fdisk还是gdisk来操作。第三确认这块区域当前有没有你需要保留的数据。FDRAM虽然名义上是闲置的但有些厂商会在里面塞入驱动备份或者恢复镜像如果你不确定里面是什么就先做一个完整镜像备份成本很低后悔药很贵# 整个分区镜像备份到外部存储 dd if/dev/mmcblk0p15 of/mnt/usb/fdram_backup.img bs1M statusprogress3. 分区创建与文件系统格式化参数选对不返工3.1 用fdisk完成分区操作的完整命令流假设FDRAM在设备上对应的是/dev/mmcblk0p15但你想把它扩成一个更大的数据分区或者它是一整块未分区的空闲设备比如/dev/mmcblk1整块盘都是空的那就需要新建分区。我拿fdisk演示一套实际可用的命令流# 进入fdisk交互界面操作目标设备 fdisk /dev/mmcblk1 # 交互命令依次执行 # 输入 n 新建分区 # 选择分区号默认回车即可 # 选择起始扇区默认回车自动对齐到最佳边界 # 选择结束扇区可以输入 40G 表示分配40GB # 输入 w 保存并退出这里有个经验起始扇区一定要用默认值现代存储设备都有擦除块对齐要求改成非对齐值会导致读写性能明显下降。分区大小我建议当前设备上实际需要多大就分配多大不要贪心全部分完留一点余量给未来可能的用途。如果不能用fdisk就用gdisk操作GPT分区表概念和交互方式几乎一致。分区结束后我记得一定要执行# 让内核重新读取分区表 partprobe /dev/mmcblk1 # 或者重启一次设备确保分区信息生效3.2 文件系统选型ext4还是xfs还是别的新建好的分区只是一张白纸要能存数据必须先格式化。绝大多数Linux设备上我首推ext4兼容性最好掉电恢复工具成熟ext4文件系统挂载时也支持很多调优选项# 格式化为ext4 mkfs.ext4 /dev/mmcblk1p1 # 如果你想要更快的大文件读写可以用xfs mkfs.xfs /dev/mmcblk1p1 # 如果是U盘或者需要在Windows下交换数据才考虑vfat mkfs.vfat -F 32 /dev/mmcblk1p1FDRAM这类分区本质上是闪存存储ext4在磨损均衡、日志恢复这些方面做得比较稳所以除非你有特殊理由比如就想测试xfs性能否则直接ext4就完事了。格式化过程除非存储颗粒本身有坏块否则几十秒内就能完成。3.3 记录UUID后面fstab要用格式化完成后马上执行blkid把分区的UUID记录下来这一步太关键了因为后面配置开机自动挂载时用UUID指定设备是最稳的方式比写死设备路径可靠得多blkid /dev/mmcblk1p1输出里类似UUID2a3f6e0e-6c1d-4c3c-b9f6-123456789abc这样的一串字符就是分区唯一标识。我用它不是因为UUID看起来高大上而是因为Linux下设备节点名有时候会漂移比如拔插U盘或内核枚举顺序变化后/dev/mmcblk1p1可能变成/dev/mmcblk2p1但UUID永远不变。4. 挂载到根目录两种实操路径全记录4.1 路径A挂载到根目录下的子目录给系统扩容这是最常用也是最安全的方式。假设我要把FDRAM分区挂到/opt项目数据目录先把目录建好再手动挂载验证# 创建挂载点目录 mkdir -p /opt # 手动挂载先看效果 mount /dev/mmcblk1p1 /opt # 确认挂载成功 df -h /opt手动挂载成功只能算是临时方案重启后系统不会自动挂载。要永久生效必须把挂载配置写进/etc/fstab。我第一行就写了UUID就是这个作用。fstab的每一行有六个字段我拆开解释字段示例值作用设备标识UUID2a3f6e0e-6c1d-4c3c-b9f6-123456789abc指定要挂载的分区挂载点/opt将分区挂到此目录文件系统类型ext4告诉内核用哪种驱动解析挂载选项defaults使用默认的读写、自动挂载等选项是否备份00表示不参与dump备份自检顺序20不检查1根分区先查2其他分区后查用vim打开/etc/fstab在文件末尾追加这样一行UUID2a3f6e0e-6c1d-4c3c-b9f6-123456789abc /opt ext4 defaults 0 2保存退出后先别急着重启执行mount -a让系统重新加载fstab。如果这条命令没有任何报错再执行df -h能看到/opt已经挂载成功就说明配置没问题了。我强烈建议你多走这一步验证而不是直接重启省得重启后发现问题手忙脚乱。4.2 路径B直接把FDRAM做成根文件系统整个系统从它启动如果你做的是嵌入式系统定制想让系统直接从FDRAM分区引导根文件系统操作就要深入到bootloader和内核启动参数层面了。整个过程我拆成三步第一步把现有根文件系统完整复制到FDRAM分区。新分区格式化好后挂载到一个临时目录然后用rsync同步根目录内容注意要排除/proc、/sys、/dev、/run这些运行时虚拟文件系统同时排除临时挂载点本身mkdir /mnt/newroot mount /dev/mmcblk1p1 /mnt/newroot rsync -aH --exclude/proc --exclude/sys --exclude/dev --exclude/run --exclude/mnt/newroot / /mnt/newroot/第二步修改新根文件系统里的fstab把根分区的挂载项改成FDRAM对应的设备或UUID保证系统启动后能以正确的方式在根目录挂载自己# 编辑 /mnt/newroot/etc/fstab # 将 / 对应的那行改成新的UUID或者/dev/mmcblk1p1第三步修改bootloader的启动参数。U-Boot下一般用setenv bootargs root/dev/mmcblk1p1 rootwait rw consolettyS0,115200这种格式把root指向新分区然后保存环境变量。如果你用的是其他引导方案比如extlinux.conf或者systemd-boot原理一样找到kernel引导行改root参数。这里有个细节经常出问题如果新分区上用了LVM、LUKS或者特殊的initramfs驱动还需要重建initramfs把这些模块打进去否则内核不认盘就进不了系统。4.3 需求不同挂载方式也不同路径A和路径B的区别可以这样理解路径A相当于给房子多修了一间储藏室还是走原来的大门进出路径B相当于把整个房子的承重结构都搬到了新地基上每块砖都得重新码放。两者都能解决“根目录不够用”的困境但路径B的工程量和风险指数要高得多。如果只是根目录空间告急我强烈建议先走路径A把/var、/home、/opt这些会持续增长的目录挪到新分区效果立竿见影。路径B基本只在系统整体迁移、批量部署、或者你确实需要调整系统底层分区布局时才值得碰。5. 实操中踩过的坑以及排查方法5.1 fstab写错导致开机进不了系统我印象最深的一次翻车就是在一台小主机上配置了新分区挂载后测试mount -a时没报错但重启后直接卡在systemd的等待超时界面。后来排查发现是fstab里填的UUID对不上挂载超时系统一直等不到分区就卡住了。这种情况的解决方案很粗暴但有效在grub启动界面按e编辑启动项在kernel行末尾追加systemd.unitemergency.target或者single进入单用户模式然后把fstab里那行错误配置删掉或注释掉。进不去系统时这个操作是必须会的平时建议先在纸上记一下这条命令或者直接记住root密码。5.2 分区挂上去了但读写报错如果是像EXT4-fs error (device mmcblk1p1): ext4_find_entry这类报错优先怀疑文件系统损坏。先卸载分区然后跑一遍文件系统检查umount /opt fsck.ext4 -f /dev/mmcblk1p1如果排查后发现没问题还报错再看看dmesgdmesg | grep -i error有可能是供电不稳、线材接触不好或者闪存本身坏块增多。SD卡、U盘这一类存储介质越接近寿命末期越容易出现这种“挂载成功但读写故障”的诡异现象。这种情况下就别强用这块盘了数据备份出来换新盘才是正道。5.3 设备节点漂移导致挂载错乱前面说过用UUID替代设备路径这里说一个实际例子。我一块开发板上同时接了eMMC和SD卡重启了几次之后内核枚举顺序变化SD卡从/dev/mmcblk0变成了/dev/mmcblk1如果fstab写的是/dev/mmcblk1p1重启后挂载到/opt的很可能就不是原来那个FDRAM分区了。数据错乱的风险极大。所以fstab里我从来不写/dev/xxx一律用UUID或者PARTUUID根目录方向错了后果可能不堪设想。5.4 厂商保护分区别乱动我前面建议预先备份FDRAM分区还有一层原因是某些商家的固件里FDRAM被配置成了OTA升级时验证用的关键分区里面存有哈希校验值、签名信息。如果直接格式化这分区以后系统升级时可能校验不过去。我就遇到过一块安卓车机格式化FDRAM后OTA包安装一直报错最后我把备份镜像dd回去才恢复。所以改之前先mount看一下如果分区处于挂载状态且里面有东西别急着格式化先查清楚它承载了什么功能确认它就是纯闲置分区再继续动手。6. 关于根目录挂载的一个高效操作经验最后分享一条我后来每次都要用的经验无论是路径A还是路径B操作完都要养成习惯执行一遍findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS验证所有挂载关系再执行cat /etc/fstab | grep -v ^#快速检查fstab配置。这两条命令加起来用不了十秒钟但能帮你确认整个系统当前挂载状态是不是和你预期一致比重启发现问题再救回来要省事得多。刚开始玩FDRAM这类分区的朋友我建议第一次操作就在路径A里挑一个不重要的目录练手比如挂到/mnt/fdram_test把整个流程跑通一遍再考虑去动/opt或者/var最后才考虑路径B那种直接改根文件系统的玩法。这套流程用的都是Linux标准工具在开发板、小主机、PC、云服务器上逻辑都通用有机会值得一试。本文还有配套的精品资源点击获取
返回列表