我升级了一台 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。希望其他人会觉得这有用。