拓冰建站拓冰建站
首页 / 资讯中心 / 正文

机顶盒改分区表踩坑记录:从分区号变化到 bootcmd 偏移

2026/7/20背景原厂固件 rootfs 只有 610MB装完基础系统后所剩无几。手头这台 Hi3798MV100 盒子的 eMMC 有 8GB大部分空间被三个用不上的分区占着logo4M、recovery64M、backup512M。目标是砍掉这三个分区把空间全部给 rootfs。一、新旧分区表对比原始分区表textmmcblk0: 1M(boot),1M(bootargs),4M(baseparam),4M(pqparam),4M(logo),20M(kernel),64M(busybox),512M(backup),-(ubuntu)改完后textmmcblk0: 1M(boot),1M(bootargs),4M(baseparam),4M(pqparam),12M(kernel),-(rootfs)删除的分区分区大小删除原因logo4M不需要开机画面busybox/recovery64M不需要恢复模式backup512M不需要备份分区kernel 从 20M 缩到 12M因为新内核实际只有 10.3MB。rootfs 从 610M 扩展到约 7.1GB。二、分区表变了分区号全乱了这是第一个隐藏问题。删除三个分区后每个分区的编号都变了分区旧编号新编号bootp1p1bootargsp2p2baseparamp3p3pqparamp4p4logop5已删除kernelp6p5busyboxp7已删除backupp8已删除rootfsp9p6内核从 p6 变成 p5rootfs 从 p9 变成 p6。按理说rootfs 分区号变了只要 kernel 和 rootfs 的实际数据写对了位置系统就能起来。但问题是HiTool 刷写 bootargs 分区用的是原始bootargs9-32.bin文件里面记录的 rootfs 路径还是/dev/mmcblk0p9。刷完机第一次启动内核去找 p9但 p9 已经不存在了启动失败。解决方法串口进 U-Boot手动改 bootargs 里的 root 路径textsetenv bootargs modelmv100 consolettyAMA0,115200 root/dev/mmcblk0p6 rootfstypeext4 rootwait blkdevpartsmmcblk0:1M(boot),1M(bootargs),4M(baseparam),4M(pqparam),12M(kernel),-(rootfs) saveenv三、改了分区表还得改 bootcmd把 root 路径改对之后还是起不来textWrong Image Format for bootm command ERROR: cant get kernel image!内核数据在 eMMC 里但 U-Boot 的 bootcmd 命令去读的位置不对。旧 bootcmd 读的是 14M 偏移block 28672textmmc read 0 0x1FFFFC0 0x7000 0xA000新分区表里kernel 从 10M 开始block 20480但 bootcmd 还在老位置找内核读到的数据格式不对bootm 无法解析。改成textsetenv bootcmd mmc read 0 0x1FFFFC0 0x5000 0xA000;bootm 0x1FFFFC0 saveenv0x5000 20480 blocks 10M 偏移。这次能起来了。四、坑HiTool 的 TFTP 端口这个坑和分区表无关但绕不过去。HiTool 启动时报错textTFTP服务器启动失败端口69可能被占用端口是空的但 HiTool 就是绑不上。排查发现Wine 普通用户无法绑定 1024 以下的特权端口。69 是特权端口。解决方法bashsudo setcap cap_net_bind_serviceep /usr/lib/wine/wineserver32 sudo setcap cap_net_bind_serviceep /usr/lib/wine/wineserver64重启 wineserver 后 HiTool 的 TFTP 正常启动。五、坑U-Boot 串口操作有两个小坑值得提一下。mmc write 显示的 block 号不准执行mmc write 0 0x1000000 45056 204800输出显示block # 282710, count 2115584跟输入完全对不上。U-Boot 内部做了转换可能与 erase group 对齐有关但 CRC 校验通过说明数据写对了。mmc read 二进制数据淹没串口用mmc read读回数据验证时二进制内容直接输出到串口终端乱码卡死。后面改用crc32对比校验值不再读大块数据。textcrc32 0x1000000 0xA00000 # 内存中的校验 mmc read 0 0x1000000 0x5000 0xA000 # 读 eMMC 到内存 crc32 0x1000000 0xA00000 # 再算一次对比六、翻车恢复如果刷完起不来串口改回旧 bootargs 就能回到原来的系统textsetenv bootargs modelmv100 consolettyAMA0,115200 root/dev/mmcblk0p9 rootfstypeext4 rootwait blkdevpartsmmcblk0:1M(boot),1M(bootargs),4M(baseparam),4M(pqparam),4M(logo),20M(kernel),64M(busybox),512M(backup),-(ubuntu) saveenv run bootcmd新旧两套分区表的数据都在 eMMC 上只要 bootargs 指对了分区就能切回去。七、总结改分区表这件事看起来只是重新划分空间实际上触及了启动链上的三个关键点问题原因解决rootfs 挂不上分区号变了bootargs 里还是旧路径串口改 root/dev/mmcblk0p6内核读不到kernel 起始偏移变了bootcmd 没改bootcmd 里 0x7000 改 0x5000HiTool TFTP 绑不上端口Wine 无特权端口权限setcap 给 wineserver核心原则改了分区表必须同步修改 bootargs 和 bootcmd。这三者任何一个没跟上系统都起不来。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门