Ubuntu 仅看到 Bios 和 Windows 10 可见的两个 nvme 驱动器中的一个:PCI 问题

Ubuntu 仅看到 Bios 和 Windows 10 可见的两个 nvme 驱动器中的一个:PCI 问题

我升级了一台 MSI GT73VR 笔记本电脑,它有两个 NVME 插槽(和一个 SATA 插槽)。我发现 Ubuntu 20.04 和 18.04 只能看到其中一个驱动器(在第一个插槽中)。切换 M.2 卡可以看到第一个插槽中的任何驱动器。BIOS 和 Windows 10 都可以看到驱动器,Windows 可以访问这两个驱动器。一个驱动器是 ADATA SX8100NP,目前可见,另一个是 Intel 660

BIOS 设置为 AHCI 访问模式。问题可能更多地与 Linux 有关,而不是与 Ubuntu 有关,因为当我尝试从 USB 安装 Manjaro 和 OpenSUSE isos 时,它们也只能看到一个 NVME 驱动器:/dev/nvme0n1。

$ ls /dev/nvme*
/dev/nvme0    /dev/nvme0n1p1   /dev/nvme0n1p11  /dev/nvme0n1p13  /dev/nvme0n1p2  /dev/nvme0n1p4  /dev/nvme0n1p6  /dev/nvme0n1p8
/dev/nvme0n1  /dev/nvme0n1p10  /dev/nvme0n1p12  /dev/nvme0n1p14  /dev/nvme0n1p3  /dev/nvme0n1p5  /dev/nvme0n1p7  /dev/nvme0n1p9

尝试调试后我发现问题与 PCIE 总线有关,因为两个 nvme 驱动器在 PCI 总线上均可见。

$ lspci |grep memory
02:00.0 Non-Volatile memory controller: Realtek Semiconductor Co., Ltd. Device 5762 (rev 01)
3f:00.0 Non-Volatile memory controller: Intel Corporation Device f1a8 (rev 03)

有关隐形 nvme 驱动器的更多详细信息:

~$ sudo lspci -v -s 3f:00.0 
3f:00.0 Non-Volatile memory controller: Intel Corporation Device f1a8 (rev 03) (prog-if 02 [NVM Express])
        Subsystem: Intel Corporation Device 390d
        Flags: bus master, fast devsel, latency 0, IRQ 255, NUMA node 0
        Memory at <ignored> (64-bit, non-prefetchable)
        Capabilities: [40] Power Management version 3
        Capabilities: [50] MSI: Enable- Count=1/8 Maskable+ 64bit+
        Capabilities: [70] Express Endpoint, MSI 00
        Capabilities: [b0] MSI-X: Enable- Count=16 Masked-
        Capabilities: [100] Advanced Error Reporting
        Capabilities: [158] #19
        Capabilities: [178] Latency Tolerance Reporting
        Capabilities: [180] L1 PM Substates
        Kernel modules: nvme

现在,这让我检查了 dmesg:

[    0.646094] pci 0000:3f:00.0: [8086:f1a8] type 00 class 0x010802
[    0.646529] pci 0000:3f:00.0: reg 0x10: [mem 0xdc200000-0xdc203fff 64bit]
[    0.648075] pci 0000:3f:00.0: 8.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s PCIe x4 link at 0000:07:04.0 (capable of 31.504 Gb/s with 8.0 GT/s PCIe x4 link)
[    0.815140] pci 0000:3f:00.0: can't claim BAR 0 [mem 0xdc200000-0xdc203fff 64bit]: no compatible bridge window
[    0.846800] pci 0000:3f:00.0: BAR 0: no space for [mem size 0x00004000 64bit]
[    0.846801] pci 0000:3f:00.0: BAR 0: trying firmware assignment [mem 0xdc200000-0xdc203fff 64bit]
[    0.846803] pci 0000:3f:00.0: BAR 0: [mem 0xdc200000-0xdc203fff 64bit] conflicts with PCI Bus 0000:00 [mem 0x40000000-0xdfffffff window]
[    0.846804] pci 0000:3f:00.0: BAR 0: failed to assign [mem size 0x00004000 64bit]
[    1.978833] pci 0000:3f:00.0: Adding to iommu group 21

似乎是由于无法为 PCI 设备分配内存,可能是由于总线冲突造成的。

有人知道如何解决这个问题吗?这个问题存在于内核 5.4.0.26 和我临时安装的主线内核 5.9.12 上,以及我尝试过的其他 Linux 安装介质上的任何内核上。

内核启动的参数包括改变 nvme 驱动器的最大延迟,但无论如何都没有效果:

$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-5.4.0-26-generic root=UUID=f91c3fe3-d5c2-45c7-bb74-b2200f7d4057 ro quiet splash intel_iommu=on nvme_core.default_ps_max_latency_us=5500

还有其他内核参数可以尝试吗?谢谢!

答案1

我设法通过添加内核参数 pci=assign-busses 解决了这个问题

现在我们 dmesg 显示:

$ sudo dmesg |grep 0c:00
[    0.645602] pci 0000:0c:00.0: [8086:f1a8] type 00 class 0x010802
[    0.645831] pci 0000:0c:00.0: reg 0x10: [mem 0xdc200000-0xdc203fff 64bit]
[    2.012831] pci 0000:0c:00.0: Adding to iommu group 22
[    2.435258] nvme nvme1: pci function 0000:0c:00.0

并且 nvme 列表显示

$ sudo nvme list
Node             SN                   Model                                    Namespace Usage                      Format           FW Rev  
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1     2K482919EDEF         ADATA SX8100NP                           1           2.05  TB /   2.05  TB    512   B +  0 B   VB421D57
/dev/nvme1n1     PHNH920600M92P0C     INTEL SSDPEKNW020T8                      1           2.05  TB /   2.05  TB    512   B +  0 B   004C 

问题发生期间,dmesg 中的其他消息包含“busn ... hidden behind bridge...”。我找到了一个可以忽略固件重新映射 PCI 设备的参数。摘自文档:

"The `pci=assign-busses' Argument
This tells the kernel to always assign all PCI bus numbers, overriding whatever the firmware may have done."

这不仅适用于 Ubuntu Bionic 和 Focal,还适用于我尝试过的所有 Linux 发行版:OpenSuse Tumbleweed、Debian 和 Manjaro。希望其他人会觉得这有用。

相关内容