手把手教你用Yocto Project为你的开发板定制OpenBMC固件(以树莓派为例)

手把手教你用Yocto Project为你的开发板定制OpenBMC固件(以树莓派为例) 手把手教你用Yocto Project为树莓派定制OpenBMC固件1. 环境准备与基础概念在开始构建OpenBMC之前我们需要先理解几个关键概念。BMC基板管理控制器是嵌入在计算机主板上的专用微控制器负责硬件监控和管理功能。而OpenBMC则是开源的BMC固件实现基于Linux系统采用Yocto Project作为构建框架。为什么选择树莓派树莓派作为一款广受欢迎的开发板具有完善的社区支持和丰富的扩展接口是学习OpenBMC开发的理想平台。通过为树莓派构建OpenBMC我们可以学习BMC系统的工作原理掌握Yocto Project的定制方法为其他嵌入式设备开发BMC功能打下基础1.1 硬件准备要完成本教程你需要准备以下硬件树莓派4B或更新型号推荐4GB内存版本16GB或更大容量的microSD卡可靠的电源适配器网络连接有线或无线可选温度传感器、风扇等外设用于功能测试1.2 软件环境搭建构建OpenBMC需要以下软件环境# 安装基本依赖 sudo apt-get install -y gcc g make git tar python3-distutils \ gawk wget diffstat unzip texinfo gcc-multilib build-essential \ chrpath socat cpio python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping python3-git python3-jinja2 \ libegl1-mesa libsdl1.2-dev pylint3 xterm注意建议使用Ubuntu 20.04 LTS或更新版本作为开发环境其他Linux发行版可能需要调整依赖包名称。2. 获取OpenBMC源码与Yocto配置2.1 下载OpenBMC源码OpenBMC采用分层结构管理代码我们需要先获取基础代码和树莓派专用层git clone --recursive https://github.com/openbmc/openbmc.git cd openbmc2.2 配置树莓派支持OpenBMC通过Yocto的层机制支持不同硬件平台。对于树莓派我们需要添加meta-raspberrypi层# 初始化构建环境 source setup raspberrypi这个命令会自动下载必要的Yocto层配置树莓派特定的构建选项设置构建目录结构2.3 构建配置调整在开始构建前我们需要根据树莓派的硬件特性调整一些配置配置项默认值推荐值说明MACHINEraspberrypiraspberrypi4-64针对树莓派4的64位支持DISTROopenbmc-phosphoropenbmc-phosphor使用OpenBMC默认发行版IMAGE_TYPEobmc-phosphor-imageobmc-phosphor-image基础镜像类型可以通过编辑build/conf/local.conf文件来修改这些配置。3. 构建OpenBMC镜像3.1 启动构建过程配置完成后可以开始构建OpenBMC镜像bitbake obmc-phosphor-image构建过程可能需要2-4小时具体取决于你的网络速度和主机性能。构建过程中会下载所有必要的源代码包编译工具链和依赖项构建Linux内核和用户空间组件生成最终的镜像文件3.2 构建过程中的常见问题在构建过程中可能会遇到以下问题网络问题导致下载失败解决方案配置代理或更换下载源相关命令export http_proxyhttp://your.proxy:port export https_proxyhttp://your.proxy:port依赖缺失解决方案根据错误提示安装缺失的依赖包磁盘空间不足构建需要至少100GB空闲空间可以通过以下命令清理缓存bitbake -c cleansstate package-name4. 烧录与测试4.1 镜像烧录构建完成后镜像位于tmp/deploy/images/raspberrypi4-64/目录下。我们需要将其烧录到SD卡# 查找SD卡设备 lsblk # 烧录镜像请替换sdX为你的设备 sudo dd ifobmc-phosphor-image-raspberrypi4-64.wic of/dev/sdX bs4M statusprogress4.2 首次启动配置将烧录好的SD卡插入树莓派并上电启动通过串口或网络连接访问控制台默认用户名/密码root/0penBmc首次登录后立即修改密码重要OpenBMC默认会尝试通过DHCP获取IP地址如果网络中没有DHCP服务器需要手动配置网络。4.3 基础功能测试验证OpenBMC的基本功能是否正常工作IPMI功能测试ipmitool -I lanplus -H BMC-IP -U root -P password chassis status传感器读取cat /sys/class/hwmon/hwmon*/temp*_inputWeb界面访问 在浏览器中访问https://BMC-IP使用root账户登录5. 功能定制与扩展5.1 添加自定义软件包通过Yocto可以方便地添加自定义软件包。以添加htop为例创建自定义层bitbake-layers create-layer ../meta-custom在层中添加recipecat ../meta-custom/recipes-core/htop/htop_3.0.5.bb EOF SUMMARY Interactive process viewer LICENSE GPL-2.0-only LIC_FILES_CHKSUM file://COPYING;md5751419260aa954499f7abaabaa882bbe DEPENDS ncurses SRC_URI http://hisham.hm/htop/releases/${PV}/htop-${PV}.tar.gz SRC_URI[md5sum] 4c2629f1268a82afee343e3d8f1a1c75 inherit autotools pkgconfig EOF将层添加到构建系统bitbake-layers add-layer ../meta-custom重新构建镜像bitbake obmc-phosphor-image5.2 开发自定义守护进程OpenBMC使用systemd管理服务我们可以开发自定义守护进程创建recipe模板bitbake -c devshell obmc-phosphor-image recipetool create -o ../meta-custom/recipes-custom/mydaemon mydaemon-1.0编写服务文件cat ../meta-custom/recipes-custom/mydaemon/files/mydaemon.service EOF [Unit] DescriptionMy Custom Daemon Afterphosphor-state-manager.service [Service] ExecStart/usr/bin/mydaemon Restartalways [Install] WantedBymulti-user.target EOF构建并测试bitbake mydaemon scp tmp/deploy/ipk/raspberrypi4-64/mydaemon*.ipk rootBMC-IP:/tmp/ ssh rootBMC-IP opkg install /tmp/mydaemon*.ipk6. 性能优化与调试6.1 镜像大小优化默认构建的镜像可能较大可以通过以下方法优化移除不需要的软件包# 在local.conf中添加 IMAGE_INSTALL_remove package1 package2使用压缩文件系统# 在local.conf中添加 IMAGE_FSTYPES wic.gz6.2 启动时间优化OpenBMC启动时间可以通过以下方式优化分析启动过程systemd-analyze systemd-analyze critical-chain禁用不需要的服务systemctl disable service-name并行启动服务# 在local.conf中添加 PARALLEL_MAKE -j $(nproc) BB_NUMBER_THREADS $(nproc)6.3 调试技巧开发过程中常用的调试方法查看系统日志journalctl -f调试D-Bus接口busctl tree xyz.openbmc_project busctl introspect xyz.openbmc_project object-path内核调试dmesg -w7. 实际应用案例7.1 温度监控系统我们可以扩展OpenBMC的温度监控功能添加温度传感器# 在设备树中添加传感器节点 cat ../meta-raspberrypi/recipes-kernel/linux/files/0001-add-sensor.dts EOF /dts-v1/; /plugin/; / { compatible brcm,bcm2835; fragment0 { target i2c1; __overlay__ { status okay; #address-cells 1; #size-cells 0; tmp10248 { compatible ti,tmp102; reg 0x48; }; }; }; }; EOF创建监控脚本cat ../meta-custom/recipes-core/scripts/files/temp-monitor.sh EOF #!/bin/sh while true; do temp$(cat /sys/class/hwmon/hwmon0/temp1_input) echo Current temperature: $((temp/1000))°C sleep 5 done EOF7.2 风扇控制逻辑实现基于温度的自定义风扇控制# fan-control.py import time import dbus from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_defaultTrue) bus dbus.SystemBus() def get_temperature(): # 获取温度传感器读数 pass def set_fan_speed(speed): # 设置风扇转速 pass while True: temp get_temperature() if temp 70: set_fan_speed(100) elif temp 60: set_fan_speed(75) else: set_fan_speed(50) time.sleep(10)8. 进阶主题与资源8.1 集成Redfish支持Redfish是现代硬件管理的RESTful API标准OpenBMC提供了Redfish支持启用Redfish服务# 在local.conf中添加 EXTRA_IMAGE_FEATURES obmc-redfish测试APIcurl -k -u root:0penBmc https://BMC-IP/redfish/v1/Systems/system8.2 安全加固生产环境中需要考虑的安全措施启用HTTPS# 生成自签名证书 openssl req -new -x509 -keyout /etc/ssl/private/openbmc.key \ -out /etc/ssl/certs/openbmc.crt -days 365 -nodes配置防火墙iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -j DROP8.3 社区资源进一步学习OpenBMC开发的资源OpenBMC官方文档Yocto Project参考手册树莓派硬件文档