Я обновил ноутбук MSI GT73VR, который имеет два слота NVME (и один слот SATA). Я обнаружил, что Ubuntu 20.04 и 18.04 может видеть только один из дисков (в первом слоте). Переключение карт M.2 позволяет увидеть любой диск в первом слоте. BIOS и Windows 10 могут видеть диски, а Windows имеет доступ к обоим. Один диск - это ADATA SX8100NP, видимый в данный момент, другой - Intel 660
. В BIOS установлен режим доступа AHCI. Проблема может быть больше связана с Linux, чем с Ubuntu как таковая, поскольку, когда я пробовал ISO-образы установки Manjaro и OpenSUSE с USB-накопителя, они также могли видеть только один диск 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
Есть ли другие параметры ядра, которые можно попробовать? Спасибо!
Мне удалось решить проблему, добавив параметр ядра 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 ... скрыто за мостом..." Я искал параметр, который переназначить устройства 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. Надеюсь, кто-то еще найдет это полезным.