固态硬盘/NVMe

出自 ArchWiki

本文或章节候选移动到 NVMe

注意: NVMe 规范也支持旋转介质 (HDD)。 (在 Talk:Solid state drive/NVMe 中讨论)

NVM Express (NVMe) 是一种用于访问通过 PCI Express 总线连接的 SSD 的规范。作为一种逻辑设备接口,NVM Express 从头开始设计,充分利用了 PCI Express SSD 的低延迟和并行性,并反映了当代 CPU、平台和应用程序的并行性。

安装

NVMe 设备应显示为 /dev/nvme*。 有关其命名的解释,请参阅 设备文件#NVMe

额外的用户空间 NVMe 工具可以在 nvme-clinvme-cli-gitAUR 中找到。

有关支持的文件系统、最大化性能、最小化磁盘读取/写入等,请参阅 固态硬盘

管理

注意: 本节改编自 [1]

列出所有附加的 NVMe SSD,包括名称、序列号、大小、LBA 格式和序列

# nvme list

以人类友好的方式列出有关驱动器的信息及其支持的功能

# nvme id-ctrl -H /dev/nvme0
提示: 为了理解所使用的缩写,请参阅相关 NVMe 规范中的“Identify Controller data structure”参考部分(例如,1.4a 规范的第 172 页底部)。

列出有关命名空间的信息及其支持的功能

注意: 命名空间是 NVMe 技术中保存用户数据的构造。一个 NVMe 控制器可以附加多个命名空间。如今,大多数 NVMe SSD 仅使用单个命名空间,但多租户应用程序、虚拟化和安全性具有多个命名空间的使用案例。
# nvme id-ns /dev/nvme0n1
提示: 为了理解所使用的缩写,请参阅相关 NVMe 规范中的“Identify Namespace data structure”参考部分(例如,1.4a 规范的第 163 页)。

输出 NVMe 错误日志页

# nvme error-log /dev/nvme0
提示: 查找错误计数不等于 0 的输出,以找出错误日志中是否有任何错误。

删除命名空间

警告: 此命令将删除指定命名空间上的所有数据。谨慎使用!
# nvme delete-ns /dev/nvme0n1

创建一个新的命名空间,例如,创建一个更小的命名空间来为 SSD 超额配置,以提高耐用性、性能和延迟

# nvme create-ns /dev/nvme0

有关所有命令及其简洁描述的列表,请参阅 nvme helpnvme(1)

SMART

输出 NVMe SMART 日志页,以获取健康状态、温度、耐用性等信息

# nvme smart-log /dev/nvme0
提示: 使用 -H 选项输出更多信息,例如 nvme smart-log -H /dev/nvme0

NVMe 支持已添加到 smartmontools 版本 6.5 中。

注意: smartmontools 官方 wiki 报告此支持为实验性的。

当前已实现的功能(来自 wiki)

  • 有关控制器名称、固件、容量的基本信息 (smartctl -i)
  • 控制器和命名空间功能 (smartctl -c)
  • SMART 总体健康状况自评估测试结果和警告 (smartctl -H)
  • NVMe SMART 属性 (smartctl -A)
  • NVMe 错误日志 (smartctl -l error[,NUM])
  • 获取任何 nvme 日志的能力 (smartctl -l nvmelog,N,SIZE)
  • smartd 守护程序跟踪健康状况 (-H)、错误计数 (-l error) 和温度 (-W DIFF,INFO,CRIT)

有关更多信息,请参阅 S.M.A.R.T.官方 wiki 条目,并参阅 本文,了解有关输出的上下文信息。

安全擦除

请参阅 固态硬盘/内存单元清除#NVMe 驱动器

固件更新

通用

可以使用 nvme-cli 管理固件。要显示可用插槽并检查插槽 1 是否为只读

# nvme fw-log /dev/nvme0
Firmware Log for device:nvme0
afi  : 0x11
frs1 : 0x32303132345a3553 (S5Z42102)
frs2 : 0x32303132345a3553 (S5Z42102)
# nvme id-ctrl /dev/nvme0 -H | grep Firmware
  [9:9] : 0x1	Firmware Activation Notices Supported
  [4:4] : 0x1	Firmware Activate Without Reset Supported
  [3:1] : 0x2	Number of Firmware Slots
  [0:0] : 0	Firmware Slot 1 Read/Write

下载固件并提交到指定的插槽。在下面的示例中,固件首先在未激活的情况下提交 (-a 0)。接下来,激活现有映像 (-a 2)。有关固件提交操作值的详细信息,请参阅 NVMe 规范

