頂盒改分區(qū)表踩坑記錄:從分區(qū)號變化到 bootcmd 偏移)
2026/7/20背景原廠固件 rootfs 只有 610MB裝完基礎(chǔ)系統(tǒng)后所剩無幾。手頭這臺 Hi3798MV100 盒子的 eMMC 有 8GB大部分空間被三個用不上的分區(qū)占著logo4M、recovery64M、backup512M。目標(biāo)是砍掉這三個分區(qū)把空間全部給 rootfs。一、新舊分區(qū)表對比原始分區(qū)表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)刪除的分區(qū)分區(qū)大小刪除原因logo4M不需要開機(jī)畫面busybox/recovery64M不需要恢復(fù)模式backup512M不需要備份分區(qū)kernel 從 20M 縮到 12M因?yàn)樾聝?nèi)核實(shí)際只有 10.3MB。rootfs 從 610M 擴(kuò)展到約 7.1GB。二、分區(qū)表變了分區(qū)號全亂了這是第一個隱藏問題。刪除三個分區(qū)后每個分區(qū)的編號都變了分區(qū)舊編號新編號bootp1p1bootargsp2p2baseparamp3p3pqparamp4p4logop5已刪除kernelp6p5busyboxp7已刪除backupp8已刪除rootfsp9p6內(nèi)核從 p6 變成 p5rootfs 從 p9 變成 p6。按理說rootfs 分區(qū)號變了只要 kernel 和 rootfs 的實(shí)際數(shù)據(jù)寫對了位置系統(tǒng)就能起來。但問題是HiTool 刷寫 bootargs 分區(qū)用的是原始bootargs9-32.bin文件里面記錄的 rootfs 路徑還是/dev/mmcblk0p9。刷完機(jī)第一次啟動內(nèi)核去找 p9但 p9 已經(jīng)不存在了啟動失敗。解決方法串口進(jìn) 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三、改了分區(qū)表還得改 bootcmd把 root 路徑改對之后還是起不來textWrong Image Format for bootm command ERROR: cant get kernel image!內(nèi)核數(shù)據(jù)在 eMMC 里但 U-Boot 的 bootcmd 命令去讀的位置不對。舊 bootcmd 讀的是 14M 偏移block 28672textmmc read 0 0x1FFFFC0 0x7000 0xA000新分區(qū)表里kernel 從 10M 開始block 20480但 bootcmd 還在老位置找內(nèi)核讀到的數(shù)據(jù)格式不對bootm 無法解析。改成textsetenv bootcmd mmc read 0 0x1FFFFC0 0x5000 0xA000;bootm 0x1FFFFC0 saveenv0x5000 20480 blocks 10M 偏移。這次能起來了。四、坑HiTool 的 TFTP 端口這個坑和分區(qū)表無關(guān)但繞不過去。HiTool 啟動時(shí)報(bào)錯textTFTP服務(wù)器啟動失敗端口69可能被占用端口是空的但 HiTool 就是綁不上。排查發(fā)現(xiàn)Wine 普通用戶無法綁定 1024 以下的特權(quán)端口。69 是特權(quán)端口。解決方法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 號不準(zhǔn)執(zhí)行mmc write 0 0x1000000 45056 204800輸出顯示block # 282710, count 2115584跟輸入完全對不上。U-Boot 內(nèi)部做了轉(zhuǎn)換可能與 erase group 對齊有關(guān)但 CRC 校驗(yàn)通過說明數(shù)據(jù)寫對了。mmc read 二進(jìn)制數(shù)據(jù)淹沒串口用mmc read讀回?cái)?shù)據(jù)驗(yàn)證時(shí)二進(jìn)制內(nèi)容直接輸出到串口終端亂碼卡死。后面改用crc32對比校驗(yàn)值不再讀大塊數(shù)據(jù)。textcrc32 0x1000000 0xA00000 # 內(nèi)存中的校驗(yàn) mmc read 0 0x1000000 0x5000 0xA000 # 讀 eMMC 到內(nèi)存 crc32 0x1000000 0xA00000 # 再算一次對比六、翻車恢復(fù)如果刷完起不來串口改回舊 bootargs 就能回到原來的系統(tǒng)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新舊兩套分區(qū)表的數(shù)據(jù)都在 eMMC 上只要 bootargs 指對了分區(qū)就能切回去。七、總結(jié)改分區(qū)表這件事看起來只是重新劃分空間實(shí)際上觸及了啟動鏈上的三個關(guān)鍵點(diǎn)問題原因解決rootfs 掛不上分區(qū)號變了bootargs 里還是舊路徑串口改 root/dev/mmcblk0p6內(nèi)核讀不到kernel 起始偏移變了bootcmd 沒改bootcmd 里 0x7000 改 0x5000HiTool TFTP 綁不上端口Wine 無特權(quán)端口權(quán)限setcap 給 wineserver核心原則改了分區(qū)表必須同步修改 bootargs 和 bootcmd。這三者任何一個沒跟上系統(tǒng)都起不來。