声明
依公开知识及经验整理,如有误请留言。
个人辛苦整理,禁止转载。
内容摘要
全文4200字, 主要内容有
前言
我的笔记本电脑有一个 NVMe 驱动器, 它们的速度很快。我喜欢。
这很有趣,但我想知道更多关于我的特定 NVMe 驱动器的内部信息
出于好奇,元带你体验下 NVMe 透视工具 nvme-cli。
1 探究NVMe Cli
1.1 什么是 Nvme Cli
nvme-cli 是一个开源项目,其中有一系列管理 NVMe 驱动器的工具。Nvme-cli大部分代码就是拼命令字段然后通过ioctl发给内核,可以github下载源码看下具体实现。(nvme也可以用smartctl获取log)
1.2 安装 nvme-cli
源码下载地址
https://github.com/linux-nvme/nvme-cli
你可以从你的发行版的包管理器中直接安装 nvme-cli
。例如,:
-
$ sudo apt install nvme-cli
1.3 NVMe Cli 帮助菜单
nvme-cli
没有手册页,但可以输入 nvme help
获得很多帮助:
注: 不同 nvme cli 版本功能不同, 以你使用的电脑版本为准,当然你也可安装最新的 nvme cli
2 NVMe 常用命令和实践
2.1 列出所有的 NVMe 驱动器
$ sudo nvme list
Node SN Model Namespace Usage Format FW Rev
--------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1 S42GMY9M1412819 SAMSUNG MZVLB256HAHQ-000L7 1
214.68 GB / 256.06 GB 512 B + 0 B 0L2QEXD7
有一个名为 nvme0n1
的驱动器。它列出了序列号(S42GMY9M1412819 )、品牌(SAMSUNG )、命名空间(MZVLB256HAHQ-000L7)、容量(256GB)、格式(512B) 固件版本(0L2QEXD7)等等。
通过使用 id-ctrl
子命令,你可以得到更多关于该硬盘和它所支持的特性的信息:
$ sudo nvme id-ctrl /dev/nvme0n1
NVME Identify Controller:
vid : 0x144d
ssvid : 0x144d
sn : S42GMY9M141281
mn : SAMSUNG MZVLB256HAHQ-000L7 -- 品牌、命名空间
fr : 0L2QEXD7 -- 固件版本
rab : 2
ieee : 002538
cmic : 0
mdts : 9
cntlid : 0x4
ver : 0x10200
rtd3r : 0x186a0
rtd3e : 0x7a1200
[...]
2.2 格式化一个 NVMe 驱动器
可以用 nvme-cli
格式化一个 NVMe 驱动器,但要注意。这将删除驱动器上的所有数据!如果你的硬盘上有重要的数据,你必须在这样做之前将其备份,否则你将会丢失数据。子命令是 format
:
$ sudo nvme format /dev/nvme0nX
(为了安全起见,我用 X
替换了驱动器的实际位置,以防止复制粘贴的错误。将 X
改为 1
或 nvme list
结果中列出的实际位置。)
常用方式
1)nvme format -s 1 /dev/nvme1n1 格式化硬盘(secure erase drives)
2)nvme format /dev/nvme1n1 -n 1 -l 1 4KB对齐
3)nvme format /dev/nvme1n1 -n 1 -l 0 恢复初始状态512
4)nvme format /dev/nvme1n1 -l 0 Optane device Units512
看实际需要, 建议 4KB 对齐
参考 [NVMe CLI 命令使用_nvme-cli_乾 乾]
2.3 安全地擦除 NVMe 驱动器
当你准备出售或处理你的 NVMe 电脑时,你可能想安全地擦除驱动器。这里的警告与格式化过程中的警告相同。首先要备份重要的数据,因为这个命令会删除这些数据!
$ sudo nvme sanitize /dev/nvme0nX
此部分转载自(有删改)
技术|使用 Linux 命令行工具来了解你的 NVMe 驱动器
via: Use this Linux command-line tool to learn more about your NVMe drives | Opensource.com
作者:Don Watkins 选题:lujun9972 译者:geekpi 校对:turbokernel
2.4 NVMe SMART健康信息
可以通过 smart-log
子命令来了解硬盘的整体健康状况 (中文笔者注):
$ sudo nvme smart-log /dev/nvme0n1
Smart Log for NVME device:nvme0n1 namespace-id:ffffffff
critical_warning : 0 -- 警告
temperature : 21 C -- 当前温度
available_spare : 100% -- 剩余可用备用空间
available_spare_threshold : 10% -- 当可用备用空间低于该阈值时就会发出预警
percentage_used : 2% -- 已使用寿命百分比
endurance group critical warning summary: 0
data_units_read : 5,749,452 -- 读操作数据量
data_units_written : 10,602,948 -- 写操作数据量
host_read_commands : 77,809,121 -- 主机发送读命令个数
host_write_commands : 153,405,213-- 主机发送写命令个数
controller_busy_time : 756 -- 控制器忙次数统计
power_cycles : 1,719 -- (断电/上电)次数
power_on_hours : 1,311 -- 累计带电工作时间
unsafe_shutdowns : 129 -- 非安全断电次数
media_errors : 0 -- 闪存和数据完整性错误
num_err_log_entries : 1,243 -- err log 次数
Warning Temperature Time : 0 -- 过热警告时间
Critical Composite Temperature Time : 0 --过热临界温度时间
Temperature Sensor 1 : 21 C -- 温度传感器 1 温度
Temperature Sensor 2 : 22 C -- 温度传感器 2 温度
Thermal Management T1 Trans Count : 0
Thermal Management T2 Trans Count : 0
Thermal Management T1 Total Time : 0
Thermal Management T2 Total Time : 0
endurance group critical warning summary
这一项需要观察“原始值”一列的数据,正常情况下应为0。如果显示为1代表当前硬盘处于过热状态;显示为2代表闪存出现严重错误导致可靠性降级,该考虑更换了;显示为3代表闪存已经进入只读状态(寿命用尽,锁盘以保护用户数据)。还有一种状态4是只有企业级固态硬盘才具备的,代表增强型断电保护功能失效(通常是因为电池/电容故障)
Available Spare可用备用空间
这一项显示的是当前可用于替换坏块的闪存备用块占出厂时总数的百分比,是一项非常重要的健康度指标。配备东芝BiCS闪存的NVMe固态硬盘可以在使用很久后依然保持100%的状态。
Data Units Read读取扇区计数
该项数值乘以1000后即为读取的扇区(1扇区=512字节)数量统计。
Data Units Write写入扇区计数
该项数值乘以1000后即为写入的扇区(1扇区=512字节)数量统计。
Controller Busy Time主控繁忙时间计数
该项统计的是主控忙于处理IO命令的时间总和(单位:分钟)。当IO队列有未完成的命令时,主控即处于“忙”的状态。
Unsafe Shut downs不安全关机次数(异常断电计数)
非正常断电是威胁固态硬盘的大敌,我们应该尽可能地避免强制关机。每一次非正常断电就是消耗固态硬盘的一次使用寿命。
Media and Data Integrity Errors闪存和数据完整性错误
主控检测到未恢复的数据完整性错误的次数。当有纠错引擎无法校正的ECC、CRC校验失败或者LBA标签不匹配错误发生时,该数值会增加。这一项数值如果不为零,代表固态硬盘工作已经不稳定。
NVMe固态硬盘的SMART健康信息已非常全面了,但美中不足的是遗漏了一项接口速率, SSD 在使用中, 如果主板的PCIE 接口比较老, 或者因为插拔松动,会向低速兼容。可能PCIE 4.0 的 SSD 实际跑在 PCIE 3.0 的速度, 或是 PCIE 2.0 的速度。或者 4 通道因为接口松动只认到了 2 通道,也可能导致降速。
此部分转载自(有删改)
2.5 NVME 固件设备升级
固件是芯片里的软件程序, 也会存在bug, 当发现缺陷并修复后, 供应商会提供新的固件版本,修复已知问题。跟进固件的更新能够避免触发已知缺陷, 稳定性提升的补丁包及时得到更新。当然,固件升级的频率也不会很高,一般一年不会超过5次, 量产时间越长越稳定。升级前可以和供应商核对固件升级的版本信息。
确认固件版本
nvme id-ctrl /dev/nvme0 |grep "fr "
下载固件并应用起来
nvme fw-download /dev/nvme0 -
nvme fw-commit /dev/nvme0 -a 0
这里注意下commit 过程中 -a 指定的action 模式有种,表示不同的含义
0 : 下载的固件镜像替换原有的固件镜像,但并不会激活。即不会让这个镜像运行起来
1:下载的固件镜像替换原有的固件镜像,会在NVME reset之后运行起来。(发生了热插拔,断电,上电也会运行)
2:由固件插槽指定的镜像会在下次重置之后激活
3: 获取到的固件镜像会被立即激活而不需要重置
下载好的固件,加入需要重置的话可以执行如下命令:
nvme reset /dev/nvme0
————————————————
此部分转载自(有删改)
版权声明:本文为CSDN博主「z_stand」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Z_Stand/article/details/111415236
2.6 OP(Over-Provisioning)
nvme admin-passthru /dev/nvme0 -o 0x9 --cdw10=0xc1 --cdw11=0x2000000 --cdw12=0x0
OP to GB
1.The decimal value of LBA is (X * 1000 * 1000 * 1000 / 512), then convert it to Hex Value.
2. Put the Hex Value to cdw11
3. If the Hex Value over 0xFFFFFFFF, put the high overflow digits to cdw 12.
4. Example:
⦁ 3200 GB
⦁ Decimal value is 6,250,000,000 and Hex Value is 0x174876E80
The value for cdw12 should be 0x1 and for cdw11 is 0x74876E80.
⦁ 2000 GB
⦁ Decimal value is 3,906,250,000 and Hex Value is 0xE8D4A510
The value for cdw12 should be 0x0 and for cdw11 is 0xE8D4A510.
⦁ 4000 GB
⦁ 7,814,037,168 // 0x1 D1C0 BEB0
⦁ 7200 GB - 0x3 4630 B8A0
6400 GB - 0x2 E90E DD00
例一:
二、
原容量OPed到3.4T
[root@localhost nvme-cli-master]# nvme admin-passthru /dev/nvme9n1 -o 0x9 --cdw10=0xc1 --cdw11=0x18BCFE568 --cdw12=0x1
NVMe command result:00000000
2.7 nvme-cli 创建namespaces
什么是Namespace?
简单地说,namespace是对用户空间的逻辑划分,就是把用户空间这块大披萨划分开,大家各吃各的。那么大披萨长什么样呢?划成一片片儿披萨又什么样呢?我们知道,跟其他传统的存储设备一样,非易失性存储器也是可以格式化为逻辑块的,每个逻辑块都有自己的地址,俗称logical block address,简称LBA,我们就是通过LBA来吃披萨(读写IO)的。逻辑地址长相很普通,是从0,1,2….直到最大块地址。
逻辑块地址计算是有讲究的,严格依据JEDEC218A里面定义的逻辑块与容量关系公式。比如4KiB一个逻辑块的话, 500G就需要2646 + 244188 * 500 = 122096646个逻辑地址了,这些逻辑块就组成了namespace(512B一块逻辑块的话,500G就需要21168+1953504*500=976773168个逻辑地址)。那么一块SSD是否可以划分为多个namespace来供不同的应用场景使用呢?答案是肯定的。
例如:创建一个500G和一个465G的namaspaces
检查SSD上剩余空间是否足够创建目标namespace。使用Identify命令查看unvmcap的值可知剩余可分配容量,单位是Byte。
#进行以下步骤前请务必确保自己的SSD支持NS
#一般大厂才会有进行NS的需求,请和你的厂商确保SSD支持。
#个人的盘不建议尝试进行NS操作
1.detach
nvme detach-ns /dev/nvme0 -n 1 -c 0
nvme delete-ns /dev/nvme0 -n 1
nvme reset /dev/nvme0
2.创建
**#1953125000 = 1,000,000,000,000/512 = 1,953,125,000 (1TB)**
nvme create-ns /dev/nvme0 -s 976562500 -c 976562500 -f 0 -d 0 -m 0
nvme attach-ns /dev/nvme0 -n 1 -c 0
nvme create-ns /dev/nvme0 -s 975175680 -c 975175680 -f 0 -d 0 -m 0 #第二个创建的必须
nvme attach-ns /dev/nvme0 -n 2 -c 0
nvme reset /dev/nvme0
nvme list
[root@localhost Muti-namespace_Test]# nvme list
Node SN Model Namespace Usage Format FW Rev
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1 XXXXXX XXXXX 1 500.36 GB / 500.36 GB 512 B + 0 B ss10152
/dev/nvme0n2 XXXXXX XXXXX 2 499.29 GB / 499.29 GB 512 B + 0 B ss10152
3,删除
nvme detach-ns /dev/nvme0 -n 1 -c 0
nvme detach-ns /dev/nvme0 -n 2 -c 0
nvme delete-ns /dev/nvme0 -n 1
nvme delete-ns /dev/nvme0 -n 2
4.恢复
nvme create-ns /dev/nvme0 -s 1000204886016 -c 1000204886016 -f 0 -d 0 -m 0 #1000204886016是通过“nvme id-ctrl /dev/nvme0n1 | grep tnvmcap”抓取并除以512
nvme attach-ns /dev/nvme0 -n 1 -c 0
nvme reset /dev/nvme0
2.8 PCIe硬盘寿命计算
可以通过nvme-cli读取PCIe硬盘smart信息,进行进行计算硬盘的Endurance、DWPD(Drive Writes Per Day)。
建议寿命测试仅企业级可能有必要,个人没必要进行此项操作。
a.测试前读取硬盘smart-log信息
[root@localhost nvme-cli-master]# nvme intel smart-log-add /dev/nvme0n1
Additional Smart Log for NVME device:nvme0n1 namespace-id:ffffffff
key normalized raw
program_fail_count : 0% 0
erase_fail_count : 0% 0
wear_leveling : 0% min: 0, max: 0, avg: 0
end_to_end_error_detection_count: 100% 159
crc_error_count : 100% 25963
timed_workload_media_wear : 100% 0.000%
timed_workload_host_reads : 100% 8%
timed_workload_timer : 100% 120864 min
thermal_throttle_status : 100% 0%, cnt: 1
retry_buffer_overflow_count : 100% 0
pll_lock_loss_count : 100% 0
nand_bytes_written : 0% sectors: 0
host_bytes_written : 100% sectors: 26008485
b.fio进行读写一定的数据
c.fio结束后再次执行nvme intel smart-log-add /dev/nvme0n1读取smart-log信息
d.计算
盘进入稳态(消耗完SLC buffer, 速度降低的时候)后进行随机写得到DWPD的值更为准确
DWPD: Drive Wriytes Per Dat, 即在SSD保质期内, 每户每天可以把盘写满多少次
WAF: Write Amplication factor, 即写入放大率
PE Cycle: 写满一次Program(P) 再Erase(E) 一次, 算一个PE. 所以 PE Cycle 指的是擦除次数
————————————————
版权声明:本部分为CSDN博主「乾 乾」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hailangdeyingzi/article/details/121039000
参考
[1] 技术|使用 Linux 命令行工具来了解你的 NVMe 驱动器
[2] 固态硬盘状态信息全是英文看不懂?存储极客来教你_腾讯新闻
免责声明:
本文根据公开信息整理,旨在介绍更多的存储知识,所载文章仅为作者观点,不构成投资或商用建议。本文仅用于学习交流, 不允许商用。若有疑问或有侵权行为请联系作者处理。