webentwicklung-frage-antwort-db.com.de

WD (Sandisk) NVMe M.2 Stick funktioniert nicht ganz

Um klar zu sein, erwartete ich Ärger. Der Computer ist ein alter HP Z820 (sicherlich keine BIOS-Unterstützung für NVMe) mit dem neuesten BIOS-Update für 2018. Der Stick ist ein neues (-ish?) Western Digital (Sandisk) Modell:

WD Black 500 GB NVMe SSD - M.2 2280 - WDS500G2X0C

Auf einer PCIe 3.0 x4-Karte montiert:

Mailiya M.2 PCIe zu PCIe 3.0 x4 Adapter

Ich versuche nicht, von NVMe zu booten, sondern nur zum Speichern zu verwenden. Linux sieht das Laufwerk (über lsblk und lspci) und kann lesen ... aber nicht schreiben.

Dies ist Ubuntu 18.04.2 LTS mit der Kernel-Version:

Linux brutus 4.15.0-46-generic # 49-Ubuntu SMP Mi 6. Februar 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

(Auch am 18.10 getestet.)

Die Linux-Quellen für diese Version und für das aktuelle 5.0-Linux (von torvalds/linux auf Github) wurden abgerufen. Es gibt erhebliche Unterschiede in Treiber/NVME zwischen Ubuntu LTS und aktuell, mit Updates, die erst gestern (!) (Gestern 2019.03.16 in "cd drivers/nvme; git log") vorliegen.

Wie ich zu Beginn sagte, ich erwarte Ärger. :) :)

Erwähnenswert ist, dass ich mit Linux-Gerätetreibern ein wenig vertraut bin, da ich einen von mäßiger Komplexität geschrieben habe.

Versucht, die aktuellen Linux 5.0-Quellen und "rmmod nvme; insmod nvme" zu kompilieren - was nicht funktioniert hat (keine Überraschung). Versucht, den 5.0 nvme-Treiber in den 4.15-Baum zu kopieren und zu kompilieren - was nicht funktioniert hat (auch keine Überraschung, aber hey, ich muss es versuchen).

Die nächste Übung wäre, den aktuellen Linux 5.0-Kernel zu starten. Aber könnte dies genauso gut öffentlich machen, falls jemand anderes weiter ist.

Lesevorgänge funktionieren, aber langsamer als erwartet:

# hdparm -t --direct /dev/nvme0n1 

/dev/nvme0n1:
 Timing O_DIRECT disk reads: 4840 MB in  3.00 seconds = 1612.83 MB/sec

# dd bs=1M count=8192 if=/dev/nvme0n1 of=/dev/null
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 4.57285 s, 1.9 GB/s

Schriften scheitern schlecht:

# dd bs=1M count=2 if=/dev/zero of=/dev/nvme0n1 
(hangs)

Aus journalctl:

Mar 17 18:49:23 brutus kernel: nvme nvme0: async event result 00010300
Mar 17 18:49:23 brutus kernel: print_req_error: I/O error, dev nvme0n1, sector 0
Mar 17 18:49:23 brutus kernel: buffer_io_error: 118 callbacks suppressed
Mar 17 18:49:23 brutus kernel: Buffer I/O error on dev nvme0n1, logical block 0, lost async page write
[snip]
Mar 17 18:49:23 brutus kernel: print_req_error: I/O error, dev nvme0n1, sector 1024
Mar 17 18:49:23 brutus kernel: print_req_error: I/O error, dev nvme0n1, sector 3072

Mit dem Befehlszeilentool "nvme" ein bisschen herumgestochert, aber nur geraten:

# nvme list -o json
{
  "Devices" : [
    {
      "DevicePath" : "/dev/nvme0n1",
      "Firmware" : "101140WD",
      "Index" : 0,
      "ModelNumber" : "WDS500G2X0C-00L350",
      "ProductName" : "Unknown Device",
      "SerialNumber" : "184570802442",
      "UsedBytes" : 500107862016,
      "MaximiumLBA" : 976773168,
      "PhysicalSize" : 500107862016,
      "SectorSize" : 512
    }
  ]

FYI - lspci Ausgabe:

03:00.0 Non-Volatile memory controller: Sandisk Corp Device 5002 (prog-if 02 [NVM Express])
        Subsystem: Sandisk Corp Device 5002
        Physical Slot: 1
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 37
        NUMA node: 0
        Region 0: Memory at de500000 (64-bit, non-prefetchable) [size=16K]
        Region 4: Memory at de504000 (64-bit, non-prefetchable) [size=256]
        Capabilities: [80] Power Management version 3
                Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [90] MSI: Enable- Count=1/32 Maskable- 64bit+
                Address: 0000000000000000  Data: 0000
        Capabilities: [b0] MSI-X: Enable+ Count=65 Masked-
                Vector table: BAR=0 offset=00002000
                PBA: BAR=4 offset=00000000
        Capabilities: [c0] Express (v2) Endpoint, MSI 00
                DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <1us, L1 unlimited
                        ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ SlotPowerLimit 0.000W
                DevCtl: Report errors: Correctable+ Non-Fatal+ Fatal+ Unsupported+
                        RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset-
                        MaxPayload 256 bytes, MaxReadReq 1024 bytes
                DevSta: CorrErr+ UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
                LnkCap: Port #0, Speed 8GT/s, Width x4, ASPM L1, Exit Latency L0s <256ns, L1 <8us
                        ClockPM+ Surprise- LLActRep- BwNot- ASPMOptComp+
                LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+
                        ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
                LnkSta: Speed 8GT/s, Width x4, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
                DevCap2: Completion Timeout: Range B, TimeoutDis+, LTR+, OBFF Not Supported
                DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, OBFF Disabled
                LnkCtl2: Target Link Speed: 8GT/s, EnterCompliance- SpeedDis-
                         Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
                         Compliance De-emphasis: -6dB
                LnkSta2: Current De-emphasis Level: -3.5dB, EqualizationComplete+, EqualizationPhase1+
                         EqualizationPhase2+, EqualizationPhase3+, LinkEqualizationRequest-
        Capabilities: [100 v2] Advanced Error Reporting
                UESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
                UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
                UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
                CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
                CEMsk:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
                AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn-
        Capabilities: [150 v1] Device Serial Number 00-00-00-00-00-00-00-00
        Capabilities: [1b8 v1] Latency Tolerance Reporting
                Max snoop latency: 0ns
                Max no snoop latency: 0ns
        Capabilities: [300 v1] #19
        Capabilities: [900 v1] L1 PM Substates
                L1SubCap: PCI-PM_L1.2- PCI-PM_L1.1- ASPM_L1.2+ ASPM_L1.1- L1_PM_Substates+
                          PortCommonModeRestoreTime=255us PortTPowerOnTime=10us
                L1SubCtl1: PCI-PM_L1.2- PCI-PM_L1.1- ASPM_L1.2- ASPM_L1.1-
                           T_CommonMode=0us LTR1.2_Threshold=0ns
                L1SubCtl2: T_PwrOn=10us
        Kernel driver in use: nvme
        Kernel modules: nvme

Heh. Gutschrift wo fällig. :) :)

