三星PM9A1 NVMe存储初始化timeout无法识别

警告

从我的使用经验来看,这款 三星PM9A1 NVMe存储 存在严重的质量问题,至少早期版本很有可能存在硬件和软件隐患,在某个触发条件下会导致控制器损坏。我的3个PM9A1故障让我对三星的OEM质量非常失望,几乎是粉转黑了。

另外在网上找到的信息:

问题

我在准备 更新三星PM9A1 NVMe存储firmware 时遇到一个非常奇怪的问题:

我首先修订内核配置,将 采用OVMF实现passthrough GPU和NVMe存储 配置的内核参数 /etc/defualt/grub 配置:

配置/etc/default/grub加载vfio-pci.ids来隔离PCI直通设备
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt pci=realloc vfio-pci.ids=144d:a80a,10de:1b39 rd.driver.blacklist=nouveau,rivafb,nvidiafb,rivatv"

去除掉 vfio-pci.ids 配置,即修改成如下:

去除掉 vfio-pci.ids 配置 以便能够在物理主机上使用NVMe设备
# GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt pci=realloc vfio-pci.ids=144d:a80a,10de:1b39 rd.driver.blacklist=nouveau,rivafb,nvidiafb,rivatv"
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt pci=realloc rd.driver.blacklist=nouveau,rivafb,nvidiafb,rivatv"

然后更新grub: sudo update-grub ,并重启服务器

奇怪的是, 重启后在物理服务器上看不到任何 NVMe 设备 :

lspci -nn 命令检查设备ID和 vfio-pci 绑定ID
lspci -nn | grep -i samsung

输出信息可以看到物理主机确实已经安插好了 三星PM9A1 NVMe存储 :

lspci -nn 命令可以看到系统已经安插好一块 三星PM9A1 NVMe存储
0b:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO [144d:a80a]
lspci检查nvme设备驱动
lspci -nnk -d 144d:a80a

这里就 看出问题 了,输出显示操作系统没有加载驱动:

lspci检查nvme设备使用驱动是空白行
05:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO [144d:a80a]
	Subsystem: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO [144d:a801]
	Kernel modules: nvme

而翻看之前 采用OVMF实现passthrough GPU和NVMe存储 可以看到这里应该有一行 Kernel driver in use: nvme :

原先在 采用OVMF实现passthrough GPU和NVMe存储 lspci检查尚未隔离的nvme设备显示使用了nvme设备驱动
05:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd Device [144d:a80a]
 Subsystem: Samsung Electronics Co Ltd Device [144d:a801]
 Kernel driver in use: nvme
 Kernel modules: nvme
08:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd Device [144d:a80a]
 Subsystem: Samsung Electronics Co Ltd Device [144d:a801]
 Kernel driver in use: nvme
 Kernel modules: nvme
0b:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd Device [144d:a80a]
 Subsystem: Samsung Electronics Co Ltd Device [144d:a801]
 Kernel driver in use: nvme
 Kernel modules: nvme
  • 为什么有这个差异呢?检查 dmesg -T | grep -i nvme 可以看到如下输出:

dmesg 显示NVMe设备初始化超时
[Mon Feb 17 21:24:01 2025] nvme nvme0: pci function 0000:08:00.0
[Mon Feb 17 21:24:01 2025] nvme nvme0: 8/0/0 default/read/poll queues
[Mon Feb 17 21:24:01 2025]  nvme0n1: p1 p2
[Mon Feb 17 21:24:01 2025] nvme nvme1: pci function 0000:0b:00.0
[Mon Feb 17 21:25:02 2025] nvme nvme1: I/O 1 QID 0 timeout, disable controller
[Mon Feb 17 21:25:03 2025] nvme nvme1: Device shutdown incomplete; abort shutdown
[Mon Feb 17 21:25:03 2025] nvme nvme1: Removing after probe failure status: -4

2024年11月的一些尝试(失败)

archlinux wiki: NVMe#Troubleshooting 说明:

  • 部分NVMe设备存在节能(APST)异常缺陷,已经发现报告过 使用S5Z42105 firmware的Kingston A2000早期Samsung NVMe驱动 以及一些WesternDigital/Sandisk 设备

  • 解决方法是内核关闭APST以及添加相关关闭pcie电源管理参数:

    • nvme_core.default_ps_max_latency_us=0

    • pcie_aspm=off pcie_port_pm=off

考虑到之前我是将 三星PM9A1 NVMe存储 passthrough 给虚拟机使用,所以物理服务器内核没有触发这个问题,所以我首先尝试关闭 APST ,然后又加上了关闭pcie电源管理参数,最终配置如下:

#GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt vfio-pci.ids=144d:a80a intel_pstate=enable processor.max_cstate=1 intel_idle.max_cstate=1 rd.driver.blacklist=nouveau,rivafb,nvidiafb,rivatv"
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt intel_pstate=enable processor.max_cstate=1 intel_idle.max_cstate=1 rd.driver.blacklist=nouveau,rivafb,nvidiafb,rivatv nvme_core.default_ps_max_latency_us=0 pcie_aspm=off pcie_port_pm=off"

但是都没有效果: 这个设置参数是按照archlinux的文档参考 [PATCH v2] nvme-pci: Fix the instructions for disabling power management ,其中提到的 "Samsung SSD 970 EVO PlusNVMe SSD" 环境fix似乎和我类似,但是我验证没有成功。

我尝试对操作系统进行升级,但是意外发现系统宕机,终端显示出 NMI 错误。联想到最近出现的 HPE DL360 Gen9服务器PCI Bus Error 以及反复和处理器processor 1相关的SATA磁盘报错,所以我怀疑处理器processor 1的PCIe通道可能确实是硬件故障了。