# nvme fw-download -f S5Z42_fw_S5Z42105.bin /dev/nvme0
Firmware download success
# nvme fw-commit -s 2 -a 0 /dev/nvme0
Success committing firmware action:0 slot:2
# nvme fw-log /dev/nvme0
Firmware Log for device:nvme0
afi  : 0x21
frs1 : 0x32303132345a3553 (S5Z42102)
frs2 : 0x35303132345a3553 (S5Z42105)
# nvme fw-commit -s 2 -a 2 /dev/nvme0
Success committing firmware action:2 slot:2

最后重置控制器以加载新固件

注意: 如果如上例所示,Firmware Activate Without Reset 被标记为受支持,则此步骤可能不是必需的。
# nvme reset /dev/nvme0

如果需要,也可以手动完成此操作

# echo 1 > /sys/class/nvme/nvme0/reset_controller

英特尔/Solidigm

在英特尔 SSD 业务被 SK 海力士收购后[2][3],其“内存和存储工具” (Intel MAS) 失去了对 SSD 的支持,现在只能用于管理傲腾设备。[4]

Solidigm 是从英特尔 SSD 业务收购案中在美国成立的子公司,它提供了一个新的实用程序来管理以前的英特尔 SSD:“Solidigm 存储工具,也称为 SST,可协助管理 Solidigm SSD。它提供对驱动器信息和健康状况、SMART 属性、固件更新、诊断扫描和安全擦除的访问。”[5]

安装 solidigm-sst-storage-tool-cliAUR,然后检查您的驱动器是否有可用的更新

# sst show -ssd
- ABCD012345NS512A -

Capacity : 512.11 GB (512,110,190,592 bytes)
DevicePath : /dev/nvme0n1
DeviceStatus : Healthy
Firmware : 004C
FirmwareUpdateAvailable : 005C
Index : 0
MaximumLBA : 1000215215
ModelNumber : INTEL SSDPEKNW512G8
ProductFamily : Intel SSD 660p Series
SMARTEnabled : True
SectorDataSize : 512
SerialNumber : ABCD012345NS512A

如果有,请按如下方式执行 load 命令,使用上一个命令中给出的索引值

# sst load -ssd index
WARNING! You have selected to update the drives firmware! 
Proceed with the update? (Y|N): Y
Updating firmware...
Firmware update successful

有关更多信息,请参阅该工具上述官方页面上提供的用户指南。

金士顿

金士顿不在其网站上提供单独的固件下载,而是引导用户使用仅限 Windows 的实用程序。固件文件似乎使用基于固件修订的可预测命名方案

https://media.kingston.com/support/downloads/S5Z42105.zip

然后按照通用刷写说明进行操作。

三星

除了面向 Windows 用户的“Samsung Magician Software”之外,三星还提供 SSD 固件作为可引导的 ISO 映像

https://semiconductor.samsung.com/consumer-storage/support/tools/

它们可以写入可引导的 CD 或 USB 驱动器,或者您可以解压映像并进行在线操作

$ curl -OL https://samsung.com/.../xxx.iso
$ bsdtar -xf xxx.iso initrd
$ bsdtar -xf initrd root
# ./root/fumagician/fumagician

您可能更喜欢使用 nvme-cli,而不是使用制造商的程序。

警告: 以下获取和刷写 SSD 固件的方式未经三星官方支持。它可能会使您的驱动器变砖,并且您可能会丢失所有数据。请自行承担风险。

截至 2025 年 1 月,ISO 上的固件文件由隐藏在 fumagician 二进制文件中的 AES 密钥加密[6][7]。您将在其旁边找到两个加密文件

