跳转至内容

固态硬盘/NVMe

来自 ArchWiki
(重定向自 NVM Express)

本文档或章节候选移动至 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 驱动器

固件更新

警告 设备节点分配(例如 /dev/nvme0/dev/nvme1)是任意的。如果您的系统有多个具有相同命名方案的驱动器,请仔细检查您是否正在对正确的驱动器执行固件升级。

通用

可以使用 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)。有关固件提交 *action* 值的信息,请参考 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

Intel/Solidigm

在 Intel SSD 业务被 SK Hynix 收购后[2][3],其“Memory and Storage Tool”(Intel MAS)不再支持 SSD,现在只能用于管理 Optane 设备。[4]

Solidigm,这是从 Intel SSD 业务收购中形成的美国子公司,提供了一个新的实用程序来管理以前的 Intel SSD:“The Solidigm Storage Tool,也称为 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

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

Kingston

Kingston 不在其网站上提供独立的固件下载,而是将用户引导至一个仅限 Windows 的实用程序。固件文件似乎基于固件修订版使用可预测的命名方案

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

然后按照 通用刷写说明继续。

Samsung

使用 Samsung Magician 软件
注意 这是更新 Samsung 设备固件的官方推荐方式。

除了 Windows 用户使用的“Samsung Magician Software”之外,Samsung 还提供可启动 ISO 映像格式的 SSD 固件

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

您可以选择使用 nvme-cli,而不是制造商的程序。

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

截至 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 密钥。该密钥可以从 fumagician 实用程序中提取,运行 [8]

$ 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

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

Western Digital

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

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

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

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

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

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

SN850X 驱动器的完整 URL 示例

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

获取 .fluf 文件后,可以使用 通用刷写说明进行更新。请注意,此方法未得到 Western Digital 的官方支持,可能无法正常工作,并可能损坏您的设备。请格外注意您正在更新正确的驱动器和固件版本。

性能

扇区大小

请参阅 高级格式#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”(自主功耗状态转换启用(APSTE):已启用),并且下表应有非零条目,指示进入每个可用状态之前的空闲时间。

如果 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 且驱动器处于非运行功耗状态时,驱动器可以超出当前功耗状态声明的功率限制(但不能超出最低运行功耗状态的限制)来执行后台处理,例如垃圾回收或刷新旧数据。当禁用 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) 相关的问题。这是 Kingston A2000 [12](固件 *S5Z42105*)的一个已知问题,之前也曾出现在 Samsung NVMe 驱动器(Linux v4.10)上[13][14]。一些 WesternDigital/Sandisk 设备[15] 和 SK Hynix 设备[16] 也报告了此问题。

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

 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(如 [17] 所建议)。您可能还需要在 BIOS 中禁用 NVMe 和 PCIe 的省电措施。

本文或本章节已过时。

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

自 2021 年 3 月起,Kingston 提供了固件更新9。由于 Kingston 只支持 Windows,Linux 的下载可以在 heise.degithub 上找到。预计,只要内核变通方法仍然有效,固件更新将不会有太大作用,因为最深的省电状态根本无法达到。

# 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 的软件替代品。(有关更多详细信息,请参阅 此文档[已死链接 2025-03-15—HTTP 404]。)这可能会导致轻微的处理开销。

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

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

对于带有 AMD CPU 和 KIOXIA KBG40ZN* NVMe 的 HP 笔记本电脑,在出现类似以下的 I/O 错误消息后,您也可以尝试内核参数 amd_iommu=off 或更好的 amd_iommu=fullflush

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

参见