目录0. 文档用途与口径1. 现网拓扑可定死1.1 槽位 ↔ Root Port ↔ Endpoint ↔ 控制器实例1.2 双口为何被排除2. 失败链建议按此顺序对外讲述3. pciehp 在干什么物理层入口3.1 典型片段Slot 40 / 32 / 42 形态相同3.2 与 -ENODEV 的关系3.3 现场需一并核对4. 两类 I/O必须拆开禁止写成「盘坏了」4.1 僵尸 gendisk 被 udev / blkid 戳容量已废4.2 活着或半活路径上的介质 / PI 完成错4.3 最危险的时序新实例已活旧 n1 无人释放5. 与 CLR / CSTS0x1 如何衔接改口径不推翻旧事实6. 证据分级对外时不要把推断写成事实7. 立即处置只读 止血7.1 止血7.2 链路 / 槽位 / AER只读7.3 盘侧只读禁止 reset / NSSR / FLR8. 对外话术可直接转发8.1 平台 / 现场8.2 盘厂 / 固件9. 后续决策树避免现场即兴10. 一句话结论0. 文档用途与口径本文把现网日志、PCI 拓扑、Identify 信息和块层错误压成一条可对外、可复盘的因果链。结论用于现场止血停旧节点、禁 reset、禁槽位 power cycle平台侧查 U.2 / 背板 / 供电 / 带外盘厂侧查 CC 状态机、未开 PI 时报 Guard Check、残留 NS 完成路径口径必须同时写两头缺一不可责任面已坐实的现象不能单独解释的部分平台 / 物理链路pciehpSurpriseCard present No link约 30s 后再 Link Up槽位反复重新枚举掉链之前盘已对 4K Read 回0x281CLR 后CSTS.RDY不落盘固件 / NVMe 状态机Controller Reset 后 RDY 卡在0x1→-ENODEVIdentifyCMIC0槽位 Presence 仍在、链路自己掉pciehp风暴先于多数-19只骂固件或只骂槽位都会漏掉一半证据。明确排除不是「双端口对端」故事。全机 NVMe 均为xx:00.0单功能无.1第二 PF。不只是「CC.EN清不掉RDY」单点。那是失败链中段入口在链路 Surprise出口在残留 gendisk 仍被 udev / 巡检打 I/O。硬禁令已在现网验证会恶化nvme reset/ FLR / 写 NSSRecho 0 /sys/bus/pci/slots/*/powerSlot(40)/(42) 已在断电级循环。在循环上再 reset会把「链路不稳」升级为「CLR 卡死、CSTS0x1、最终-ENODEV」。1. 现网拓扑可定死1.1 槽位 ↔ Root Port ↔ Endpoint ↔ 控制器实例热插拔槽Root PortEndpoint现 ctrl旧 ctrl本次是否进 surprise 风暴Slot(40)e0:03.1e1:00.0nvme0nvme3是反复enabling deviceSlot(42)e0:03.3e3:00.0nvme8nvme5是至少两次完整回来并建队列Slot(32)80:01.1很大概率81:00.0nvme7—抖动最密本段 grep未见配套81:00.0增删其他槽—含另一厂商一块、以及同系列另外两颗若干—未进入同一套风暴readlink即使未贴全也不影响内核已把Slot(40)→e1:00.0→nvme0、Slot(42)→e3:00.0→nvme8打进 dmesg。1.2 双口为何被排除lspci -d ::0108NVM Express 类代码全部是xx:00.0无第二功能。对0000:e1:00.0/0000:e1:00.*的列举路径本身错误那是找「该设备下的子设备」不是找同槽第二 PF。故障后再枚举的 ctrl IdentifyCMIC0、CNTLID0与单控制器一致。实例号从nvme3→nvme0、nvme5→nvme8是PCI remove/add 后 nvme 核心按空闲最小号重分配不是对端口换身份。2. 失败链建议按此顺序对外讲述U.2 / 背板 / 供电 / 线序 / 带外 power │ ▼ pciehp: Card present, No link (~3s PD 断言, LTSSM 未起来) │ ~30s 等链路 ▼ Card present Link Up → pci enabling device │ 上电过程中再次 Surprise ▼ Endpoint 从 PCI 消失 / 再出现 │ ├─ 用户可见ctrl 号漂移nvme3→0, nvme5→8 ├─ 驱动可见旧 gendisk 未释放nvme3n1 / nvme5n1 仍在 └─ 若此时再 nvme reset / FLR │ ▼ CC.EN 置位或 CLRCSTS.RDY 不落保持 0x1 │ ▼ 超时 → -ENODEV (-19) ← 链路已没设备时也会直接 -19并行、独立的一条盘侧错误发生在部分 Link Down 之前周期性 4K Readopcode 0x2, 8 blocks, ~2s, LBA 散落 │ ▼ 完成状态 SCT2 SC81 (0x281 Guard Check) MORE DNR │ ▼ 随后才 Slot Link Down → 未完成命令被 host abort → SCT3 SC71 (0x371)因此0x281不是掉链的结果是掉链前盘已经在报 PI/介质类错误0x371才是掉链瞬间的 host 侧取消。3.pciehp在干什么物理层入口3.1 典型片段Slot 40 / 32 / 42 形态相同Card present No link ← Presence Detect 仍断言链路未训练 … ~30s热插拔驱动等 Link Up… Card present Link Up pci … enabling device Already in powering on state ← 上电未完成又来一次 surprise叠加日志含义Already disabled槽位已被软件关掉pciehp自己或有人写了slots/*/powerSlot(40) 反复enabling device同一 BDFe1:00.0被拆掉再枚举成同一个名字nvme0是循环不是一次 hangSlot(42) 建队列成功Shutdown timeout 15s、128/0/0 default/read/poll queues、rescanning namespaces→ 新实例曾经 Ready 且有 NSSlot(32) 最密但缺81:00.0增删更像LTSSM 抖、尚未完整 remove或 remove/add 打在别的 BDF。必须单独确认下游3.2 与-ENODEV的关系-19/-ENODEV在这条链上有两种充分条件不必互斥PCI 设备已从总线消失Surprise remove→ 任何后续 admin/io 都是-ENODEV。设备还在但 CLR 后CSTS.RDY不置位驱动放弃 → 同样-ENODEV。现网两种都出现过。实例号空洞大量可用 Surprise 直接解释不必先假设双口。3.3 现场需一并核对MPS 被抬到 512是否符合 Root Port / 交换机 / 盘的协商设计避免当成「无关配置」。BMC / 带外是否对 slot 做 power cycle会与pciehp抢状态出现Already disabled/Already in powering on state。4. 两类 I/O必须拆开禁止写成「盘坏了」4.1 僵尸 gendisk 被 udev / blkid 戳容量已废I/O error, dev nvme3n1, sector 0 unable to read RDB block 0 unable to read partition table partition table beyond EOD, truncated项说明谁在打systemd-udevd/blkid/ 监控扫残节点打什么sector 0、RDB、分区表块层状态gendisk还在容量已是 EOD 或队列已死是不是业务不是4.2 活着或半活路径上的介质 / PI 完成错nvmeXn1: I/O Cmd(0x2) LBA …, 8 blocks, I/O Error (sct 0x2 / sc 0x81) MORE DNR critical medium error字段规格含义现场解读Opcode0x2Read读路径8 blocks典型 512B×8 4KB对齐一次页面/一次 scrub 单元LBA 散落 间隔 ~2s—scrub / 巡检 / 用户态扫盘不是随机业务SCT2 SC810x281End-to-end Guard CheckPI/DIF CRC厂商也可能把0x81当通用 media error必须以 Identify 的dps/ms核对是否真开了 PIMORE后续还有错不要当单点 ECCDNRDo Not Retry固件禁止 host 重试再打也是同一条错对照样本Slot(40): Link Down nvme3n1: … (sct 0x3 / sc 0x71) ← 0x371 HOST_ABORTED_CMD时序先0x281完成后 Link Down再0x371。掉链不能用来「洗掉」掉链前的 Guard Check。4.3 最危险的时序新实例已活旧n1无人释放Endpoint新绑定旧节点仍在 completione1:00.0已是nvme0nvme3n1仍出 I/O 完成e3:00.0已是nvme8128 队列nvme5n1仍报0x281内核 nvme 驱动在 Surprise remove 时PCI 功能没了 → 分配新的nvmeX次序号若用户态 / udev / multipath仍持有旧/dev/nvmeXn1的打开文件或 gendisk 引用旧节点不会消失I/O 会继续下到已经无效或半死的请求队列。谁还握着/dev/nvme3n1、/dev/nvme5n1OSD、qemu、multipath、监控、厂商工具谁就在给死路径喂 I/O并把固件从「偶发 PI 错」推向「再 reset / 再掉链」。数据面只认现实例nvme0n1/nvme8n1且list-ns非空。旧节点只许停、不许修、不许再blkid。5. 与 CLR /CSTS0x1如何衔接改口径不推翻旧事实仍成立两颗问题盘都经历过 Controller Reset 后 RDY 不落 →-ENODEV。现网没有第二 PF。nvme8是故障后再枚举、「看起来 Ready」的实例曾建 128 队列并 rescan NS。必须改的口径-19与实例空洞优先用 Slot(40)/Slot(42) Surprise 解释CLR 卡死是叠加动作的结果。Slot(40) 两日内反复enabling device 链路/热插拔循环不是单次固件 hang。在循环上打nvme reset链路窗口内 admin 超时 → 驱动见CSTS停在0x1→ 放弃设备。规格对照便于盘厂对接无需厂商名寄存器/状态期望现网CC.EN0→1 或 Controller ResetCSTS.RDY在 CAP.TO 内置 1保持0x1或不可读设备从 PCI 消失驱动应 teardown 并释放旧 NS旧n1残留Identify CMIC双口应有多控制器/多口标志CMIC06. 证据分级对外时不要把推断写成事实级别内容已坐实三槽pciehpSurprisee1:00.0↔nvme0↔旧 nvme3e3:00.0↔nvme8↔旧 nvme5无第二 PF0x281出现在部分 Link Down 之前旧n1在新 ctrl 存活后仍 completionCLR 后 RDY 不落曾导致-ENODEV高置信推断Slot(32) 下游为81:00.04K/~2s 为 scrub/巡检僵尸 sector 0 为 udev/blkid待取证Slot(32) 下游 BDF 实锤AER/Uncorrectable 是否伴随BMC 是否 cycle powerid-ns的dps/msPI 是否真开谁持有旧 fd数据现在在nvme0n1/nvme8n1还是空 ctrl7. 立即处置只读 止血原则先切断旧节点 I/O再采集只读信息全程禁止 reset 与槽位下电。7.1 止血lsof /dev/nvme3n1 /dev/nvme5n1 /dev/nvme3 /dev/nvme5 2/dev/null lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,PKNAME | grep -E nvme[0358] multipath -ll 2/dev/null | grep -A2 -E nvme[0358] # 若 OSD/文件系统/qemu 仍挂在 nvme3n1、nvme5n1 → 先停业务再卸设备 ls -l /dev/nvme{0,3,5,8}* 2/dev/null nvme list nvme list-ns /dev/nvme0 nvme list-ns /dev/nvme8判定list-ns对 nvme0/nvme8有 NS且存在nvme0n1/nvme8n1→ 数据面在新节点旧节点一律停。只有空 ctrl、无n1→ 不要对旧n1做任何「修复」先固定链路再谈数据。7.2 链路 / 槽位 / AER只读ls -l /sys/bus/pci/devices/0000:80:01.1/ find /sys/bus/pci/devices/0000:80:01.1 -name address -o -name devicetype 2/dev/null | head ls /sys/bus/pci/slots for s in /sys/bus/pci/slots/*; do echo $s; cat $s/address $s/power 2/dev/null; done for d in 0000:e1:00.0 0000:e3:00.0; do echo $d cat /sys/bus/pci/devices/$d/current_link_speed cat /sys/bus/pci/devices/$d/current_link_width done dmesg -T | grep -iE AER|PCIe Bus Error|Uncorrectable|e1:00|e3:00|81:00 核对待外/BMC 是否对上述 slot 做 cycle不要在此时手动写 slots/*/power7.3 盘侧只读禁止 reset / NSSR / FLRnvme smart-log /dev/nvme0 nvme smart-log /dev/nvme8 nvme error-log /dev/nvme0 -e 16 nvme error-log /dev/nvme8 -e 16 nvme id-ns /dev/nvme0n1 2/dev/null | egrep nsze|ncap|dps|lbaf|ms nvme id-ns /dev/nvme8n1 2/dev/null | egrep nsze|ncap|dps|lbaf|ms 若dps/ms显示PI 未开却大量0x281固件乱报或内部映射/RAID 损坏直接作为盘厂缺陷单而不是「开 PI 后的 CRC」。禁止nvme reset、FLR、写 NSSR、echo 0 slots/*/power。建议回收给分析侧nvme list、旧n1的lsof、nvme0/8 的list-ns、Slot(32) 下游 BDF、id-ns的 PI 字段、当前 link speed/width。8. 对外话术可直接转发8.1 平台 / 现场80:01.1Slot(32)、e0:03.1Slot(40)、e0:03.3Slot(42) 发生 PCIe 热插拔 SurprisePresence 仍在Card present链路未训练No link约 30s 后再 Link Up。Slot(40)/(42) 伴随 NVMe Endpoint 反复重新枚举Slot(40) 在两日内多次enabling device。请检查U.2 连接器、背板、线序、槽位供电带外/BMC 是否对上述 slot 做 power 操作日志中有Already disabled/Already in powering on stateMPS 被协商到 512是否符合该槽位设计。在链路未稳定前不要对槽位软件下电不要对盘做 Controller Reset / FLR。8.2 盘厂 / 固件盘 A现nvme0e1:00.0Slot 40内核旧名nvme3掉链前 Read 返回SCT2 SC81Guard CheckDNR随后 Link Downhost 侧SCT3 SC71HOST_ABORTED_CMD。历史 CLR 时CSTS保持0x1随后-ENODEV。盘 B现nvme8e3:00.0Slot 42内核旧名nvme5IdentifyCMIC0。同样出现过 CLR 后 RDY 不落再枚举后能建 128 队列并 rescan NS但旧nvme5n1仍报0x281。请书面回复链路 SurprisePD 仍在、LTSSM 掉后CC.EN/CSTS.RDY的状态机与超时Namespace未启用 PI时为何完成0x281Guard Check或确认内部是否误用该 statusPCI remove 后残留 NS / 旧块设备上 I/O 的完成与 abort 路径以及为何 DNR。9. 后续决策树避免现场即兴链路是否仍在 Surprise 循环 ├─ 是 → 只做物理排查禁 reset / 禁 slot power停旧 n1 I/O └─ 否 → nvme0 / nvme8 是否仍在且 list-ns 非空 ├─ 有 n1 → 业务切到新节点销毁旧 udev 规则/残留 dm再观察 smart/error-log └─ 无 n1 → 不要扫描旧 n1保留现场提交盘厂RDY/NS 残留 平台槽位 PI 未开却 0x281 └─ 是 → 固件缺陷单不要用「开 PI」去圆 谁还在打开 nvme3n1/nvme5n1 └─ 有 → 先杀/停该进程再谈任何「修复」10. 一句话结论三条线同时成立槽位 Surprise 掉链、PCI 重枚举导致 ctrl 号漂移、旧 gendisk 被 udev/巡检继续打 4K 读。掉链前已有0x281CLR 后曾RDY不落双口不成立。止血是停旧节点、禁 reset、禁槽位下电根因由平台链路与盘侧 CC/PI 完成路径共同承担。你在现网遇到过类似的pciehpSurprise 掉链 旧 gendisk 残留的组合吗当时是怎么定位和止血的欢迎在评论区分享你的排查思路一起把这条失败链补得更完整。