[email protected]:~/sources/linux/drivers/nvme$ git log . | grep -i 'wdc.com\|@sandisk' | sed -e 's/^.*: //' | sort -uf
Adam Manzanares <[email protected]>
Bart Van Assche <[email protected]>
Bart Van Assche <[email protected]>
Chaitanya Kulkarni <[email protected]>
Jeff Lien <[email protected]>

Auch mit dem aktuellen (2019.03.17) Linux-Kernel getestet:

[email protected]:~# uname -a
Linux brutus 5.1.0-rc1 #1 SMP Mon Mar 18 01:03:14 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

[email protected]:~# pvcreate /dev/nvme0n1 
  /dev/nvme0n1: write failed after 0 of 4096 at 4096: Input/output error
  Failed to wipe new metadata area at the start of the /dev/nvme0n1
  Failed to add metadata area for new physical volume /dev/nvme0n1
  Failed to setup physical volume "/dev/nvme0n1".

Aus dem Tagebuch:

Mar 18 02:05:10 brutus kernel: print_req_error: I/O error, dev nvme0n1, sector 8 flags 8801
Mar 18 02:09:06 brutus kernel: print_req_error: I/O error, dev nvme0n1, sector 8 flags 8801
Mar 18 02:09:36 brutus kernel: print_req_error: I/O error, dev nvme0n1, sector 8 flags 8801

Also ... funktioniert anscheinend (noch) nicht in einer Linux-Version.

Ich weiß nicht, ob Sie diese Probleme noch haben, aber ich werde sie zumindest veröffentlichen, falls andere darauf stoßen.

Ich habe das gleiche Laufwerk und verwende es als mein primäres Laufwerk, auf dem 18.04 ausgeführt wird. Ich habe das Windows-Firmware-Dienstprogramm verwendet und bis jetzt keine Updates gesehen. Ich habe auch die Live-Umgebung für 19.04 getestet, die die gleichen Einfrierungen/Fehler bei der Installation aufweist, die ich mit 18.04 und 18.10 erlebt habe, sodass das Problem immer noch offen zu sein scheint.

Das Problem scheint zu sein, dass das Laufwerk instabil wird, wenn es in den Energiesparmodus wechselt. Daher besteht die Lösung darin, die Energiesparmodi über den Kernel-Boot-Parameter zu deaktivieren. Ich habe das vor ein paar Monaten gemacht und hatte seitdem am 18.04 keine Probleme mehr. Diese Methode sollte auch auf den neuen Versionen (18.10/19.04) funktionieren, aber es ist eine Schande, dass sie noch nicht behoben wurde.

Drücken Sie im Startmenü GRUB) e Startparameter bearbeiten. Fügen Sie nvme_core.default_ps_max_latency_us=5500 Bis zum Ende des leisen Spritzens hinzu Ctrl- -x Zum Starten sollte das Installationsprogramm diese Festplatte im Partitionsschritt erkennen.

Drücken Sie nach Abschluss der Installation shift Während Sie das Gerät einschalten, um GRUB erneut einzugeben, fügen Sie denselben Kernel-Parameter hinzu nvme_core.default_ps_max_latency_us=5500Ctrl- -x hochfahren. Sie werden sehen, dass Ubuntu erfolgreich gestartet wurde, /etc/default/grub Bearbeiten, den Parameter nvme_core.default_ps_max_latency_us=5500 Erneut hinzufügen und Sudo update-grub Ausführen. Damit jedes Mal beim Booten dieser Parameter automatisch im Grub enthalten ist, muss er nicht mehr manuell bearbeitet werden.

https://community.wd.com/t/linux-support-for-wd-black-nvme-2018/225446/9

1
Steve Jones