花拾录
← 返回知识库

软重启后扩展卡从 PCI 总线彻底消失,只能冷启动才回来

云计算 / 运维导入2026/09/220 阅读0 评论

一台自建服务器,装了若干张扩展卡。某次执行了 reboot 之后,其中一张卡连影子都没了——不是驱动没加载、不是设备名变了,而是它在总线上根本不存在。lspci 列表里找不到它,连它上游的那个 PCIe 根端口也无影无踪。反复重装驱动、重新扫描总线,全都无效,最后只能彻底关机再开,一切恢复。

如果你也遇到过「重启后少了一张卡,关机再开就好」,那么大概率不是卡坏了,也不是驱动问题。

现象

表现有几个层次,值得逐层确认:

$ lspci | grep -i <关键字>
(没有任何输出)

$ ls /sys/bus/pci/devices/
(目标设备目录不存在,连它的上级桥也一起消失)

注意最后一点:消失的不只是那张卡,还有它所在的端口/桥。这非常关键——驱动问题只会让设备不可用,不会让总线上的一座「桥」消失。桥没了,说明是固件层面把这块拓扑结构摘掉了。

软件层的手段(echo 1 > /sys/bus/pci/rescan、重载驱动、modprobe -r)在桥已经不存在的情况下都无从下手,这正是「怎么弄都恢复不了」的原因。

根因

问题出在 BIOS 里该 PCIe 端口的默认策略是「自动」(Auto)。

这个「自动」不是「自动配置、保持可用」的意思,而是一句带有移除条件的规则:没有检测到设备、或者该设备报告了错误时,就移除这个扩展端口。也就是说,固件在初始化时会对这个槽位做一次判断,如果它认为这个端口上「有问题」,它会主动把整个端口从枚举结果里删掉——连同它在总线拓扑里的节点一起删。

热重启(warm reboot)时,设备可能还没从上一轮的复位状态里完全恢复,或者自检过程中报了某个错误,固件据此判定「这个端口不可靠」,于是执行了移除。冷启动(完全断电后上电)时,所有设备都从零开始初始化,不会撞上这个判断,于是又正常了。

这解释了那个最反直觉的点:为什么「热重启丢卡、冷启动正常」。不是随机故障,而是策略在特定时序下被触发。

解决

应急恢复(先让机器能用):彻底冷启动。

关机 → 关闭电源上的硬开关(或拔掉电源线)→ 等 20~30 秒 → 上电开机

20~30 秒是给待机电路和各类板卡的电容放电,确保不是又一次「伪冷启动」。

根治:进 BIOS,找到该端口的 PCIe 设置,把端口类型(命名可能是 PCIe Port Type、Slot Type、Root Port 配置之类)从 「自动」改成「启用」(Enabled)。改成启用后,固件不会再因为「觉得有问题」而移除端口,热重启时这张卡就稳住了。

改完建议连续做几次 reboot 验证,别改完重启一次没丢就以为好了。

延伸与预防

这类「固件主动做减法」的行为,在主板固件里比想象中常见。除了 PCIe 端口,类似的还有:USB 端口在自检失败时被禁用、内存插槽检测异常时被跳过、风扇接口读数异常时直接停转。它们的共同点是默认值里藏着一个「遇到异常就放弃」的策略,而这个策略在正常使用时几乎不会触发,一旦硬件有点小毛病或时序不巧,就会以「设备凭空消失」的形式爆发出来。

所以在虚拟化宿主机、直通设备这类场景里,一个稳妥的做法是:凡是关键设备所挂的端口,都从「自动」显式改成「启用」或对应的固定模式,把固件的判断权收回来。另外,把「热重启后设备消失」和「冷启动后恢复」当成一个固定的排查信号——出现这个组合,第一反应就该是去看固件里那个端口的策略,而不是去怀疑卡本身。

评论(0)

  • 还没有评论,来抢沙发~

相关文章