bmcstudio 依赖bingo,bmcgo转向bingo后显示文件大小超过90M

背景:由于 BMC Studio 构建依赖 bingo,我们从 25.06 bmcgo 转向 bingo 出包。但在接入更多模块组件 后,整体固件包体积超过 90MB

在 openUBMC Web 界面进行固件升级时,页面提示“超过 90M 会限制升级”。我临时把前端校验阈值调大后可以选择文件,但实际升级仍失败,后端由 firmware_mgmt 返回错误,升级流程未触发。

升级时候,ssh bmc看到包是被上传到 /tmp/web/目录下,如果包本身超过90就会自动阻塞删除,正常情况是上传完会自动改名成放到web里面的升级包,这里上传到超过90M以后就被阻塞了,然后自动删除后面的文件了。

tmp目录其实应该还是够大的,应该是除了前端限制,后端也做了限制,看样子具体限制逻辑是在firmware_mgmt里面

当前的HPM包应该不会超过90M。建议挂载temp/build_<board_name>_<build_type>_dev/output目录下的img文件,与之前的镜像文件比对,检查分析分区变大的原因。

环境

  • 目录:temp/build_<board>_<build_type>_dev/output/

  • 镜像:rootfs_BMC.img(bingo)、rootfs_iBMC.img(bmcgo)


1. 镜像 tar 包/压缩比

命令:

 # 列出 tar 内部条目及逻辑大小(应≈377MB)
 tar -tvzf rootfs_BMC.tar.gz   | cat
 tar -tvzf rootfs_iBMC.tar.gz | cat
 ​
 root@bc931c047dbf:/home/workspace/source/manifest/temp/build_openUBMC_debug_dev/output# tar -tvzf rootfs_BMC.tar.gz   | cat
 -rw-r--r-- root/root 394293248 2025-09-24 00:29 rootfs_BMC.img
 root@bc931c047dbf:/home/workspace/source/manifest/temp/build_openUBMC_debug_dev/output# tar -tvzf rootfs_iBMC.tar.gz | cat
 -rw-r--r-- root/root 394268672 2025-09-24 00:28 rootfs_iBMC.img
 ​
 # 查看 gzip 压缩比
 gzip -lv rootfs_BMC.tar.gz
 gzip -lv rootfs_iBMC.tar.gz
 ​
 method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
 defla 02082353 Sep 24 00:39            94437893           394301440  76.0% rootfs_BMC.tar
 method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
 defla 8392615b Sep 24 00:39            88930231           394270720  77.4% rootfs_iBMC.tar
 root@bc931c047dbf:/home/workspace/source/manifest/temp/build_openUBMC_debug_dev/output#

截图:

2. 稀疏/可压缩性(du vs apparent-size)

命令:

 du -h rootfs_BMC.img; du -h --apparent-size rootfs_BMC.img
 293M    rootfs_BMC.img
 377M    rootfs_BMC.img
 du -h rootfs_iBMC.img; du -h --apparent-size rootfs_iBMC.img
 276M    rootfs_iBMC.img
 377M    rootfs_iBMC.img

截图:

3. 挂载对比:总体占用与大目录


