从零开始:手把手实现 OpenBMC 在 ASPEED AST2600 上的移植
你有没有遇到过这样的场景?公司新设计了一块基于 ASPEED AST2600 的服务器主板,硬件团队信心满满地交板,结果发现厂商提供的闭源 BMC 固件功能受限、更新缓慢、漏洞频发。这时候,一个念头冒了出来:能不能自己搞一套开源可控的 BMC 系统?
答案是肯定的——OpenBMC就是为此而生。
但说起来容易,做起来难。从无到有把 OpenBMC 跑在一块还没进量产的 AST2600 板子上,意味着你要面对裸机引导、设备树适配、Yocto 编译地狱、串口黑屏等一系列“经典”嵌入式挑战。本文不玩虚的,就带你一步步踩完这些坑,让 OpenBMC 真正在你的硬件上“呼吸”起来。
为什么选 OpenBMC + AST2600?
先别急着敲命令,咱们得明白:这组合到底强在哪?
ASPEED AST2600 是目前主流高端服务器 BMC 的“心脏”。它不是什么小打小闹的单片机,而是正儿八经的多核 ARM SoC —— 双核甚至四核 Cortex-A35,主频 1.2GHz,支持 DDR4 内存、万兆网口、KVM 视频重定向,还内置 AES 加密引擎和真随机数发生器(TRNG)。换句话说,它足够强大,能跑一个完整的 Linux 系统。
而 OpenBMC 正是为这类高性能 BMC 量身打造的开源固件框架。它不像传统 IPMI 那样只提供基础控制,而是构建了一个现代化的服务体系:通过Redfish REST API提供结构化数据接口,用D-Bus实现服务间通信,前端还能支持 Web UI 和远程 KVM。更重要的是,它是开源可审计的,企业可以完全掌控代码逻辑,定制安全策略,快速响应 CVE 漏洞。
所以,当你选择 OpenBMC 移植到 AST2600,本质上是在为你的服务器打造一个“智能运维大脑”。
准备工作:搭建 Yocto 构建环境
OpenBMC 不是一个可以直接烧写的.bin文件,它是一个基于Yocto Project的完整嵌入式 Linux 发行版构建系统。这意味着你需要准备好一个干净的 Linux 开发环境(推荐 Ubuntu 20.04/22.04)。
安装依赖
sudo apt update sudo apt install -y gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat cpio python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping libssl-dev rsync flex bison libselinux1-dev \ libacl1-dev liblocale-gettext-perl libcap-dev libgtk-3-dev liblz4-tool pigz初始化 OpenBMC 源码仓库
OpenBMC 使用repo工具管理多个 Git 子项目:
mkdir openbmc-ast2600 && cd openbmc-ast2600 repo init -u https://github.com/openbmc/openbmc.git -b master repo sync⚠️ 注意:这个过程可能耗时较长(10~30分钟),取决于网络状况。
此时你会发现目录下多了十几个meta-*层,比如meta-phosphor、meta-openembedded,它们共同构成了 OpenBMC 的“积木”。
关键一步:引入 meta-aspeed 支持层
虽然 OpenBMC 主线已经包含了部分 ASPEED 支持,但 AST2600 的完整适配主要由社区维护在独立的meta-aspeed层中。
git clone https://github.com/openbmc/meta-aspeed layers/meta-aspeed bitbake-layers add-layer ../layers/meta-aspeed这一步至关重要。meta-aspeed提供了:
- AST2600 的机器配置(machine config)
- 定制 U-Boot 和 SPL 补丁
- 内核驱动支持(如 SGPIO、eMMC、视频编码等)
- Flash 烧录脚本和分区布局
没有它,你的构建系统根本不知道“ast2600-evb”是什么。
配置目标机器:MACHINE = “ast2600-evb”
接下来要告诉 Yocto:“我要编的是 AST2600 的板子”。
编辑conf/local.conf,加入以下内容:
MACHINE ??= "ast2600-evb" DISTRO ?= "phosphor" PACKAGE_MANAGER = "opkg" # 启用调试符号,方便后续分析崩溃日志 EXTRA_IMAGE_FEATURES += "debug-tweaks dbg-pkgs" # 设置 SDK 架构(用于后期生成交叉工具链) SDKMACHINE = "x86_64"这里的ast2600-evb是 ASPEED 官方评估板的参考配置。如果你是自研板卡,后续需要复制并改名为自己的 machine 名(如mycompany-server-bmc),再逐步修改外设定义。
设备树(Device Tree):硬件描述的语言
Linux 内核不会“猜”你板子上接了什么外设,它靠设备树(.dts文件)来了解硬件拓扑。对于 AST2600,核心文件位于meta-aspeed/recipes-kernel/linux/linux-aspeed/git/目录下的ast2600-evb.dts。
我们来看一段关键配置:
/dts-v1/; #include "ast2600.dtsi" / { model = "ASPEED AST2600 EVB"; compatible = "aspeed,ast2600-evb", "aspeed,ast2600"; memory@80000000 { device_type = "memory"; reg = <0x80000000 0x20000000>; /* 512MB */ }; chosen { bootargs = "console=ttyS4,115200 earlyprintk"; }; };几点说明:
-memory@80000000定义了 DDR 起始地址和大小。如果你的板子是 1GB 内存,应改为reg = <0x80000000 0x40000000>;
-bootargs中的ttyS4对应 AST2600 的 UART5 控制台(硬件引脚为 A19/A20)。务必确认你的原理图是否与此一致。
- 若添加了风扇控制 GPIO,可在设备树中声明gpio-fan节点,并通过gpio-fan-speed-map定义温控曲线。
设备树一旦出错,轻则串口无输出,重则内核 panic。建议首次移植时尽量使用官方 EVB 配置,验证基础功能后再逐步调整。
开始构建:第一次 bitbake
一切就绪,执行构建命令:
TEMPLATECONF=meta-aspeed/conf source openbmc-env export MACHINE=ast2600-evb bitbake obmc-phosphor-image首次构建将触发大量下载操作:Linux 内核、U-Boot、systemd、Python、D-Bus……整个过程可能持续数小时,取决于 CPU 性能和网络速度。
成功后,你会在tmp/deploy/images/ast2600-evb/找到最终镜像:
| 文件名 | 用途 |
|---|---|
obmc-phosphor-image-ast2600-evb.static.mtd | 完整 MTD 镜像,可直接烧写至 SPI Flash |
uImage | 压缩内核镜像 |
fitImage | 包含 kernel + initramfs 的 FIT 格式镜像 |
u-boot.bin | U-Boot 引导程序 |
其中.static.mtd是最常用的烧录格式,因为它已经按照 AST2600 的 flash-layout 进行了分区打包。
如何烧录固件?
有两种常见方式:
方法一:使用 Dediprog SF100/SF600 等编程器
将 SPI Flash 芯片取下,插入编程器,加载.static.mtd文件直接烧写。适合工厂量产或调试初期无法启动的情况。
方法二:通过 USB 更新模式(ROM Utility)
AST2600 支持一种特殊的“USB Boot Mode”,可通过短接特定引脚进入。此时芯片会模拟成一个 USB Mass Storage 设备,你只需将u-boot.bin和fitImage复制进去即可自动刷新。
具体步骤参考meta-aspeed中的doc/usb-flash-programming.md文档。
启动!看第一行串口输出
连接 UART 转 USB 模块(推荐 CH343 或 FT232),波特率设置为115200,打开终端(如 minicom、PuTTY),通电观察输出。
理想情况下,你应该看到类似以下流程:
[ROM] AST2600 Boot ROM v1.2 Loading SPL from SPI Flash... SPL: DRAM initialized, jumping to U-Boot U-Boot 2023.07 (Aug 15 2024 - 10:00:00 +0000) DRAM: 512 MiB In: serial@1e784000 Out: serial@1e784000 Err: serial@1e784000 Net: aspeed_gmac0 Hit any key to stop autoboot: 3 Booting FIT image from 0x83000000... Kernel image @ 0x83080000 [ 0x000000 - 0x4a8c30 ] Loading initrd from FIT Image... Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0x0 ... phosphor-state-manager[123]: Transitioning to OS_RUNNING恭喜!你已经成功迈出了最关键的一步。
如果卡住了?常见问题排查清单
别慌,以下是我在实际项目中最常遇到的几个“拦路虎”:
❌ 串口无任何输出
- ✅ 检查电源:VCC_MAIN 是否稳定输出 3.3V?
- ✅ 确认晶振:25MHz 主时钟是否起振?示波器测量 X1/X2 引脚。
- ✅ UART 接线是否反接?TX/RX 是否接反?
- ✅ Flash 中是否有有效代码?用编程器读取前 16KB,查看是否有
48 50 43 52(HP-CR)魔数。
❌ 卡在 SPL 阶段
- ✅ 检查 DDR 供电与时序:是否满足 AST2600 数据手册要求?
- ✅ 设备树中 memory 节点的地址是否正确?
- ✅ 是否启用了错误的 SPL 配置?确保
UBOOT_USE_SPL = "1"已设置。
❌ 内核启动后挂住
- ✅ 查看
bootargs中的console=参数是否匹配实际 UART 编号? - ✅ rootfs 分区是否能找到?检查 MTD 分区表与镜像一致性。
- ✅ 是否缺少必要的设备树节点导致驱动初始化失败?
🔧调试秘籍:开启
earlyprintk并在内核配置中启用dynamic_debug,可以让更多底层信息打印出来。
进阶技巧:裁剪镜像 & 自定义功能
默认构建的镜像体积较大(约 60~80MB),若 Flash 容量紧张,可通过以下方式优化:
裁剪不必要的组件
在local.conf中添加:
# 移除图形界面相关包 IMAGE_INSTALL_remove = "phosphor-webui-vue phosphor-kvm-host" DISTRO_FEATURES_remove = "x11 wayland" # 禁用 Python 调试支持 VIRTUAL-RUNTIME_init_manager = "sysvinit"添加自定义服务
例如增加一个温度监控脚本:
# meta-mycompany/recipes-phosphor/applications/my-temp-monitor.bb SUMMARY = "Custom Temperature Monitor" SRC_URI = "file://temp-monitor.sh" do_install() { install -d ${D}${sbindir} install -m 0755 ${WORKDIR}/temp-monitor.sh ${D}${sbindir}/ } SYSTEMD_SERVICE:${PN} = "my-temp-monitor.service"然后将其加入镜像:
IMAGE_INSTALL:append = " my-temp-monitor"生产级考量:安全与可靠性
当你准备将这套系统投入商用,以下几个点必须考虑:
✅ 双分区 A/B 更新
利用phosphor-software-manager实现原子更新,避免升级失败导致“变砖”。
✅ 安全启动(Secure Boot)
使用 U-Boot 的CONFIG_SECURE_BOOT功能,对 kernel 和 dtb 进行签名验证,防止恶意固件注入。
✅ 硬件看门狗联动
配置obmc-watchdog服务,定期喂狗;异常时自动重启 BMC 或通知主机。
✅ 日志持久化与远程上报
将关键日志写入非易失存储,并通过 syslog 发送到集中式日志服务器。
写在最后:不只是“能跑”
很多人以为,“能把 OpenBMC 跑起来”就算完成了移植。其实这只是起点。
真正的价值在于:你能基于这个开放平台,构建出差异化的带外管理能力。比如:
- 集成 AI 模型预测风扇故障
- 实现跨机柜的能耗协同调度
- 开发专属的 Redfish 扩展接口
- 与 CMDB 系统深度打通
掌握 OpenBMC 移植技术,不只是学会了一个工具链的使用,更是拿到了通往现代数据中心智能化运维的钥匙。
如果你正在尝试将 OpenBMC 移植到自己的 AST2600 板卡上,欢迎在评论区分享你的经验或困惑。我们一起把这条路走得更稳、更远。