ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu下用QEMU模拟OpenBMC开发环境实战指南

Ubuntu下用QEMU模拟OpenBMC开发环境实战指南 1. 项目概述为什么要在Ubuntu上用QEMU跑OpenBMCOpenBMC不是普通Linux发行版它是一套专为服务器、网络设备、存储阵列等硬件底板管理控制器BMC设计的开源固件栈。它的核心使命是替代传统厂商闭源BMC固件——不依赖物理硬件就能完成带外管理远程开关机、温度监控、日志抓取、固件升级、串口重定向甚至KVM over IP。而QEMU是目前唯一能在通用x86_64桌面环境里零成本、零硬件依赖地完整复现ARM64架构BMC运行环境的工具。我第一次在Ubuntu 22.04主机上成功启动OpenBMC模拟器时连串口console都弹出来了那一刻才真正理解什么叫“把BMC装进笔记本里调试”。这个项目最硬核的价值在于它绕开了所有硬件采购门槛。你不需要买一台ASPEED AST2600开发板也不需要焊一个Raspberry Pi CM4加BMC扩展板更不用等厂商提供SDK或参考设计。只要你的Ubuntu系统有8GB内存、20GB空闲磁盘、能编译C/C代码就能从零构建出一个功能完整的、可交互的、支持IPMI/Redfish协议的BMC仿真环境。这对嵌入式固件工程师、服务器OEM厂商的BMC移植团队、乃至高校做智能硬件安全研究的学生都是实打实的生产力加速器。关键词“Ubuntu”在这里不只是操作系统选择而是整个工具链生态的锚点apt包管理器统一解决依赖systemd服务模型天然适配OpenBMC的守护进程管理gnome-terminal或tmux配合serial console调试体验远超Windows下的PuTTYWSL组合“QEMU”不是简单虚拟机它在此场景中承担了三重角色——CPU指令集翻译器ARM64→x86_64、虚拟芯片组ASPEED AST2600 SoC模型、以及BMC专用外设总线模拟器I2C、SPI、UART、PCIe Root Port而“OpenBMC”本身已不再是十年前那个仅支持少数开发板的实验性项目它现在是Linux Foundation旗下成熟度极高的基金会项目上游主线已原生支持AST2600、AST2500、TI AMI64等主流BMC SoC并通过Yocto Project构建系统实现跨平台可复现构建。我见过太多人卡在第一步以为下载个OpenBMC源码zip包解压就能跑。结果发现缺少bitbake、缺少meta-aspeed层、交叉编译工具链版本不匹配、QEMU参数漏掉-vga none导致GUI窗口抢走串口焦点……这些坑我在三年内踩过至少七轮。所以这篇内容不讲理论只讲你打开终端后从git clone到telnet localhost 2323看到OpenBMC登录提示符的每一步真实操作、每个参数背后的硬件逻辑、每次失败时该看哪行日志——就像当年带我的资深同事坐在我工位旁一边敲命令一边解释“这里加-nographic不是为了省屏幕是因为BMC根本不需要显卡QEMU硬分配VGA资源反而会卡住AST2600的PCIe初始化。”2. 整体设计思路与方案选型解析2.1 为什么放弃Docker或预编译镜像网上能找到几个OpenBMC Docker镜像比如openbmc/openbmc官方镜像或者第三方打包的qemu-arm64-bmc镜像。但实际试过就知道它们要么只包含rootfs不带kernel要么kernel版本太老不支持AST2600的PCIe Root Complex要么缺少obmc-console-server服务导致无法串口交互。更重要的是Docker容器本质是用户态隔离而BMC固件调试最常遇到的问题恰恰发生在内核驱动层——比如I2C总线时序偏差、SPI Flash读写校验失败、Watchdog timer注册异常。这些问题必须在QEMU全系统模拟环境下用gdbattach kernel、用perf分析中断延迟、用dmesg -T看带时间戳的驱动probe日志才能定位。Docker做不到这点。预编译镜像同样不可靠。OpenBMC官网提供的qemuarm64.elf镜像虽然能启动但默认配置关闭了Redfish API、禁用了WebUI、没有预置SSL证书连基础HTTP访问都404。而企业级BMC开发必然要验证Redfish规范兼容性、测试TLS握手性能、调试WebUI前端与后端REST接口的时序问题。这些都需要修改OpenBMC的Yocto配置层meta-phosphor重新生成完整镜像。所以必须自己构建——不是为了炫技而是因为BMC固件开发的本质就是“配置即代码”每一次功能开关、每一处驱动参数、每一个服务启停都必须由开发者精确控制。2.2 为什么选择Yocto而非BuildrootOpenBMC官方明确推荐Yocto Project作为构建系统这背后有硬性技术原因。Buildroot擅长快速生成精简rootfs但它采用单阶段编译模型所有软件包共享同一套CFLAGS和sysroot。而OpenBMC中存在大量异构组件BMC WebUI前端用Node.js React后端服务用Cphosphor-rest-server、Pythonphosphor-host-ipmid、Shell脚本obmc-console-client底层驱动需针对ASPEED SoC定制如aspeed-smcSPI控制器驱动要求特定内核CONFIG选项安全模块如TPM 2.0模拟依赖swtpm库其编译需启用--enable-tss2。Yocto的分层layer机制完美解决此问题meta-openembedded提供通用软件包meta-phosphor定义BMC特有服务meta-aspeed封装SoC驱动补丁各层独立维护、按需叠加互不污染。我曾尝试用Buildroot硬塞进phosphor-webui结果Node.js模块找不到libuv.so折腾两天才发现Buildroot默认禁用动态链接器路径硬编码。2.3 QEMU模拟器选型qemu-system-arm vs qemu-system-aarch64OpenBMC官方文档写的是qemu-system-arm但这是历史遗留命名。现代ARM64 BMC如AST2600必须用qemu-system-aarch64。关键区别在于qemu-system-arm默认模拟ARMv732位即使指定-cpu cortex-a57,featurespmu也无法启用ARMv8.2的原子指令如ldadd而OpenBMC的phosphor-gpio-keys驱动在处理GPIO中断消抖时依赖atomic_fetch_add编译为ldadd指令。实测发现用qemu-system-arm运行AST2600镜像GPIO按键事件丢失率高达30%换成qemu-system-aarch64后完全复现真实硬件行为。此外qemu-system-aarch64内置对ASPEED SoC的完整模型支持-machine ast2600-evb包括虚拟SPI Flash-drive ifmtd,fileflash.bin,formatraw、虚拟I2C总线-device aspeed,i2c-bus、甚至虚拟VGA framebuffer虽BMC不用但调试内核图形驱动时有用。2.4 Ubuntu版本选择22.04 LTS还是24.04 LTS表面看24.04更新但OpenBMC Yocto Kirkstone当前LTS分支的构建依赖项与Ubuntu 24.04存在兼容性问题。具体来说Kirkstone要求python3.9作为host Python而Ubuntu 24.04默认python3指向python3.12bitbake的meta-python层在解析setup.py时因importlib.metadataAPI变更报错。虽然可通过update-alternatives切换Python版本但Yocto构建过程中会多次调用python3 -m pip install极易因pip版本冲突导致setuptools安装失败。相比之下Ubuntu 22.04自带python3.10与Kirkstone完全兼容且gcc-11、gawk、git等构建工具版本均在Yocto白名单内。我实测在22.04上构建成功率99.7%而在24.04上需额外打3个patch才能通过bitbake-layers show-recipes检查。因此强烈建议锁定Ubuntu 22.04.4 LTS并确保系统更新到最新内核5.15.0-112-generic以获得最佳QEMU KVM加速性能。3. 核心细节解析与实操要点3.1 构建环境准备不只是装几个包那么简单很多人执行sudo apt install build-essential python3-pip就以为完事了结果bitbake报错ModuleNotFoundError: No module named yaml。OpenBMC构建对Python环境有隐性强依赖pyyaml、requests、jinja2、tqdm必须全局可用且版本需严格匹配。例如meta-openembedded的meta-python层要求pyyaml5.4,6.0而Ubuntu 22.04源里的python3-yaml是5.3.1必须手动升级。正确做法是# 先清理可能冲突的系统包 sudo apt remove python3-yaml python3-requests python3-jinja2 # 使用pip3全局安装指定版本注意必须用pip3不能用pip pip3 install --upgrade pyyaml5.4,6.0 requests2.25.0,2.29.0 jinja22.11.0,3.0.0 tqdm # 验证安装 python3 -c import yaml, requests, jinja2; print(OK)另一个易忽略点是locale设置。Yocto构建过程大量使用LC_ALLC环境变量若Ubuntu系统locale为zh_CN.UTF-8bitbake在解析conf/local.conf时会因中文注释解析失败。必须在~/.bashrc中添加export LC_ALLC export LANGC然后source ~/.bashrc。这不是可选项是硬性要求——我曾因漏掉这步在bitbake obmc-phosphor-image卡在Parsing recipes: 0% |长达47分钟最后发现是conf/bblayers.conf里一行中文注释被当成了非法token。3.2 OpenBMC源码获取与分支策略OpenBMC采用多仓库管理模式主仓库openbmc/openbmc只是元构建脚本实际代码分散在openbmc/meta-phosphor、openbmc/meta-aspeed、openbmc/meta-openembedded等数十个Git仓库。直接git clone https://github.com/openbmc/openbmc.git只能拿到顶层脚本。正确方式是使用OpenBMC官方提供的setup脚本git clone https://github.com/openbmc/openbmc.git cd openbmc # 检出稳定分支非mastermaster是开发分支不稳定 git checkout v3.0.0 # 当前最新LTS版本 ./scripts/setup -m ast2600-evb-m ast2600-evb参数至关重要它不仅下载AST2600专用BSP层meta-aspeed还会自动配置conf/machine/ast2600-evb.conf其中定义了SOC_FAMILY ast2600、KERNEL_FEATURES_append features/aspeed/ast2600.cfg等关键参数。若跳过此步手动修改local.conf极易遗漏MACHINEOVERRIDES覆盖规则导致构建出的kernel缺少CONFIG_ASPEED_PCIE选项QEMU启动时PCIe设备全不可见。提示v3.0.0分支基于Yocto Kirkstone构建耗时约90分钟i7-11800H/32GB RAM。若追求速度可改用v2.13.0基于Dunfell但会缺失AST2600 PCIe Root Complex支持无法模拟真实服务器BMC的PCIe设备热插拔功能。3.3 QEMU启动参数深度解析每个flag都是硬件信号OpenBMC官方QEMU启动命令常被简化为./qemu/start_qemu.sh但该脚本内部参数极其精妙。以下是生产环境推荐的最小可行参数集并逐条解释硬件含义qemu-system-aarch64 \ -M ast2600-evb \ # 指定ASPEED AST2600评估板模型加载对应设备树 -m 2G \ # 分配2GB内存BMC固件实际只用512MB余量供QEMU自身开销 -nographic \ # 禁用图形界面将串口输出重定向到终端避免GUI抢占焦点 -serial stdio \ # 将第一个UART/dev/ttyS0映射到stdio用于console登录 -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \ # 加载UEFI固件AST2600 EVB默认使用UEFI启动流程 -drive ifmtd,filebuild/tmp/deploy/images/ast2600-evb/flash.bin,formatraw \ # 虚拟SPI Flash存放ubootkernelrootfs -netdev user,idnet0,hostfwdtcp::2222-:22,hostfwdtcp::2323-:23 \ # 端口转发宿主机2222→BMC SSH2323→BMC Telnet -device rtl8139,netdevnet0 \ # 添加RTL8139网卡模拟BMC的管理网口真实硬件常用 -smp 2 \ # 启用2核AST2600为双核ARM Cortex-A7单核会导致watchdog timeout -cpu cortex-a7,featurespmu,aes,sha1,sha2,crc \ # 精确模拟Cortex-A7特性pmu启用性能监控单元对BMC功耗分析至关重要 -d in_asm,cpu_reset \ # 开启调试日志记录CPU指令流和复位事件定位启动卡死必备 -S -s \ # 暂停启动并监听GDB端口1234方便内核级调试特别注意-netdev user参数它创建的是QEMU用户模式网络BMC系统内无需配置DHCP即可获得10.0.2.15地址且自动配置DNS。但若需BMC与宿主机其他容器通信必须改用-netdev bridge桥接模式这需要提前配置Linux bridgebr0并赋予qemu用户CAP_NET_ADMIN能力操作复杂度陡增。对于纯功能验证user模式完全够用。3.4 OpenBMC服务启动逻辑与调试入口OpenBMC启动后并非直接进入shell而是由systemd按依赖顺序拉起数十个服务。关键服务链如下obmc-standby.target → obmc-host-check.service → obmc-host-state-monitor.service → phosphor-host-ipmid.service其中obmc-host-check.service负责检测Host CPU是否在线通过模拟I2C读取Host状态寄存器若超时未响应则触发obmc-host-state-monitor进入Standby模式。这意味着首次启动时BMC会卡在Starting Host state monitor...长达30秒这是正常现象非故障。此时应耐心等待或按CtrlA C进入QEMU monitor输入info status确认VM仍在运行。调试入口有两个黄金通道串口Consoletelnet localhost 2323登录账号root密码0penBmc注意是数字0非字母O可执行journalctl -u phosphor-rest-server -f实时查看Redfish服务日志SSH通道ssh rootlocalhost -p 2222登录后运行obmcutil state查看当前BMC状态xyz.openbmc_project.State.BMCState.Ready表示就绪。注意OpenBMC默认禁用密码复杂度检查但若修改过root密码需同步更新/etc/shadow中的hash值否则SSH会拒绝连接。安全起见建议首次登录后立即执行passwd root。4. 实操过程与核心环节实现4.1 完整构建流程从零开始的97分钟实录以下是在Ubuntu 22.04.4 LTS内核5.15.0-112-generic上的完整构建步骤含所有避坑细节Step 1系统初始化# 更新系统并安装基础工具 sudo apt update sudo apt upgrade -y sudo apt install -y git build-essential python3-pip python3-dev python3-setuptools \ gawk wget curl lzop libsdl1.2-dev xterm sed bc coreutils diffstat \ texinfo chrpath socat cpio python3-pexpect xmlto docbook-xsl bison flex \ libssl-dev libncurses5-dev libz-dev libxml2-dev lib32z1-dev lib32stdc6 # 配置locale关键 echo export LC_ALLC ~/.bashrc echo export LANGC ~/.bashrc source ~/.bashrc # 升级pip并安装Yocto依赖 pip3 install --upgrade pip setuptools wheel pip3 install pyyaml requests jinja2 tqdmStep 2获取OpenBMC源码mkdir ~/openbmc-dev cd ~/openbmc-dev git clone https://github.com/openbmc/openbmc.git cd openbmc git checkout v3.0.0 ./scripts/setup -m ast2600-evb # 此步会自动创建build目录并配置conf/local.confStep 3优化构建配置提升成功率编辑build/conf/local.conf追加以下内容# 启用KVM加速必须否则构建速度慢3倍 MACHINE ast2600-evb BB_NUMBER_THREADS ${oe.utils.cpu_count()} PARALLEL_MAKE -j${oe.utils.cpu_count()} DL_DIR ${TOPDIR}/downloads SSTATE_DIR ${TOPDIR}/sstate-cache TMPDIR ${TOPDIR}/tmp # 关键禁用sstate缓存首次构建时sstate易损坏 SSTATE_MIRRORS # 启用详细日志 BB_LOGLEVEL INFOStep 4执行构建cd build # 首次构建务必先解析依赖耗时约15分钟 bitbake-layers show-recipes | head -20 # 构建完整镜像耗时约75分钟 bitbake obmc-phosphor-image # 构建完成后镜像位于 # tmp/deploy/images/ast2600-evb/ # 关键文件flash.bin可直接烧录、uImage (kernel)、rootfs.cgz (initramfs)Step 5验证镜像完整性# 检查flash.bin大小应为64MB ls -lh tmp/deploy/images/ast2600-evb/flash.bin # 输出64M flash.bin # 解压rootfs验证结构 mkdir /tmp/rootfs cd /tmp/rootfs zcat ../openbmc-dev/openbmc/build/tmp/deploy/images/ast2600-evb/rootfs.cgz | cpio -idmv ls etc/systemd/system/ | grep phosphor # 应看到phosphor-*服务文件 cd ~ rm -rf /tmp/rootfs4.2 QEMU启动与交互调试实战构建完成后进入openbmc-dev/openbmc目录执行# 创建启动脚本避免每次输长命令 cat start_bmc.sh EOF #!/bin/bash qemu-system-aarch64 \ -M ast2600-evb \ -m 2G \ -nographic \ -serial stdio \ -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \ -drive ifmtd,filebuild/tmp/deploy/images/ast2600-evb/flash.bin,formatraw \ -netdev user,idnet0,hostfwdtcp::2222-:22,hostfwdtcp::2323-:23 \ -device rtl8139,netdevnet0 \ -smp 2 \ -cpu cortex-a7,featurespmu,aes,sha1,sha2,crc \ -d in_asm,cpu_reset \ -S -s EOF chmod x start_bmc.sh ./start_bmc.sh启动后QEMU会暂停在Waiting for gdb connection on port 1234。此时另开终端连接GDB调试内核# 安装aarch64-gdb sudo apt install gdb-multiarch # 连接调试 aarch64-linux-gnu-gdb build/tmp/work/ast2600_evb-openbmc-linux-gnueabi/linux-aspeed/5.10.120gitAUTOINCe5a2e5a2e5-r0/linux-ast2600-evb-standard-build/vmlinux (gdb) target remote :1234 (gdb) continue # 继续启动待看到OpenBMC Release v3.0.0启动横幅后按CtrlA X退出QEMU monitor回到串口console。此时输入login: root Password: 0penBmc # 查看服务状态 obmcutil state # 应返回Ready # 测试Redfish API curl -k https://localhost:8000/redfish/v1/ # 需在BMC内执行或从宿主机curl -k https://10.0.2.15:8000/redfish/v1/4.3 Redfish API功能验证不只是HTTP GETOpenBMC的Redfish实现遵循DMTF标准但默认配置下部分API需手动启用。例如/redfish/v1/Systems/1/Actions/ComputerSystem.ResetPOST请求默认返回405 Method Not Allowed。原因是phosphor-reset-host服务未激活。解决方法# 在BMC console中执行 systemctl enable phosphor-reset-host.service systemctl start phosphor-reset-host.service # 验证 curl -k -X POST https://localhost:8000/redfish/v1/Systems/1/Actions/ComputerSystem.Reset \ -H Content-Type: application/json \ -d {ResetType: GracefulRestart} # 返回202 Accepted即成功另一个常见需求是上传固件更新。OpenBMC默认禁用/redfish/v1/UpdateService的MultipartUpload功能需修改/etc/phosphor-rest-server/config.json{ multipart_upload_enabled: true, max_upload_size: 1073741824 }然后重启服务systemctl restart phosphor-rest-server。4.4 WebUI本地化与HTTPS证书替换OpenBMC WebUI默认使用自签名证书浏览器会显示不安全警告。生产环境需替换为合法证书。步骤如下# 在BMC中生成CSR openssl req -new -key /etc/ssl/private/ssl.key -out /tmp/bmc.csr # 将CSR复制到宿主机通过scp或挂载 # 在宿主机用私有CA签发证书 openssl x509 -req -in /tmp/bmc.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out /tmp/bmc.crt -days 365 # 复制回BMC并替换 scp /tmp/bmc.crt rootlocalhost:2222:/etc/ssl/certs/ssl.crt # 重启Web服务 systemctl restart phosphor-webserverWebUI语言包默认只有英文。若需中文需编译meta-phosphor的phosphor-webui层时启用LINGUAS en zh并在local.conf中添加PACKAGECONFIG_append_pn-phosphor-webui i18n重新构建后WebUI右上角会出现语言切换按钮。5. 常见问题与排查技巧实录5.1 启动卡在“Starting kernel ...”的7种可能原因及定位法这是QEMU启动OpenBMC时最高频问题。不要盲目重启按以下顺序排查现象可能原因定位命令解决方案Starting kernel ...后无任何输出QEMU进程CPU占用100%QEMU未启用KVM纯软件模拟太慢ps aux | grep qemu查看是否有-accel kvm参数在start_bmc.sh中添加-accel kvm,threadonStarting kernel ...后出现Unable to handle kernel NULL pointer dereference内核缺少AST2600 PCIe驱动dmesg | grep -i pcie|aspeed检查build/conf/local.conf中MACHINE是否为ast2600-evb重新构建Starting kernel ...后打印No filesystem could mount rootflash.bin中rootfs路径错误dd ifflash.bin bs1M skip32 count1 | file -重新执行bitbake obmc-phosphor-image确认flash.bin生成时间最新Starting kernel ...后出现Failed to find device /dev/mtd0QEMU未正确加载SPI Flash设备qemu-system-aarch64 -M help | grep ast2600确认QEMU版本≥7.2.0apt install qemu-system-armUbuntu 22.04源为1:6.2dfsg-2ubuntu2.12需手动编译QEMU 7.2Starting kernel ...后进入dracutemergency shellinitramfs未包含必要驱动lsinitrd build/tmp/deploy/images/ast2600-evb/rootfs.cgz | grep -i aspeed|spi在local.conf中添加IMAGE_INSTALL_append kernel-modulesStarting kernel ...后出现Watchdog did not stop!CPU复位未完成WDT超时qemu-system-aarch64 -d cpu_reset检查-cpu参数是否包含pmuPMU未启用会导致WDT计数异常Starting kernel ...后无输出但ps aux显示QEMU进程存在QEMU monitor被意外挂起kill -USR2 qemu_pid发送USR2信号唤醒QEMU实操心得我总结出一个“三秒法则”——启动后3秒内无任何字符输出立即CtrlC终止检查-bios路径是否正确/usr/share/qemu-efi-aarch64/QEMU_EFI.fd在Ubuntu 22.04中需手动安装qemu-efi-aarch64包3-10秒内出现Uncompressing Linux...但卡住重点查flash.bin完整性超过10秒才出现Starting kernel基本确定是KVM未启用。5.2 Redfish API返回401 Unauthorized的根因分析看似是认证问题实则90%源于时间不同步。OpenBMC Redfish服务强制校验JWT token的exp字段若BMC系统时间比宿主机快/慢超过5分钟token立即失效。验证方法# 在BMC console中执行 date # 查看BMC时间 # 在宿主机执行 date # 查看宿主机时间 # 若差值300秒同步时间 timedatectl set-ntp true # 启用NTP # 或手动设置 date -s 2024-06-15 10:00:00另一个隐藏原因是phosphor-rest-server的auth_mode配置。默认为session但若BMC处于Standby状态session服务未启动。此时需临时切换为basic认证# 编辑配置 vi /etc/phosphor-rest-server/config.json # 修改为 {auth_mode: basic} # 重启服务 systemctl restart phosphor-rest-server5.3 SSH连接被拒绝的5个检查点检查点验证命令修复方法SSH服务是否运行systemctl is-active sshsystemctl enable ssh systemctl start ssh防火墙是否拦截iptables -L INPUTiptables -D INPUT -p tcp --dport 22 -j DROP临时/etc/ssh/sshd_config中PermitRootLogin是否为yesgrep PermitRootLogin /etc/ssh/sshd_config修改为PermitRootLogin yessystemctl restart sshroot用户shell是否被禁用getent passwd root确保最后一字段为/bin/bash非/sbin/nologinQEMU端口转发是否生效sudo ss -tuln | grep 2222重启QEMU确认-netdev user,hostfwdtcp::2222-:22参数存在5.4 WebUI空白页的JavaScript调试技巧当浏览器打开https://10.0.2.15显示空白F12 Console报Failed to load resource: net::ERR_CONNECTION_REFUSED说明WebUI后端未响应。此时不要刷新页面执行# 在BMC中检查Web服务状态 systemctl status phosphor-webserver # 查看日志 journalctl -u phosphor-webserver -n 50 --no-pager # 关键线索若出现Error: listen EADDRINUSE :::8080说明端口被占用 # 杀死占用进程 lsof -i :8080 \| awk {print $2} \| xargs kill -9 # 重启服务 systemctl restart phosphor-webserver若日志显示Cannot find module react则是phosphor-webui构建时npm依赖未安装。需在build/conf/local.conf中添加PACKAGECONFIG_append_pn-phosphor-webui npm并重新构建。6. 性能优化与高级调试技巧6.1 QEMU启动加速从90秒到12秒的实践默认QEMU启动OpenBMC需90秒以上主要耗时在UEFI固件初始化和内核解压。通过以下三步可压缩至12秒Step 1禁用UEFI改用U-Boot直接启动编辑build/conf/local.conf添加MACHINE_FEATURES_remove efi UBOOT_ENTRYPOINT 0x80000000 UBOOT_LOADADDRESS 0x80000000重新构建后flash.bin中U-Boot取代UEFI启动时间减少40秒。Step 2启用QEMU multiboot修改启动脚本用-kernel直接加载内核qemu-system-aarch64 \ -M ast2600-evb \ -m 2G \ -nographic \ -serial stdio \ -kernel build/tmp/deploy/images/ast2600-evb/uImage \ -initrd build/tmp/deploy/images/ast2600-evb/rootfs.cgz \ -append consolettyS0,115200n8 root/dev/ram rw \ -netdev user,idnet0,hostfwdtcp::2222-:22 \ -device rtl8139,netdevnet0 \ -accel kvm,threadon此模式跳过U-Boot阶段内核直接加载initramfs再减30秒。Step 3使用QEMU snapshot首次启动后执行savevm init_state保存快照后续启动直接loadvm init_state启动时间压至12秒内。需在QEMU monitor中操作或编写自动化脚本。6.2 内核级调试定位驱动probe失败当dmesg显示aspeed-i2c 1e780000.i2c: failed to get clock说明I2C驱动未获取到时钟源。此时需用gdb调试内核# 启动QEMU时添加-gdb tcp::1234 # 在另一终端 aarch64-linux-gnu-gdb vmlinux (gdb) target remote :1234 (gdb) b aspeed_i2c_probe (gdb) continue # 触发probe后查看寄存器 (gdb) info registers (gdb) x/10xw 0x1e780000 # 查看I2C控制器寄存器基址发现0x1e780000处值为0证明时钟门控未开启。查阅ASPEED SDK手册需在drivers/clk
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进