arch
(Evan(bx))
1
背景:由于 BMC Studio 构建依赖 bingo,我们从 25.06 bmcgo 转向 bingo 出包。但在接入更多模块组件 后,整体固件包体积超过 90MB。
在 openUBMC Web 界面进行固件升级时,页面提示“超过 90M 会限制升级”。我临时把前端校验阈值调大后可以选择文件,但实际升级仍失败,后端由 firmware_mgmt 返回错误,升级流程未触发。
升级时候,ssh bmc看到包是被上传到 /tmp/web/目录下,如果包本身超过90就会自动阻塞删除,正常情况是上传完会自动改名成放到web里面的升级包,这里上传到超过90M以后就被阻塞了,然后自动删除后面的文件了。
tmp目录其实应该还是够大的,应该是除了前端限制,后端也做了限制,看样子具体限制逻辑是在firmware_mgmt里面
xuhaijun
(xuhaijun)
2
当前的HPM包应该不会超过90M。建议挂载temp/build_<board_name>_<build_type>_dev/output目录下的img文件,与之前的镜像文件比对,检查分析分区变大的原因。
arch
(Evan(bx))
3
环境
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 个赞
arch
(Evan(bx))
4
谢谢海军哥,通过定位有些动态库符号应该是作为分析调试的留下来的吧。
vim /usr/local/lib/python3.12/dist-packages/bmcgo/tasks/task_build_rootfs_img.py +362
临时方案,注释了2行 NOT strip的几个库即可。注释后烧录成功
1 个赞
xuhaijun
(xuhaijun)
5
如果需要修改bingo,建议提一个issue修改,需要分析为什么之前需要保留这些文件的调试信息。
arch
(Evan(bx))
7
debug是便于现场调试/堆栈符号化、性能分析或早期模块验证。发行镜像体积小,同时保留完整调试能力,核心做法是“分离调试符号。,对发行镜像里的 so进行导出符号,把 *.debug 作为独立的符号包随版本归档(不进镜像)。但是这块如何易于让开发者无感操作,简化操作方法是需要考虑,目前我这块还没好的头绪。