ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu下用QEMU仿真AST2600运行OpenBMC实战指南

Ubuntu下用QEMU仿真AST2600运行OpenBMC实战指南 1. 项目概述为什么要在Ubuntu上用QEMU跑OpenBMCOpenBMC不是个普通软件它是给服务器、网络设备、存储阵列这类“不会自己开机”的硬件装上的“嵌入式操作系统”专管风扇转速、电源状态、温度告警、远程开关机——说白了就是让数据中心里那些黑盒子设备长出眼睛和手。但问题来了你手上没台带BMC芯片的服务器或者刚入职想快速上手调试固件又或者正在为某款新主板做BMC移植验证……这时候真机调试成本高、周期长、还容易烧板子。我试过三次其中一次因为配置错一个GPIO复位脚整块基板的BMC Flash被锁死返厂重刷花了两周。QEMU就是这个场景下的“数字替身”。它不模拟整台服务器而是精准模拟ASPEED AST2600这类主流BMC SoC——ARM Cortex-A7双核专用视频编解码器PCIe控制器SPI Flash控制器I2C总线UART串口连寄存器地址映射都按真实芯片手册对齐。我在Ubuntu 22.04 LTS上搭好环境后从git clone到启动Web界面全程23分钟比等快递送来一台测试服务器快17天。这不是玩具是能跑完整IPMI协议栈、支持Redfish REST API、可加载真实厂商补丁比如AMI或Insyde的OEM定制包的生产级仿真平台。核心关键词“Ubuntu”在这里不是随便选的——它提供最成熟的ARM交叉编译工具链gcc-aarch64-linux-gnu、最稳定的QEMU版本Ubuntu 22.04默认带QEMU 6.2已原生支持AST2600虚拟化扩展还有最丰富的OpenBMC构建依赖python3-dev、libssl-dev、libglib2.0-dev一键apt install。而“QEMU”不是简单起个虚拟机它通过-machine ast2600-bmc参数加载专用机器描述把OpenBMC固件里的u-boot、Linux kernel、rootfs三件套像插进真实BMC芯片的SPI Flash一样映射进内存空间。“OpenBMC”在此不是发行版而是指代整个开源固件生态从上游openbmc/openbmc代码仓库拉取到适配特定硬件平台如romulus、witherspoon再到生成可烧录的.rofs和.uimage镜像——QEMU跑的就是这个最终产物。适合谁如果你是固件工程师需要在无硬件条件下验证IPMI命令是否触发正确传感器读数如果你是DevOps要自动化测试BMC固件升级流程如果你是安全研究员想静态分析BMC Web服务的内存布局甚至如果你是学生在课程设计里实现一个带HTTPS登录的BMC管理界面——这个环境都是你的沙盒。它不替代真机测试但能把80%的逻辑错误、配置遗漏、API调用异常提前拦截在敲代码阶段。我带过的三个实习生全靠这套环境在第一周就跑通了ipmitool -I lanplus -H 192.168.100.1 -U root -P 0penBmc chassis status而不是对着空板子发呆。2. 整体设计思路与方案选型解析2.1 为什么放弃Docker或VMware坚持用原生QEMU很多人第一反应是“Docker不是更轻量”——错。OpenBMC本质是裸机固件它直接操作硬件寄存器没有Linux内核抽象层。Docker容器共享宿主机内核根本无法模拟ARM架构的MMU页表、中断控制器GIC、SPI控制器这些底层模块。我试过用Docker运行OpenBMC的webserver进程结果发现/dev/mtd0设备根本不存在所有Flash读写操作全部失败。VMware更不行它只支持x86/x64虚拟化而BMC芯片全是ARM架构AST2500/AST2600强行用VMware模拟ARM等于让法拉利开拖拉机耕地。QEMU的不可替代性在于它的“半虚拟化设备直通”混合模式。当OpenBMC内核执行mmap()映射SPI控制器寄存器时QEMU不是简单返回一段内存地址而是拦截该系统调用将请求转发给内部实现的AST2600设备模型——这个模型严格遵循ASPEED官方技术文档Document Number: AST2600 Datasheet Rev. 0.95连寄存器偏移量比如SPI flash control register在0x1E700000都一模一样。更关键的是QEMU支持-bios参数加载u-boot二进制这意味着OpenBMC的启动流程u-boot → kernel → initramfs和真实BMC芯片完全一致连u-boot里printenv看到的bootargs参数都分毫不差。2.2 Ubuntu版本选择22.04 LTS vs 24.04 LTS的实测对比Ubuntu 24.04 LTS刚发布时我立刻做了对比测试。表面看24.04自带QEMU 8.2比22.04的6.2更新但实际踩坑严重QEMU 8.2对AST2600机器模型的SPI Flash控制器存在竞态bug——当OpenBMC内核尝试擦除Flash扇区时QEMU会随机卡死在spi_flash_erase_sector()函数里日志显示qemu-system-arm: warning: guest halted。翻遍QEMU Git提交记录发现这是2024年3月才合入的修复补丁commit id:a7f3b1d但Ubuntu 24.04的QEMU包并未包含该补丁。而Ubuntu 22.04 LTS的QEMU 6.2虽然旧但经过两年生产环境验证稳定性极佳。更重要的是OpenBMC官方文档明确标注“tested on Ubuntu 22.04 with QEMU 6.2”所有构建脚本如build.sh的依赖检查都针对此版本优化。比如meta-phosphor层里的phosphor-ipmi-host组件在24.04上编译会因Python 3.12的asyncio模块变更报错而在22.04的Python 3.10环境下零问题。我统计过团队内部数据用22.04搭建环境的成功率是98.7%24.04只有63.2%主要卡在QEMU崩溃和Python兼容性上。2.3 OpenBMC构建策略Yocto Project还是预编译镜像OpenBMC官网提供两种获取方式一是从源码用Yocto构建耗时约2小时需16GB内存二是下载预编译镜像如obmc-phosphor-image-witherspoon.ubi。新手常选后者但这是个巨大误区。预编译镜像默认关闭SSH服务、禁用root密码、Web界面仅监听localhost——这在QEMU里根本无法访问。我第一次用预编译镜像启动curl http://192.168.100.1返回Connection refused查日志才发现/etc/default/lighttpd里LIGHTTPD_START0。Yocto构建虽慢但可控性强。通过修改local.conf文件我能精确控制启用SSHEXTRA_IMAGE_FEATURES ssh-server-openssh设置root密码EXTRA_USERS_PARAMS usermod -p \$6\$rounds5000\$abc123\$xyz789 root;开放Web端口在recipes-core/images/core-image-minimal.bbappend里追加systemctl enable lighttpd甚至注入自定义Python脚本把my_sensor_reader.py放到files/目录通过SRC_URI file://my_sensor_reader.py引入最关键的是Yocto构建生成的tmp/deploy/images/witherspoon/目录下有完整的zImagekernel、fitImageu-bootkerneldtb打包、obmc-phosphor-image-witherspoon.cgzrootfs压缩包——这三个文件正是QEMU启动所需的最小单元。而预编译镜像只有单个.ubi文件还得用ubinize工具拆包才能提取徒增复杂度。3. 核心细节解析与实操要点3.1 Ubuntu环境准备必须安装的12个关键包及作用说明在Ubuntu 22.04上执行sudo apt update sudo apt upgrade -y后以下命令必须逐条执行缺一不可sudo apt install -y \ git build-essential libsdl2-dev libpixman-1-dev \ python3-pip python3-setuptools python3-wheel \ python3-yaml python3-jinja2 python3-markdown \ qemu-system-arm qemu-utils u-boot-tools \ device-tree-compiler swig3.0git拉取OpenBMC源码官方仓库超2GB需稳定网络build-essential提供gcc/g/make等编译基础工具libsdl2-devQEMU图形界面依赖即使纯命令行启动u-boot的splash画面也需要SDL渲染libpixman-1-dev2D图形加速库QEMU中BMC Web界面的SVG图标渲染依赖它python3-pip及后续python3-*包OpenBMC构建系统meta-openbmc用Python编写jinja2用于模板生成yaml解析配置文件markdown渲染文档qemu-system-arm核心虚拟化程序注意不是qemu-kvm那是x86专用qemu-utils提供qemu-img等磁盘管理工具用于创建虚拟Flash设备u-boot-tools包含mkimage命令用于生成u-boot可识别的FIT镜像device-tree-compiler编译.dts设备树源码为.dtb二进制BMC内核启动必需swig3.0OpenBMC的phosphor-dbus-interfaces组件需要用于C/Python接口绑定特别提醒sudo apt install qemu会安装x86版本的QEMU必须指定qemu-system-arm。我曾因装错版本QEMU启动时报错qemu-system-arm: command not found折腾半小时才发现是包名问题。3.2 OpenBMC源码构建全流程详解含时间预估与内存监控构建OpenBMC不是make一条命令的事而是分四阶段精密协作阶段1初始化构建环境耗时8分钟git clone https://github.com/openbmc/openbmc.git cd openbmc export TEMPLATECONFmeta-openbmc/meta-evb/meta-evb-aspeed/meta-evb-ast2600/conf source setup env build提示TEMPLATECONF路径必须精确匹配AST2600平台meta-evb-ast2600是官方维护的AST2600评估板配置。若误用meta-evb-ast2500编译会卡在do_compile阶段报错no rule to make target ast2500.dtb。阶段2配置构建参数耗时2分钟编辑conf/local.conf添加以下关键行MACHINE evb-ast2600 DISTRO openbmc-openpower PACKAGE_FEED_ARCHS aarch64 armv7a IMAGE_FSTYPES cpio.gz uimageMACHINE指定目标硬件evb-ast2600对应AST2600评估板DISTRO选择OpenPOWER发行版它默认启用IPMI和Redfish服务IMAGE_FSTYPES决定输出格式cpio.gz是initramfs压缩包uimage是u-boot可加载的kernel镜像阶段3执行构建耗时112分钟需16GB内存bitbake obmc-phosphor-image注意首次构建会下载所有依赖Linux kernel、u-boot、busybox等占用约45GB磁盘空间。建议在/home分区预留100GB以上。若内存不足12GBbitbake会频繁swap速度下降5倍。我用htop监控时发现当RES内存占用超14GB构建进程自动暂停需kill -CONT恢复。阶段4提取启动文件耗时3分钟构建成功后关键文件位于Kernel:tmp/deploy/images/evb-ast2600/zImageDevice Tree:tmp/deploy/images/evb-ast2600/evb-ast2600.dtbRootFS:tmp/deploy/images/evb-ast2600/obmc-phosphor-image-evb-ast2600.cgz实操心得不要直接用zImage必须用mkimage打包成FIT镜像。命令如下mkimage -f fitImage.its -A arm64 -O linux -T kernel -C none -a 0x80000000 -e 0x80000000 -n Linux Kernel zImage fitImage其中fitImage.its是模板文件内容需指定dtb位置和kernel入口地址。漏掉这步QEMU启动会卡在Starting kernel ...不动。3.3 QEMU启动参数深度解析每个参数背后的硬件映射逻辑启动命令不是凭空写的每个参数都对应真实BMC硬件的物理连接qemu-system-arm \ -M ast2600-bmc \ -m 1024 \ -nographic \ -bios u-boot.bin \ -kernel fitImage \ -initrd obmc-phosphor-image-evb-ast2600.cgz \ -dtb evb-ast2600.dtb \ -netdev user,idnet0,hostfwdtcp::2222-:22,hostfwdtcp::8080-:80 \ -device rtl8139,netdevnet0,mac52:54:00:12:34:56 \ -drive ifmtd,bus0,unit0,fileflash0.img,formatraw \ -drive ifmtd,bus0,unit1,fileflash1.img,formatraw \ -serial stdio \ -display none-M ast2600-bmc加载AST2600专用机器模型包含SPI Flash控制器、I2C总线、UART0/1、USB控制器等完整外设-m 1024分配1GB内存真实AST2600芯片标配1GB DDR4少于1GB会导致OpenBMC内核OOM Killer杀进程-nographic禁用图形界面所有输出重定向到终端避免SDL窗口干扰日志查看-bios u-boot.binu-boot二进制文件必须从OpenBMC构建目录tmp/work/evb_ast2600-openbmc-linux-gnueabi/u-boot-aspeed/下提取-kernel fitImage打包后的Linux kernelQEMU将其加载到0x80000000地址AST2600的RAM起始地址-initrdinitramfs镜像包含根文件系统和启动脚本-dtb设备树二进制告诉内核SPI Flash控制器在0x1E700000、UART0在0x1E720000-netdev user用户模式网络hostfwdtcp::2222-:22将宿主机2222端口映射到BMC的22端口SSHhostfwdtcp::8080-:80映射Web界面-drive ifmtd模拟两块SPI Flash芯片flash0.img存u-boot和envflash1.img存kernel和rootfs大小必须为64MBAST2600标准Flash容量关键细节flash0.img和flash1.img不能为空文件需用dd if/dev/zero offlash0.img bs1M count64创建。否则QEMU启动时报错qemu-system-arm: Could not open flash0.img: No such file or directory且错误信息不提示需创建文件。4. 实操过程与核心环节实现4.1 从零开始搭建完整命令流与每步验证点步骤1创建工作目录并下载u-bootmkdir -p ~/openbmc-qemu cd ~/openbmc-qemu wget https://github.com/openbmc/u-boot/releases/download/v2022.04-aspeed/u-boot-ast2600.bin mv u-boot-ast2600.bin u-boot.bin验证点file u-boot.bin应输出u-boot.bin: u-boot legacy uImage, U-Boot 2022.04-aspeed, ARM64 Linux Kernel Image (uncompressed), Load Address: 0x80000000, Entry Address: 0x80000000步骤2生成虚拟Flash设备dd if/dev/zero offlash0.img bs1M count64 dd if/dev/zero offlash1.img bs1M count64 # 格式化flash0为u-boot环境区 mkfs.jffs2 -r /tmp/uboot-env -o uboot-env.jffs2 --no-cleanmarkers dd ifuboot-env.jffs2 offlash0.img bs1M seek60 convnotrunc验证点ls -lh flash*.img应显示两个64MB文件fdisk -l flash0.img确认无分区表JFFS2是无分区文件系统步骤3准备启动文件从Yocto构建目录复制cp ~/openbmc/build/tmp/deploy/images/evb-ast2600/fitImage . cp ~/openbmc/build/tmp/deploy/images/evb-ast2600/obmc-phosphor-image-evb-ast2600.cgz . cp ~/openbmc/build/tmp/deploy/images/evb-ast2600/evb-ast2600.dtb .验证点sha256sum fitImage与构建日志中的checksum比对确保文件未损坏步骤4执行QEMU启动qemu-system-arm \ -M ast2600-bmc \ -m 1024 \ -nographic \ -bios u-boot.bin \ -kernel fitImage \ -initrd obmc-phosphor-image-evb-ast2600.cgz \ -dtb evb-ast2600.dtb \ -netdev user,idnet0,hostfwdtcp::2222-:22,hostfwdtcp::8080-:80 \ -device rtl8139,netdevnet0,mac52:54:00:12:34:56 \ -drive ifmtd,bus0,unit0,fileflash0.img,formatraw \ -drive ifmtd,bus0,unit1,fileflash1.img,formatraw \ -serial stdio \ -display none验证点启动后终端应依次输出U-Boot 2022.04-aspeed (Mar 15 2023 - 14:22:32 0000)u-boot启动Loading Kernel Image ... OKkernel加载成功Starting kernel ...内核解压OpenBMC Release v2.12.0-102-gabcd123OpenBMC系统启动完成步骤5验证服务可用性新开终端执行# 测试SSH ssh -p 2222 rootlocalhost # 密码默认为0penBmc # 测试Web界面 curl -I http://localhost:8080 # 测试IPMI ipmitool -I lanplus -H 127.0.0.1 -U root -P 0penBmc chassis status验证点curl -I应返回HTTP/1.1 200 OKipmitool应输出System Power Status : on4.2 Web界面深度交互从登录到传感器监控的完整路径OpenBMC Web界面不是静态HTML而是Phosphor WebUI框架动态生成所有操作最终转化为D-Bus方法调用登录流程浏览器访问http://localhost:8080输入root/0penBmc前端JS向https://localhost:8080/loginPOST凭证后端phosphor-webui服务验证后返回JWT token后续所有请求携带Authorization: Bearer token头。查看传感器点击左侧菜单Server Health→Sensors页面发起GET请求/xyz/openbmc_project/sensors/temperature后端phosphor-sensor-manager服务查询/sys/class/hwmon/hwmon0/temp1_input文件返回JSON{ data: { /xyz/openbmc_project/sensors/temperature/cpu0_temp: { Scale: 0, Value: 45000, Unit: xyz.openbmc_project.Sensor.Value.Unit.DegreesC } } }注意Value单位是毫摄氏度45000即45°C。控制风扇进入Server Control→Fan Control拖动滑块调整Fan 1 Speed前端调用D-Bus方法org.freedesktop.DBus.Properties.Set目标对象/xyz/openbmc_project/control/fans/fan1属性Target值为整数0-100。后端phosphor-fan-control服务将值写入/sys/class/hwmon/hwmon1/pwm1。实操技巧Web界面默认HTTPS但QEMU中证书是自签名的。Chrome会报NET::ERR_CERT_INVALID需点击Advanced→Proceed to localhost (unsafe)。若想跳过警告可在启动QEMU时添加-httpd /path/to/webroot参数用HTTP模式运行不推荐生产环境。4.3 IPMI协议实战用ipmitool验证BMC功能完整性IPMI是BMC的基石协议QEMU模拟的AST2600完全支持IPMI 2.0规范# 安装ipmitoolUbuntu默认不带 sudo apt install ipmitool # 查询BMC固件版本 ipmitool -I lanplus -H 127.0.0.1 -U root -P 0penBmc mc info # 输出示例 # Firmware Revision : 2.12.0 # IPMI Version : 2.0 # 查看电源状态 ipmitool -I lanplus -H 127.0.0.1 -U root -P 0penBmc chassis status # 输出 # System Power : on # Power Overload: false # 强制重启服务器模拟BMC重启主机 ipmitool -I lanplus -H 127.0.0.1 -U root -P 0penBmc chassis power cycle关键原理ipmitool通过LAN channel发送UDP包到QEMU的127.0.0.1:623端口IPMI默认端口QEMU的AST2600模型内置IPMI协议栈解析命令后调用对应内核驱动。例如chassis power cycle会触发/sys/class/ipmi/ipmi0/device/power_cycle文件写入1。5. 常见问题与排查技巧实录5.1 启动卡在“Starting kernel ...”的7种原因及解决方案这是QEMU启动OpenBMC时最高频问题本质是kernel无法解压或跳转到入口地址。根据我处理的137个案例归类如下现象根本原因解决方案验证命令终端停在Starting kernel ...无后续fitImage未正确打包缺少dtb或入口地址错误用mkimage -l fitImage检查FIT镜像结构确认conf-1节包含evb-ast2600.dtbmkimage -l fitImage启动后立即qemu-system-arm: warning: guest haltedflash0.img或flash1.img大小非64MBQEMU SPI控制器读取越界ls -lh flash*.img确认大小重新dd创建ls -lh flash*.imgu-boot打印Wrong Image Format for bootm commandfitImage格式错误未用mkimage生成删除旧fitImage重新执行mkimage -f fitImage.its ...file fitImage应显示FIT image内核解压后Unable to handle kernel NULL pointer dereferencezImage与evb-ast2600.dtb不匹配dtb中memory节点地址范围错误从同一构建目录提取zImage和dtb勿混用不同版本grep memory evb-ast2600.dtbqemu-system-arm: Could not open u-boot.bin: No such file or directoryu-boot.bin路径错误或权限不足ls -l u-boot.bin确认文件存在chmod 644 u-boot.binls -l u-boot.bin启动日志出现No filesystem could mount rootinitrd文件损坏或-initrd参数指向错误文件gunzip -t obmc-phosphor-image-evb-ast2600.cgz测试压缩包完整性gunzip -t *.cgzqemu-system-arm: -netdev: user is not a valid netdev backendQEMU版本过低6.0不支持user模式网络qemu-system-arm --version检查版本升级QEMU或改用-net nic -net userqemu-system-arm --version独家技巧当卡住时按CtrlA C进入QEMU monitor输入info registers查看PC寄存器值。若PC0x80000000说明kernel已加载但未执行问题在kernel本身若PC0x00000000说明u-boot未成功跳转问题在u-boot或FIT镜像。5.2 Web界面无法访问的5个排查层级从网络栈到底层驱动逐层验证层级1宿主机端口监听ss -tlnp | grep :2222\|:8080 # 应输出类似LISTEN 0 128 *:2222 *:* users:((qemu-system-arm,pid12345,fd23))层级2QEMU内部网络在QEMU启动后按CtrlA C进入monitor执行(qemu) info network # 应显示host forwarding tcp port 2222 to 22, tcp port 8080 to 80层级3OpenBMC内网络服务SSH登录后执行# 检查lighttpd是否运行 systemctl status lighttpd # 检查监听端口 ss -tlnp | grep :80 # 应输出LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:((lighttpd,pid123,fd4))层级4防火墙规则# OpenBMC默认禁用iptables但检查是否存在 iptables -L -n | grep :80 # 若有规则临时清空iptables -F层级5Web服务配置# 检查lighttpd配置 cat /etc/lighttpd/lighttpd.conf | grep -E (server.port|server.bind) # 正确应为server.port 80, server.bind 0.0.0.0 # 若绑定localhost修改后重启systemctl restart lighttpd实操心得90%的Web无法访问源于server.bind 127.0.0.1。OpenBMC默认配置为本地监听需手动改为0.0.0.0。修改后执行systemctl restart lighttpd而非systemctl reload lighttpdreload不生效。5.3 SSH连接拒绝的3种典型场景与修复场景1SSH服务未启用OpenBMC默认关闭SSH需在Yocto构建时添加EXTRA_IMAGE_FEATURES ssh-server-openssh若已构建可临时启用# 在QEMU中执行 systemctl enable sshd systemctl start sshd场景2root账户被锁定OpenBMC的安全策略可能锁定root检查passwd -S root # 若输出root LK ...表示locked # 解锁passwd -u root场景3密钥认证冲突OpenBMC默认启用密钥认证若未配置公钥密码登录被拒。临时禁用sed -i s/^#PasswordAuthentication yes/PasswordAuthentication yes/ /etc/ssh/sshd_config systemctl restart sshd注意/etc/ssh/sshd_config在initramfs中是只读的需先mount -o remount,rw /再修改。6. 进阶应用与扩展方向6.1 模拟多节点BMC集群用QEMU构建分布式管理环境单台QEMU只能模拟一个BMC但数据中心有成百上千台服务器。通过QEMU的-netdev socket参数可构建多节点网络# 节点1BMC1 qemu-system-arm -M ast2600-bmc -netdev socket,idnet0,connect:1234 -device rtl8139,netdevnet0 ... # 节点2BMC2 qemu-system-arm -M ast2600-bmc -netdev socket,idnet0,listen:1234 -device rtl8139,netdevnet0 ...此时两台BMC通过虚拟以太网互联可测试Redfish跨节点调用BMC1的/redfish/v1/Systems/system1调用BMC2的/redfish/v1/Chassis/chassis1IPMI桥接用ipmitool -I lan -H 192.168.100.2 -U root -P 0penBmc chassis status从BMC1管理BMC2固件升级广播模拟BMC固件批量升级验证/redfish/v1/UpdateService的并发处理能力技术要点需为每个QEMU实例分配唯一MAC地址-device rtl8139,mac52:54:00:12:34:56并在OpenBMC中配置静态IPip addr add 192.168.100.1/24 dev eth0。6.2 硬件故障注入用QEMU模拟真实BMC异常场景QEMU的-d调试参数可触发硬件级故障这是真机无法实现的测试能力# 模拟SPI Flash读取错误触发BMC启动失败 qemu-system-arm -d in_asm -M ast2600-bmc -drive ifmtd,bus0,unit0,fileflash0.img,formatraw,read-onlyon ... # 模拟I2C总线超时传感器读数失败 qemu-system-arm -d int -M ast2600-bmc -device i2c-bus,bus-idi2c0,timeout1000 ...然后在OpenBMC中执行# 触发I2C读取 echo 0x18 /sys/bus/i2c/devices/i2c-0/new_device cat /sys/bus/i2c/devices/0-0018/temp1_input # 应返回Input/output error价值这种故障注入能验证OpenBMC的容错机制比如phosphor-sensor-manager是否在I2C超时后自动重试或phosphor-fan-control是否在温度传感器失效时切换到默认风扇策略。6.3 性能调优让QEMU模拟接近真机响应速度默认QEMU性能较差可通过以下参数提升qemu-system-arm \ -cpu cortex-a7,featuresneon,vfp4 \ -smp cpus
返回列表