# 总览
 df -h /mnt/bmc
 df -h /mnt/ibmc
 文件系统        大小  已用  可用 已用% 挂载点
 /dev/loop0      343M  279M   41M   88% /mnt/bmc
 文件系统        大小  已用  可用 已用% 挂载点
 /dev/loop1      343M  261M   60M   82% /mnt/ibmc
 # 顶层目录占用 Top(看出 /usr 差异)
 du -shx /mnt/bmc/* 2>/dev/null | sort -h | tail
 du -shx /mnt/ibmc/* 2>/dev/null | sort -h | tail
 ​
 602K    /mnt/bmc/share
 630K    /mnt/bmc/etc
 2.5M    /mnt/bmc/sbin
 7.2M    /mnt/bmc/boot
 8.3M    /mnt/bmc/rtos_v2
 11M     /mnt/bmc/lib64
 22M     /mnt/bmc/bin
 27M     /mnt/bmc/lib
 94M     /mnt/bmc/usr
 108M    /mnt/bmc/opt
 ​
 603K    /mnt/ibmc/share
 632K    /mnt/ibmc/etc
 2.5M    /mnt/ibmc/sbin
 8.3M    /mnt/ibmc/rtos_v2
 8.4M    /mnt/ibmc/boot
 11M     /mnt/ibmc/lib64
 22M     /mnt/ibmc/bin
 27M     /mnt/ibmc/lib
 73M     /mnt/ibmc/usr
 108M    /mnt/ibmc/opt

截图:

4. 文件级差异:/usr/lib64(逐文件)

命令:

 # 导出两个镜像 /usr/lib64 文件清单与大小
 (cd /mnt/bmc/usr/lib64  && find . -type f -printf "%P\t%s\n" | sort) > /tmp/bmc_lib64.tsv
 (cd /mnt/ibmc/usr/lib64 && find . -type f -printf "%P\t%s\n" | sort) > /tmp/ibmc_lib64.tsv
 ​
 # 只显示 “BMC 比 iBMC 大” 的条目(按差值)
 join -a1 -a2 -e 0 -o 0,1.2,2.2 -t $'\t' /tmp/bmc_lib64.tsv /tmp/ibmc_lib64.tsv \
 | awk -F'\t' '{delta=$2-$3; if (delta>0) printf "%10.2f MB\t%s\n", delta/1024/1024, $1}' \
 | sort -h | tail -n 30
 ​
       0.02 MB   libfilehook.so
       0.02 MB   libnsm_kmc.so
       0.02 MB   libplatform.so
       0.04 MB   libclp_private_cmd.so
       0.08 MB   libcutils.so
       0.08 MB   libuip.so
       0.12 MB   libclp_common.so
       0.20 MB   libsnmp.so
       0.53 MB   liblogging.so
       2.84 MB   libmctp.so
      15.55 MB   libsoc_adapter.so

截图:

  • 差值列表(例如 libsoc_adapter.so +15.55 MB, libmctp.so +2.84 MB …)

5. 佐证“未 strip”的库(ELF not stripped)

命令:

 # BMC:列出未 strip 的 ELF(带大小)
 find /mnt/bmc/usr/{bin,sbin,lib,lib64} -type f \
   -exec sh -c 'for f; do file "$f" | grep -q "not stripped" && \
   printf "%12s %s\n" "$(stat -c %s "$f")" "$f"; done' _ {} + \
 | sort -n | awk '{printf "%10.2f MB\t%s\n",$1/1024/1024,$2}'
       0.03 MB   /mnt/bmc/usr/lib64/libnsm_kmc.so
       0.03 MB   /mnt/bmc/usr/lib64/libplatform.so
       0.03 MB   /mnt/bmc/usr/lib64/libfilehook.so
       0.06 MB   /mnt/bmc/usr/lib64/libclp_private_cmd.so
       0.12 MB   /mnt/bmc/usr/lib64/libuip.so
       0.12 MB   /mnt/bmc/usr/lib64/libcutils.so
       0.17 MB   /mnt/bmc/usr/lib64/libclp_common.so
       0.25 MB   /mnt/bmc/usr/lib64/libsnmp.so
       0.57 MB   /mnt/bmc/usr/lib64/liblogging.so
       2.95 MB   /mnt/bmc/usr/lib64/libmctp.so
       3.39 MB   /mnt/bmc/usr/lib64/liblua.so
      16.48 MB   /mnt/bmc/usr/lib64/libsoc_adapter.so
 ​
 # iBMC:同样命令(通常只会看到 1 个,比如 liblua.so)
 find /mnt/ibmc/usr/{bin,sbin,lib,lib64} -type f \
   -exec sh -c 'for f; do file "$f" | grep -q "not stripped" && \
   printf "%12s %s\n" "$(stat -c %s "$f")" "$f"; done' _ {} + \
 | sort -n | awk '{printf "%10.2f MB\t%s\n",$1/1024/1024,$2}'
       3.39 MB   /mnt/ibmc/usr/lib64/liblua.so

截图:

6. 文档差异(/usr/share/doc)

命令:

 du -ah /mnt/bmc/usr/share/doc | sort -h | tail -n 30
 51K     /mnt/bmc/usr/share/doc/openubmc/sensor/mds/model.json
 53K     /mnt/bmc/usr/share/doc/openubmc/account/mds/ipmi.json
 62K     /mnt/bmc/usr/share/doc/openubmc/chassis/mds/schema.json
 65K     /mnt/bmc/usr/share/doc/openubmc/thermal_mgmt/mds/model.json
 75K     /mnt/bmc/usr/share/doc/openubmc/fructrl/mds
 84K     /mnt/bmc/usr/share/doc/openubmc/thermal_mgmt/mds/schema.json
 85K     /mnt/bmc/usr/share/doc/openubmc/frudata/mds
 93K     /mnt/bmc/usr/share/doc/openubmc/sensor/mds/schema.json
 95K     /mnt/bmc/usr/share/doc/openubmc/fructrl
 100K    /mnt/bmc/usr/share/doc/openubmc/power_mgmt/mds
 103K    /mnt/bmc/usr/share/doc/openubmc/chassis/mds
 104K    /mnt/bmc/usr/share/doc/openubmc/bios/mds
 104K    /mnt/bmc/usr/share/doc/openubmc/frudata
 105K    /mnt/bmc/usr/share/doc/openubmc/pcie_device/mds
 118K    /mnt/bmc/usr/share/doc/openubmc/chassis
 119K    /mnt/bmc/usr/share/doc/openubmc/power_mgmt
 124K    /mnt/bmc/usr/share/doc/openubmc/bios
 125K    /mnt/bmc/usr/share/doc/openubmc/pcie_device
 136K    /mnt/bmc/usr/share/doc/openubmc/account/mds
 138K    /mnt/bmc/usr/share/doc/openubmc/general_hardware/mds/model.json
 174K    /mnt/bmc/usr/share/doc/openubmc/account
 177K    /mnt/bmc/usr/share/doc/openubmc/thermal_mgmt/mds
 183K    /mnt/bmc/usr/share/doc/openubmc/sensor/mds
 198K    /mnt/bmc/usr/share/doc/openubmc/thermal_mgmt
 214K    /mnt/bmc/usr/share/doc/openubmc/sensor
 224K    /mnt/bmc/usr/share/doc/openubmc/general_hardware/mds/schema.json
 406K    /mnt/bmc/usr/share/doc/openubmc/general_hardware/mds
 434K    /mnt/bmc/usr/share/doc/openubmc/general_hardware
 1.9M    /mnt/bmc/usr/share/doc
 1.9M    /mnt/bmc/usr/share/doc/openubmc
 ​
 du -ah /mnt/ibmc/usr/share/doc | sort -h | tail -n 30
 1.0K    /mnt/ibmc/usr/share/doc

截图:

  • 图11:BMC 文档树(约 1.9 MB)

  • 图12:iBMC 文档树(约 1.0K)

7. 小结

  • 差异来源/usr/lib64 未 strip 的 .so(合计约 19.5 MB)+ 文档(约 1.9 MB)。
2 个赞

谢谢海军哥,通过定位有些动态库符号应该是作为分析调试的留下来的吧。

vim /usr/local/lib/python3.12/dist-packages/bmcgo/tasks/task_build_rootfs_img.py +362
临时方案,注释了2行 NOT strip的几个库即可。注释后烧录成功

1 个赞

如果需要修改bingo,建议提一个issue修改,需要分析为什么之前需要保留这些文件的调试信息。

debug是便于现场调试/堆栈符号化、性能分析或早期模块验证。发行镜像体积小,同时保留完整调试能力,核心做法是“分离调试符号。,对发行镜像里的 so进行导出符号,把 *.debug 作为独立的符号包随版本归档(不进镜像)。但是这块如何易于让开发者无感操作,简化操作方法是需要考虑,目前我这块还没好的头绪。