固态硬盘/NVMe
NVM Express (NVMe) 是一种规范,用于通过 PCI Express 总线访问连接的 SSD。 作为一种逻辑设备接口,NVM Express 从头开始设计,充分利用了 PCI Express SSD 的低延迟和并行性,并镜像了当代 CPU、平台和应用程序的并行性。
安装
NVMe 设备应显示为 /dev/nvme*
。 有关其命名的解释,请参阅 设备文件#NVMe。
额外的用户空间 NVMe 工具可以在 nvme-cli 或 nvme-cli-gitAUR 中找到。
有关支持的文件系统、最大化性能、最小化磁盘读取/写入等,请参阅 固态硬盘。
管理
列出所有已连接的 NVMe SSD,包括名称、序列号、大小、LBA 格式和序列号
# nvme list
以用户友好的方式列出有关驱动器的信息及其支持的功能
# nvme id-ctrl -H /dev/nvme0
列出有关命名空间及其支持的功能的信息
# nvme id-ns /dev/nvme0n1
输出 NVMe 错误日志页
# nvme error-log /dev/nvme0
删除命名空间
# nvme delete-ns /dev/nvme0n1
创建一个新的命名空间,例如创建一个较小尺寸的命名空间来过度配置 SSD,以提高耐用性、性能和延迟
# nvme create-ns /dev/nvme0
有关所有命令及其简洁描述的列表,请参阅 nvme help
和 nvme(1)。
SMART
输出 NVMe SMART 日志页,以获取健康状态、温度、耐用性等信息
# nvme smart-log /dev/nvme0
-H
选项可以输出更多信息,例如 nvme smart-log -H /dev/nvme0
。smartmontools 在 6.5 版本中添加了 NVMe 支持。
当前已实现的功能(取自 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。
截至 2025 年 1 月,ISO 上的固件文件已通过隐藏在 fumagician
二进制文件中的 AES 密钥加密 [6][7]。 您将在其旁边找到两个加密文件
$ ls -1 root/fumagician/*.enc
root/fumagician/2B2QKXG7.enc root/fumagician/DSRD.enc
实际的固件文件是
- 通过 AES 密钥加密,
- 然后将其插入到 ZIP 文件中,
- 并且 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
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-cli 或 nvme-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 Supported
或 Supported
。 要更改设置,请使用 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=off
和 pcie_port_pm=off
(如 [16] 建议)。
自 2021 年 3 月起,Kingston 发布了固件更新 9。 由于 Kingston 仅支持 Windows,因此可以通过 heise.de 或 github 找到适用于 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 的软件替代品。 (有关更多详细信息,请参阅 本文档。) 这可能会导致一些轻微的处理开销。
在配备 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