固态硬盘/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。NVMe 支持已添加到 smartmontools 6.5 版本中。
当前实现的功能(取自 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
最后重置控制器以加载新固件
# 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 软件
除了 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,而不是制造商的程序。
截至 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 密钥。该密钥可以从 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
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”(自主功耗状态转换启用(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 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] 和 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=off 和 pcie_port_pm=off(如 [17] 所建议)。您可能还需要在 BIOS 中禁用 NVMe 和 PCIe 的省电措施。
自 2021 年 3 月起,Kingston 提供了固件更新9。由于 Kingston 只支持 Windows,Linux 的下载可以在 heise.de 或 github 上找到。预计,只要内核变通方法仍然有效,固件更新将不会有太大作用,因为最深的省电状态根本无法达到。
# 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]。)这可能会导致轻微的处理开销。
对于带有 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