由于processor 1和PCIe插槽1、2关联,所以我将PCIe插槽1、2上的NVMe转接卡拔下,仅查一个NVMe到PCIe插槽3上,这样启动就没有报硬件错误。不过,很不幸,启动以后 三星PM9A1 NVMe存储 还是没有使用nvme驱动,导致没有显示出来。

最后,我甚至尝试了使用 Arch Linux 安装U盘启动服务器,但是检查启动日志 dmesg -T | grep -i nvme 依然看到相同的报错:

使用安装U盘启动也无法识别nvme设备,报错依旧
[Sat Nov 23 12:14:11 2024] nvme nvme0: pci function 0000:82:00.0
[Sat Nov 23 12:15:11 2024] nvme nvme0: I/O tag 29 (001d) QID 0 timeout, disable controller
[Sat Nov 23 12:15:11 2024] nvme nvme0: Device not ready; aborting shutdown, CSTS=0x1
[Sat Nov 23 12:15:12 2024] nvme 0000:82:00.0: probe with driver nvme failed with error -4

我目前推测是服务器主板的PCIe通道硬件故障了,因为轮换了多块nvme依然没有能够识别出

不过,因为我2025年2月因为 HPE ProLiant DL360 Gen9服务器 主板损坏无法启动,重新购买了 HPE ProLiant DL380 Gen9服务器 ,依然存在无法识别 三星PM9A1 NVMe存储 。这也证明之前的推测是错误的,这个问题 不是服务器PCIe通道硬件故障

2025年2月尝试修复

lspci检查nvme设备驱动
lspci -nnk -d 144d:a80a
lspci检查nvme设备使用驱动是空白行
0b:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO [144d:a80a]
	Subsystem: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO (SSD 980 PRO) [144d:a801]
	Kernel modules: nvme
使用 nvme-cli 检查设备
nvme list

我尝试采用 更新三星PM9A1 NVMe存储firmware 来修复,但是很不幸,如果SSD无法识别,则firmware更新程序无法刷新

解决新思路

我突然想到为何我之前在 采用OVMF实现passthrough GPU和NVMe存储 是成功的,并且能够 手工部署Ceph 稳定运行了两三年:

  • 我甚至找到 Ceph底层Ubuntu操作系统升级到22.04 证明我最初部署的Ceph环境Ubuntu 20.04 LTS,于2022年9月 升级Ubuntu 20.04 LTS到22.04 LTS

    • 升级前后Ceph运行都非常稳定,侧面验证了 三星PM9A1 NVMe存储 在Ubuntu 22.04 LTS是可以运行的

    • 但是我注意到一个问题,我之前运行的Ubuntu内核是 5.15 / 5.19 系列,我不记得使用过 6.x 系列内核

      • 根据网上资料,Ubuntu 22.04 LTS 在22年4月发布时使用的是 5.15 内核

      • Ubuntu 22.04.2 时内核升级到 5.19

      • 2023年8月,Ubuntu 22.04.3 LTS 内核跃升到 Kernel 6.2; 而当前 Ubuntu 22.04 LTS 内核采用的是 Kernel 6.5

    • 我又核对了我当前使用的 LFS(Linux from scratch)Debian 12,分别使用了内核 6.10.56.1.0

  • Ubuntu 22.04 对应的是 Debian 12,所以从发行版来看,两者没有区别: 主要区别看起来就是我一直使用 Kernel 5.15/5.19 是正常使用 旧版本firmware 三星PM9A1 NVMe存储 ,而切换到 Kernel 6.x 之后似乎就没有正常使用过 三星PM9A1 NVMe存储

警告

在尝试了 Debian降级内核 将内核降级到 5.15 之后,发现没有解决 三星PM9A1 NVMe存储 识别问题。

很不幸,看来还有什么细节差异没有找到,内核降级到 5.15 没有解决问题。

补充信息: 在线服务器的系统日志中也曾发现过类似 Timeout 报错,似乎这种NVMe报错并非罕见:

kernel: nvme nvme0: Shutdown timeout set to 10 seconds

ubuntu 20.04

重新部署安装 Ubuntu Linux 20.04 版本,但是我发现内核是 vmlinuz-5.4.0-144 ,即使升级也是 vmlinuz-5.4.0-208 ,并没有解决识别 三星PM9A1 NVMe存储 问题。在这个内核版本,我尝试添加了内核参数:

#GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt vfio-pci.ids=144d:a80a intel_pstate=enable processor.max_cstate=1 intel_idle.max_cstate=1 rd.driver.blacklist=nouveau,rivafb,nvidiafb,rivatv"
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt intel_pstate=enable processor.max_cstate=1 intel_idle.max_cstate=1 rd.driver.blacklist=nouveau,rivafb,nvidiafb,rivatv nvme_core.default_ps_max_latency_us=0 pcie_aspm=off pcie_port_pm=off"

也没有解决

但是我发现和我之前笔记不同,内核没有达到 5.15/5.19 ,似乎需要做一次升级: 执行 升级Ubuntu ,检查内核版本是 5.15.0-134-generic ( Ubuntu 22.04.5 LTS )

太奔溃了,还是没有解决

我发现在主机的BIOS设置中选择对NVMe设备进行test,异常的 三星PM9A1 NVMe存储 测试控制器始终是 fail 状态,看来挽救的可能性非常小了。

已经寄了3个Samsung PM9A1了,大哭

参考