$ ls -1 root/fumagician/*.enc
root/fumagician/2B2QKXG7.enc
root/fumagician/DSRD.enc

实际的固件文件是

  1. 由 AES 密钥加密,
  2. 然后将其插入 ZIP 文件,
  3. 并且 ZIP 文件再次加密,生成 2B2QKXG7.enc 文件。确切的文件名可能因 SSD 型号而异。

您首先需要确定使用的 AES 密钥。可以通过运行 [8]fumagician 实用程序中提取密钥

$ strings root/fumagician/fumagician | grep -E '^[A-Za-z0-9+/]{42}[AEIMQUYcgkosw048]=$' | base64 -d | xxd -p -c 32
bde8eedf5d75327b516decd4d2723209697c4c3e30550d98253319076b4d649a

然后,您可以使用 samdecrypt.sh 实用程序解密文件。首先,将上面找到的密钥插入脚本。然后,解密 ZIP 文件(结果将写入 root/fumagician/2B2QKXG7.bin

$ ./samdecrypt.sh root/fumagician/1B2QJXD7.enc

解压缩 ZIP 文件

$ unzip -d ssd_firmware root/fumagician/2B2QKXG7.bin
Archive:  root/fumagician/2B2QKXG7.bin
  inflating: ssd_firmware/2B2QKXG7_20241112.enc  
警告: 如果从 ZIP 文件中提取了多个文件,请停止遵循本指南。fumagician 二进制文件选择正确固件的方式尚不清楚。刷写错误的固件可能会使您的驱动器变砖。

最后,解密内部文件,生成 ssd_firmware/2B2QKXG7_20241112.bin

$ ./samdecrypt.sh ssd_firmware/2B2QKXG7_20241112.enc

您现在可以按照上一节中的说明手动上传 ssd_firmware/2B2QKXG7_20241112.bin 中的固件映像。但是,您需要为下载操作提供额外的 --xfer 参数[9]

# nvme fw-download /dev/nvme0 --fw ssd_firmware/2B2QKXG7_20241112.bin --xfer 0x8000

之后,提交操作应正常工作。

西部数据

西部数据仅支持通过其基于 Windows 的 Dashboard 软件进行更新。但是,如果您知道在哪里查找,可以直接下载固件。[10]

首先,导航到所有驱动器列表并找到您的驱动器 (model=model_number)。

在您的特定驱动器型号下,将有一个或多个 <url> 条目。如果存在多个 URL,则您可能需要使用以下说明尝试每个 URL,并检查 <dependency> 标签以获取您当前的固件版本。

现在,下载特定于驱动器的 XML 文件

$ curl https://wddashboarddownloads.wdc.com/url_entry

在此特定于驱动器的 XML 文件中,应该有一个 <fwfile> 标签,其中包含 xxxx.fluf 文件名。这是您想要的文件名;您可以通过将先前 URL 中的 device_properties.xml 替换为此文件名来下载它。

SN850X 驱动器的完整 URL 示例

$ curl --remote-name https://wddashboarddownloads.wdc.com/wdDashboard/firmware/WD_BLACK_SN850X_2000GB/620331WD/620331WD.fluf

获得 .fluf 文件后,可以使用通用刷写说明执行更新。请注意,这未经西部数据官方支持,可能无法正常工作,并可能损坏您的设备。请格外小心,确保您使用正确的驱动器和固件版本进行更新。

性能

扇区大小

请参阅 高级格式#NVMe 固态硬盘

气流

已知 NVMe SSD 容易受到高工作温度的影响,并且会在超过某些阈值时限制性能。[11]

测试

可以使用 hdparm 运行原始设备性能测试

# hdparm -Tt --direct /dev/nvme0n1

节能

允许驱动器进入低功耗状态 (APST)

要检查 NVMe 电源状态,请安装 nvme-clinvme-cli-gitAUR,并运行 nvme get-feature /dev/nvme[0-9] -f 0x0c -H

# nvme get-feature /dev/nvme0 -f 0x0c -H
get-feature:0xc (Autonomous Power State Transition), Current value:0x000001
        Autonomous Power State Transition Enable (APSTE): Enabled
        Auto PST Entries        .................

...

启用 APST 后,输出应包含“Autonomous Power State Transition Enable (APSTE): Enabled”,并且下面的表格中应有非零条目,指示转换到每个可用状态之前的空闲时间。

如果启用了 APST,但在表格中没有出现非零状态,则延迟可能太高,以至于默认情况下无法启用任何状态。nvme id-ctrl /dev/nvme[0-9](以 root 用户身份)的输出应显示 NVME 控制器的可用非操作电源状态。如果任何状态的总延迟(enlat + xlat)大于 25000 (25ms),则必须为 nvme_core 内核模块 传递至少那么高的值作为参数 default_ps_max_latency_us。这应启用 APST 并使 nvme get-feature(以 root 用户身份)中的表格显示条目。

在低功耗状态期间控制后台处理 (NOPPM)

驱动器的低功耗状态可能是非操作状态,在这种状态下,驱动器仅接受某些管理命令。NVMe 规范的 1.3 版本引入了非操作电源状态许可模式 (NOPPM) 功能,以控制非操作电源状态下的后台处理。启用后,当驱动器处于非操作电源状态时,驱动器可能会超过当前电源状态的声明功率限制(但不会超过最低操作电源状态的限制)来执行后台处理,例如垃圾回收或刷新旧数据。禁用后,驱动器将遵守当前状态的功率限制,并将此类处理推迟到下次进入操作电源状态,这可能会降低性能,直到完成处理。默认设置是供应商和驱动器特定的。

要检查您的驱动器是否支持 NOPPM,请使用 nvme id-ctrl /dev/nvme0 -H | grep 'Non-Operational Power State Permissive';输出将包括 Not SupportedSupported。要更改设置,请使用 nvme set-feature /dev/nvme0 -f 0x11 -V <value>,其中 <value>0x0 以禁用 NOPPM(优先考虑节能)或 0x1 以启用 NOPPM(优先考虑性能)。默认情况下,当驱动器重置时(在重新启动时,以及可能在从睡眠中唤醒时),设置将恢复为默认值。如果您的驱动器支持保存和选择功能支持 (SSFS) 功能,则可以通过将 --save 选项附加到 nvme set-feature 命令来使您的更改持久化。

故障排除

由于 APST 支持损坏导致的控制器故障

某些 NVMe 设备可能会出现与节能 (APST) 相关的问题。这是固件 S5Z42105 的金士顿 A2000 [12] 的已知问题,并且之前已在三星 NVMe 驱动器 (Linux v4.10) 上报告过[13][14]。一些 WesternDigital/Sandisk 设备也有报告[15]

故障会导致设备无法使用,直到系统重置,内核日志类似于

 nvme nvme0: I/O 566 QID 7 timeout, aborting
 nvme nvme0: I/O 989 QID 1 timeout, aborting
 nvme nvme0: I/O 990 QID 1 timeout, aborting
 nvme nvme0: I/O 840 QID 6 timeout, reset controller
 nvme nvme0: I/O 24 QID 0 timeout, reset controller
 nvme nvme0: Device not ready; aborting reset, CSTS=0x1
 ...
 nvme nvme0: Device not ready; aborting reset, CSTS=0x1
 nvme nvme0: Device not ready; aborting reset, CSTS=0x1
 nvme nvme0: failed to set APST feature (-19)

其他症状是 Btrfs 存储变为只读,Ext4 报告 I/O 错误。

作为一种解决方法,添加 内核参数 nvme_core.default_ps_max_latency_us=0 以完全禁用 APST,或设置自定义阈值以禁用特定状态。

如果设置延迟仍然无效,请尝试添加 pcie_aspm=offpcie_port_pm=off(如 [16] 所建议的)。

本文或章节已过时。

原因: 对于最新版本的 Linux 内核(例如 v4.14.221、v4.19.175、v5.4.97、v5.10.15、v5.11-rc7 及更高版本),此内核参数可能不再是必需的。[17] (在 Talk:Solid state drive/NVMe 中讨论)

自 2021 年 3 月起,金士顿提供了固件更新 9。由于金士顿仅支持 Windows,因此可以通过 heise.degithub 找到 Linux 下载。预计只要内核解决方法到位,固件更新就不会有太大作用,因为无论如何都无法达到最深的节能状态。

# smartctl -c /dev/nvme0
Supported Power States
St Op     Max   Active     Idle   RL RT WL WT  Ent_Lat  Ex_Lat
 0 +     9.00W       -        -    0  0  0  0        0       0
 1 +     4.60W       -        -    1  1  1  1        0       0
 2 +     3.80W       -        -    2  2  2  2        0       0
 3 -   0.0450W       -        -    3  3  3  3     2000    2000
 4 -   0.0040W       -        -    4  4  4  4    15000   15000

传递的值是最大退出延迟 (Ex_Lat)。例如,要禁用 PS4,请设置 nvme_core.default_ps_max_latency_us=2000

由于挂起支持损坏导致的控制器故障

一些用户(例如,请参阅 Laptop/HP)报告某些 NVMe 驱动器出现挂起故障。与上述情况一样,故障会导致设备无法操作,直到系统重置,并显示内核消息

nvme nvme0: Device not ready; aborting reset, CSTS=0x3
nvme nvme0: Removing after probe failure status: -19

作为一种解决方法,添加 内核参数 iommu=soft 以使用硬件 IOMMU 的软件替代品。(有关更多详细信息,请参阅 此文档。)这可能会导致一些轻微的处理开销。

本文或章节的事实准确性存在争议。

原因: 以下解决方案既没有解释其工作原理,也没有提供来源。 (在 Talk:Solid state drive/NVMe 中讨论)

您还可以尝试在配备 AMD CPU 和 KIOXIA KBG40ZN* nvme 的 HP 笔记本电脑上使用内核参数 amd_iommu=off 或更好的 amd_iommu=fullflush,在您收到如下 I/O 错误消息后

Failed to rotate /var/log/journal/*/system.journal: Read-only file system
nvme nvme0: Device not ready; aborting reset, CSTS=0x3
BTRFS error (device nvme0n1): bdev /dev/nvme0n1p* errs: wr 2, rd 0, flush 0, corrupt 0, gen 0

参见