← 返回首页

一次 BIOS 更新引发的血案:ESC8000A-E11 掉网 + 整机死机排查记

2026-07-10 · 服务器BIOSAMD EPYCNVIDIAnetplan排障

环境: ASUS ESC8000A-E11 准系统,EPYC 7003,2TB 内存,8×RTX 4090,Ubuntu 24.04(内核 6.17,NVIDIA 595),BMC 为 AST2600。事发原因:更新了一次 BIOS,没动其他任何东西。

现象

BIOS 更新之后,机器出现两个症状:

  1. “掉网卡” —— 静态 IP 时有时无,SSH 连不上,但 BMC 能进;
  2. 更糟的是后来发现的:整机会在开机后 33 分钟内随机死机。KVM 里光标闪但键盘无响应,SSH 的 TCP 能握手但拿不到 banner(内核还在应答 SYN,用户态已经僵了),日志在某一行戛然而止——没有 panic、没有 oops、没有 MCE,BMC 的 SEL 事件日志干干净净。

死得一声不吭,是这个案子最难的地方:没有报错,就没有直接线索,只能靠假设-证伪循环推进。

走过的弯路(压缩版)

前后立了不少假设,几乎全灭。列出来是因为每一个的证伪方式都比假设本身值钱:

转折点:一次对照实验

真正把局面打开的是 Ubuntu live-server 启动盘:同一台机器、同一个新 BIOS,live 环境稳稳跑了 40 分钟以上(旧系统的历史纪录是 33 分钟)。这一下把"固件/硬件单独致死"全排除了——凶手必须是"新 BIOS × 已装系统里的某个东西"的交互

顺手在 live 环境里把旧系统的根分区只读挂载,整个 /var/log 拉下来离线分析。接下来是本案最有效的一招:

用新旧启动日志做全量 diff

把死机前最后一次稳定启动(旧 BIOS,连续运行 4 天)和第一次崩溃启动(新 BIOS)的 dmesg 各取前 2500 行,归一化掉地址和数字后做集合差:

# 核心思路:两次启动的内核消息各自 set 化,看差集
t = re.sub(r'0x[0-9a-f]+','ADDR', line)
t = re.sub(r'\b\d+\b','N', t)

差集里立刻浮出两条铁证:

旧 BIOS:  ixgbe ... enp194s0f0: renamed from eth0
新 BIOS:  ixgbe ... ens8f0:     renamed from eth0

网卡改名了。 新 BIOS 暴露了 SMBIOS 槽位信息,systemd 的可预测命名从 PCI 路径式(enp194s0f0)切换成了槽位式(ens8f0)。而 netplan 里白纸黑字 match: name: "enp194s0f0"——匹配不上,静态 IP 从未上过接口。“掉网卡"其实是"掉 IP”,第一个案子破了。

第二条差异:PCI 总线拓扑整体变了(NVMe 换了总线号、AHCI 控制器挪位),同时死机启动里多了一串旧启动没有的:

nvidia 0000:c1:00.0: [drm] Cannot find any crtc or sizes

再结合另一个事实——这台"计算节点"其实装着完整的 GNOME 桌面,GDM 开机自启——第二个案子的嫌疑链闭合了:新 BIOS 把主显示设备的默认值改了(E11 上这一项叫 OnBrd/Ext VGA Select,在 Advanced → PCI Subsystem Settings),显示从板载 ASPEED 切到了 NVIDIA 卡,GDM/Xorg 被引到一条在这台 8 卡机上会把内核拖死的路径上。 live 环境之所以稳,不只因为它用 nouveau——它压根不启动显示管理器。

修复

全程不需要重装系统,也不需要刷回旧 BIOS:

# 1. netplan 改按 MAC 匹配,以后 BIOS 再怎么改枚举都追得上
#    (改 /etc/netplan/90-NM-*.yaml)
match:
  macaddress: "a0:36:9f:xx:xx:xx"   # 原来是 name: "enp194s0f0"

# 2. 计算节点不需要图形界面,禁用 GDM
systemctl set-default multi-user.target

# 3. BIOS 里把显示优先级焊死回板载
#    Advanced → PCI Subsystem Settings → OnBrd/Ext VGA Select = [Onboard]

验证状态

诚实地说:掉网的修复是确定的(机制每一环都有直接证据,重启后 IP 自动到位);死机的修复目前是强假设 + 验证进行中——历史上它从没活过 33 分钟,现在正在跑 4 小时空转 + 过夜真实负载的观察。如果复发,下一步就是逐项核对 BIOS 的 AMD CBS 选项,最后手段才是刷回旧版。

这次学到的

  1. BIOS 更新 = 所有 BIOS 设置回默认 + 硬件枚举可能重排。 更新前用 BMC 截图保存所有非默认设置;更新后第一件事是核对,而不是等症状找上门。
  2. 服务器的 netplan 永远用 MAC 匹配,不要用接口名。 接口名是推导出来的,推导的输入(BIOS/SMBIOS)会变。
  3. 死机不留遗言 ≠ 无从下手。 只读挂载根分区 + 新旧启动日志做归一化 diff,是低成本高信息量的杀手锏。
  4. 对照实验(live 盘)比任何猜测都值钱。 一次 40 分钟的空转,砍掉了一半假设空间。
  5. 警惕"最后一条日志"的幸存者偏差。 最频繁的消息最容易成为遗言,但墓碑不是死因。
  6. 计算节点别装桌面。 GDM 在 8 卡 GPU 服务器上是纯风险敞口。