固态硬盘/NVMe

来自 ArchWiki
(重定向自 NVMe)

此文章或章节是移动到 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

smartmontools 在 6.5 版本中添加了 NVMe 支持。

注意: 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

Intel/Solidigm

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

Solidigm 是由 Intel 的 SSD 业务收购案成立的美国子公司,它提供了一个新的实用程序来管理以前的 Intel SSD:“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

除了面向 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

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

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”,并且下表应包含非零条目,指示转换到每个可用状态之前的空闲时间。

如果启用了 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) 相关的问题。 这是 Kingston A2000 [12] 固件 S5Z42105 的已知问题,并且以前在 Samsung 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 月起,Kingston 发布了固件更新 9。 由于 Kingston 仅支持 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

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

一些用户(例如,请参阅 笔记本电脑/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 笔记本电脑上,在收到如下 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

参见