<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-05-12T16:17:12+00:00</updated><id>/feed.xml</id><title type="html">Jing</title><subtitle>emptyjing 的个人网站
</subtitle><author><name>emptyjing</name></author><entry><title type="html">从平台管理视角理解 X86 服务器中的 BMC 与 IPMI</title><link href="/2026/05/12/bmc-introduction.html" rel="alternate" type="text/html" title="从平台管理视角理解 X86 服务器中的 BMC 与 IPMI" /><published>2026-05-12T00:00:00+00:00</published><updated>2026-05-12T00:00:00+00:00</updated><id>/2026/05/12/bmc-introduction</id><content type="html" xml:base="/2026/05/12/bmc-introduction.html"><![CDATA[<div style="padding: 1rem 1.1rem; border: 1px solid #e2e8f0; border-radius: 12px; background: #f8fafc; margin-bottom: 1.25rem;">
  <strong>摘要</strong>
  <p style="margin: 0.6rem 0 0 0;">这篇文章不把 BMC 当成一个孤立芯片来介绍，而是从服务器平台管理的角度去看它在整机中的位置、它与 BIOS 的通信关系、IPMI 规范的意义，以及 BIOS 与 BMC 通信异常时更实际的排查路径。</p>
</div>

<p>在 x86 服务器中，CPU、内存、PCH、网卡这些部件决定了主机的计算能力，但决定这台机器是否“可维护、可观测、可远程恢复”的，往往是另一个不直接参与业务计算的组件：BMC。</p>

<p>很多人第一次接触 BMC，会把它理解为“服务器上的一个管理芯片”；这个说法不算错，但仍然过于扁平。更准确的理解方式是，BMC 是服务器平台管理能力的核心控制点，而 IPMI 则是这套平台管理体系中最常见的一种标准化通信规范。</p>

<!--more-->

<p>如果只记一句话，那么可以记住下面这个结论：</p>

<blockquote style="margin: 1rem 0; padding: 0.9rem 1rem; border-left: 4px solid #3b82f6; background: #f8fbff;">
  BMC 负责平台管理能力的落地，IPMI 负责平台管理消息的组织与传递。
</blockquote>

<h2 id="1-先从平台管理说起">1. 先从平台管理说起</h2>

<p>理解 BMC，不能只从芯片规格出发，而要先理解“平台管理”这个问题本身。</p>

<p>所谓平台管理，关注的是整台服务器在运行过程中的硬件健康状态和可维护性，而不是业务本身是否跑得快。温度是否过高、电压是否异常、风扇是否停转、电源是否告警、某个 FRU 部件是否被更换，这些都属于平台管理的范畴。</p>

<p>对于普通 PC，这类问题通常由人在现场处理。但服务器通常部署在机房、机柜或者异地数据中心，现场操作成本极高，因此平台管理不能依赖“人站在机器前面”，而必须具备以下能力：</p>

<ul>
  <li>主机系统异常时，仍然能够获取基础状态</li>
  <li>操作系统未启动时，仍然能够执行有限管理动作</li>
  <li>硬件异常出现时，仍然能够持续监测并记录事件</li>
  <li>管理员不在现场时，仍然能够通过网络执行维护操作</li>
</ul>

<p>这就是为什么服务器必须有一条独立于主机计算路径之外的管理链路，而 BMC 正是这条链路的核心。</p>

<h2 id="2-bmc-在服务器里的位置">2. BMC 在服务器里的位置</h2>

<p>BMC 的全称是 <code class="language-plaintext highlighter-rouge">Baseboard Management Controller</code>，通常翻译为基板管理控制器。它最重要的特点不是“能监控温度”，而是它是一套独立于主机 CPU、主机操作系统和主机业务负载之外的管理控制系统。</p>

<p>从工程视角看，BMC 有三个关键属性：</p>

<ul>
  <li>独立性：BMC 不依赖主机 OS 存活</li>
  <li>常驻性：BMC 长时间运行并持续观察平台状态</li>
  <li>管理导向：BMC 的目标是监控、记录、控制和恢复</li>
</ul>

<figure style="margin: 1.4rem 0; max-width: 100%; overflow: hidden;">
  <img src="/assets/images/bmc-server-architecture.svg" alt="BMC 在服务器平台中的位置示意图" style="display: block; width: 100%; max-width: 100%; height: auto; vertical-align: middle; box-sizing: border-box; border: 1px solid #e5e7eb; border-radius: 14px; background: #fff;" />
  <figcaption style="margin-top: 0.65rem; color: #6b7280; font-size: 0.95rem;">图 1：从平台管理角度看，BMC 位于主机硬件、固件接口、传感器、日志和远程访问链路之间，是一条独立的带外管理控制面。</figcaption>
</figure>

<p>从上图可以看到，BMC 并不是 BIOS 的附属模块，也不是操作系统中的一个服务。它通常有自己的处理器、固件、存储和外设接口。对服务器厂商来说，BMC 更像是整机管理平面的控制中枢，而主机 CPU 所在的系统则属于被管理对象。</p>

<p>在典型服务器中，BMC 常承担以下职责：</p>

<ul>
  <li>采集温度、电压、风扇、电源等传感器信息</li>
  <li>记录事件、告警和部分串口输出</li>
  <li>维护 FRU 等硬件识别数据</li>
  <li>提供远程管理入口和带外维护能力</li>
  <li>在需要时参与复位、上下电、散热和策略控制</li>
</ul>

<p>这也是为什么很多服务器在主机系统无法正常启动时，管理员仍然能够通过管理口看到硬件状态或执行部分恢复动作。</p>

<h2 id="3-bmc-为什么对服务器尤其重要">3. BMC 为什么对服务器尤其重要</h2>

<p>服务器与个人电脑的本质区别之一，不只是性能规模，而是运维方式。</p>

<p>个人电脑发生故障时，用户通常就在设备旁边；而服务器发生故障时，管理员往往不在现场。对服务器来说，真正高价值的能力从来不只是“把任务跑完”，而是“在异常状态下依然可诊断、可控制、可恢复”。</p>

<p>这一点决定了 BMC 的价值并不体现在正常路径，而体现在异常路径。</p>

<p>系统启动失败时，需要有人看到日志。</p>

<p>风扇异常时，需要有人触发保护策略。</p>

<p>电源告警时，需要有人留下事件记录。</p>

<p>远程机房里主机卡死时，需要有人能做带外复位。</p>

<p>这些“有人”的位置，在服务器平台里通常就是 BMC。</p>

<h2 id="4-bios-与-bmc-的关系是什么">4. BIOS 与 BMC 的关系是什么</h2>

<p>在固件开发里，BMC 不是一个遥远的后台模块，它和 BIOS 常常直接发生交互。BIOS 在启动过程中可能需要把平台信息发给 BMC，也可能需要从 BMC 获取某些管理相关数据，这时最常见的交互方式就是 IPMI。</p>

<p>这里有一个非常关键、但经常被说反的点：</p>

<div style="padding: 0.95rem 1rem; border-radius: 12px; background: #fff7ed; border: 1px solid #fed7aa; margin: 1rem 0;">
  <strong>关键点</strong>
  <p style="margin: 0.5rem 0 0 0;">在 BIOS 与 BMC 的典型交互里，通常是 BIOS 主动发送 IPMI 命令，BMC 接收后返回完成码和响应数据。也就是说，BMC 一般不是主动向 BIOS 发起通信的一方。</p>
</div>

<p>这件事在排障时尤其重要。很多人看到“BIOS 没收到 BMC 返回”，会直觉认为是 BMC 没发；但在分析路径时，正确的问题顺序应该是：BIOS 是否真的先发出了请求？底层通道是否把请求送到了 BMC？BMC 是否处理成功并返回了结果？</p>

<p>另外还要注意，不同启动阶段和不同固件实现对 BMC 的访问方式可能并不完全相同。比如 PEI 阶段和 DXE 阶段对 IPMI 的封装、超时和重试策略都可能存在差异。如果只看单一阶段日志，结论常常会偏掉。</p>

<h2 id="5-ipmi-到底是什么">5. IPMI 到底是什么</h2>

<p><code class="language-plaintext highlighter-rouge">IPMI</code> 的全称是 <code class="language-plaintext highlighter-rouge">Intelligent Platform Management Interface</code>，中文一般译为智能平台管理接口。</p>

<p>从工程理解上说，IPMI 不是某一个具体函数，也不是某一个单独协议栈，而是一套围绕平台管理建立起来的标准化规范。它定义了平台管理消息应该如何组织、如何传递、不同角色如何协作，以及事件和记录应该如何表达。</p>

<p>所以，讨论 IPMI 时最好不要把它简单理解成“BIOS 调 BMC 的命令接口”。更完整的理解应当是：</p>

<ul>
  <li>它定义了平台管理中的消息规则</li>
  <li>它定义了管理角色之间的交互方式</li>
  <li>它给不同厂商提供了一套相对统一的管理语言</li>
</ul>

<p>如果把 BMC 比作管理控制中心，那么 IPMI 更像这套管理体系里的标准通信语言和报文规范。</p>

<h2 id="6-bios-是如何通过-ipmi-与-bmc-通信的">6. BIOS 是如何通过 IPMI 与 BMC 通信的</h2>

<p>BIOS 与 BMC 的通信虽然是通过 IPMI 命令完成的，但底层仍然要落在实际传输通道上。常见的通道包括 <code class="language-plaintext highlighter-rouge">KCS</code> 和 <code class="language-plaintext highlighter-rouge">BT</code>，其中 KCS 更常见。</p>

<p>从流程上看，一次典型交互大致如下：</p>

<ol>
  <li>BIOS 在某个启动阶段发起 IPMI 请求</li>
  <li>请求通过 KCS 或 BT 这类通道被送往 BMC</li>
  <li>BMC 解析命令并执行对应处理</li>
  <li>BMC 返回 completion code 和响应数据</li>
  <li>BIOS 读取响应并判断成功、失败或超时</li>
</ol>

<p>这个过程虽然看起来直观，但真正的问题通常藏在时序、等待和重试策略里，而不是表面上“有没有调用函数”。</p>

<h2 id="7-bmc-关联的典型硬件模块">7. BMC 关联的典型硬件模块</h2>

<p>从整机结构上看，BMC 通常不会只面对 BIOS，它还会与多类硬件资源连接。</p>

<h3 id="71-主板与主机硬件">7.1 主板与主机硬件</h3>

<p>BMC 会通过 LPC、I2C、SMBus、Serial 等接口与主板上的其他硬件交互。这里的目标不是替代 CPU 控制整机，而是获取管理所需的信息，并在一定范围内参与控制动作。</p>

<h3 id="72-串口输出与远程调试">7.2 串口输出与远程调试</h3>

<p>服务器启动早期的很多关键信息都走串口输出。如果串口可以被 BMC 采集或转发，那么管理员即使不在现场，也能拿到启动日志和报错信息。这是服务器远程调试体验里非常关键的一环。</p>

<h3 id="73-传感器与控制电路">7.3 传感器与控制电路</h3>

<p>温度、电压、风扇、电源这些信息通常由 BMC 持续采集。BMC 再依据策略决定是否提速风扇、是否触发告警、是否记录事件，甚至是否联动其他保护策略。</p>

<h3 id="74-fru-与硬件在位信息">7.4 FRU 与硬件在位信息</h3>

<p><code class="language-plaintext highlighter-rouge">FRU</code> 是 <code class="language-plaintext highlighter-rouge">Field Replaceable Unit</code> 的缩写，通常指可现场更换部件，例如 CPU、内存、硬盘、电源模块等。BMC 需要维护这些部件的识别信息和在位状态，以支持维护、告警和问题追踪。</p>

<h3 id="75-非易失性存储">7.5 非易失性存储</h3>

<p>BMC 本身通常也运行一套独立软件栈，因此需要自己的存储介质。常见载体是 SPI Flash，其中除了系统镜像外，还可能保存日志、FRU 数据、事件记录以及串口采集信息。</p>

<h2 id="8-ipmb-与卫星控制器为什么会存在">8. IPMB 与卫星控制器为什么会存在</h2>

<p>在简单系统里，一个 BMC 往往足以承担主要平台管理任务；但在更复杂的服务器或多子系统平台中，单一 BMC 不一定适合管理所有局部逻辑。这时就会引入 IPMB 和卫星控制器。</p>

<p><code class="language-plaintext highlighter-rouge">IPMB</code> 可以理解为一条基于 I2C 的平台管理总线，用于在 BMC 和其他管理控制器之间传递 IPMI 相关消息。所谓卫星控制器，就是那些负责某一局部模块、局部设备或局部子系统管理的辅助控制器。</p>

<p>这样分层的好处非常明确：</p>

<ul>
  <li>复杂平台可以拆解职责</li>
  <li>局部控制逻辑可以本地闭环处理</li>
  <li>BMC 可以作为汇聚和协调中心，而不是包揽所有细节</li>
</ul>

<p>从系统架构角度看，这种方式比把所有控制逻辑都堆进一个中心控制器里更清晰，也更利于扩展。</p>

<h2 id="9-bios-与-bmc-通信异常时应该怎么排查">9. BIOS 与 BMC 通信异常时，应该怎么排查</h2>

<p>实际开发里，最常见的问题不是“BMC 是什么”，而是“为什么 BIOS 和 BMC 通不起来”。</p>

<p>这类问题如果只盯着某一端看，通常会陷入误判。更有效的方式是按请求链路自顶向下拆开看。</p>

<figure style="margin: 1.4rem 0; max-width: 100%; overflow: hidden;">
  <img src="/assets/images/bmc-ipmi-debug-flow.svg" alt="BIOS 到 BMC 的 IPMI 通信排障流程图" style="display: block; width: 100%; max-width: 100%; height: auto; vertical-align: middle; box-sizing: border-box; border: 1px solid #e5e7eb; border-radius: 14px; background: #fff;" />
  <figcaption style="margin-top: 0.65rem; color: #6b7280; font-size: 0.95rem;">图 2：排查顺序不要从猜测开始，而要沿着“BIOS 发起请求 -&gt; 通道传输 -&gt; BMC 接收处理 -&gt; 响应返回”的链路逐级确认。</figcaption>
</figure>

<h3 id="91-先确认-bios-是否真的发出了请求">9.1 先确认 BIOS 是否真的发出了请求</h3>

<p>这是第一步，也是最容易被跳过的一步。先确认 BIOS 是否真的走到了 IPMI 请求发送路径，调用参数是什么，返回的 completion code 是什么。很多表面看起来像 BMC 故障的问题，实际上在 BIOS 侧就已经偏离了预期流程。</p>

<h3 id="92-再确认-bmc-是否真正收到了请求">9.2 再确认 BMC 是否真正收到了请求</h3>

<p>如果 BIOS 确实发了命令，但 BMC 没看到，就要优先看底层传输链路。此时需要重点关注：</p>

<ul>
  <li>KCS 或 BT 通道是否正常</li>
  <li>状态位轮询逻辑是否正确</li>
  <li>超时窗口是否过短</li>
  <li>重试策略是否合理</li>
</ul>

<p>在某些实现里，BMC 处理线程繁忙时，请求可能表现为“像是丢了”。这种情况下，适当调整 BIOS 侧重试次数或通道等待时间，有时会明显改善稳定性。</p>

<h3 id="93-然后确认-bmc-是没收到还是没处理好">9.3 然后确认 BMC 是没收到，还是没处理好</h3>

<p>如果 BMC 收到了命令，但 BIOS 看到的结果依然异常，那么问题就进入 BMC 侧处理链路。此时要进一步看：</p>

<ul>
  <li>BMC 的 IPMI 服务是否忙碌</li>
  <li>相关进程是否异常或卡死</li>
  <li>命令处理逻辑是否返回错误 completion code</li>
  <li>返回数据格式是否符合 BIOS 预期</li>
</ul>

<p>很多问题不是“完全不通”，而是“响应存在，但内容不对”。对这类问题，completion code 往往是最有价值的第一现场信息。</p>

<h3 id="94-最后再下沉到底层读写细节">9.4 最后再下沉到底层读写细节</h3>

<p>如果还需要继续往下查，最终往往会落到最底层的发送和接收动作。例如在 KCS 路径里，BIOS 读取 BMC 响应时通常会检查相应状态位；如果没有等到数据，就会做轮询、短延时和重试。重试耗尽之后，固件才会把这次交互判定为 <code class="language-plaintext highlighter-rouge">Device Error</code>。</p>

<p>所以很多通信故障的根源并不神秘，常常就是下面几类问题：</p>

<ul>
  <li>时序过紧</li>
  <li>等待窗口不足</li>
  <li>重试次数不够</li>
  <li>状态判断条件不严谨</li>
  <li>BMC 服务在忙或异常退出</li>
</ul>

<h2 id="10-总结">10. 总结</h2>

<p>如果把服务器看成一台负责业务运行的机器，那么 BMC 就是它背后的管理控制面。它不参与业务计算，但它决定了整个平台是否具备硬件可观测性、异常可诊断性和远程可恢复性。</p>

<p>从这个角度再回头看，会更容易理解 BMC 与 IPMI 的关系：BMC 是平台管理能力的执行核心，IPMI 是这套能力在固件、控制器和管理软件之间交换信息时最常见的一套规范语言。</p>

<p>对固件开发、服务器平台开发或者底层排障来说，真正重要的不是记住几个术语，而是建立一条清晰的因果链：</p>

<div style="padding: 1rem 1.1rem; border: 1px solid #dbeafe; border-radius: 12px; background: #f8fbff; margin-top: 1rem;">
  <strong>建议记忆框架</strong>
  <p style="margin: 0.6rem 0 0 0;">平台管理提出需求，BMC 负责落地，IPMI 负责通信，KCS/BT 负责承载，日志和 completion code 负责帮助你定位问题。</p>
</div>]]></content><author><name>emptyjing</name></author><category term="server" /><category term="bmc" /><category term="ipmi" /><category term="bios" /><category term="firmware" /><summary type="html"><![CDATA[摘要 这篇文章不把 BMC 当成一个孤立芯片来介绍，而是从服务器平台管理的角度去看它在整机中的位置、它与 BIOS 的通信关系、IPMI 规范的意义，以及 BIOS 与 BMC 通信异常时更实际的排查路径。 在 x86 服务器中，CPU、内存、PCH、网卡这些部件决定了主机的计算能力，但决定这台机器是否“可维护、可观测、可远程恢复”的，往往是另一个不直接参与业务计算的组件：BMC。 很多人第一次接触 BMC，会把它理解为“服务器上的一个管理芯片”；这个说法不算错，但仍然过于扁平。更准确的理解方式是，BMC 是服务器平台管理能力的核心控制点，而 IPMI 则是这套平台管理体系中最常见的一种标准化通信规范。]]></summary></entry></feed>