对于我的 1TB NVMe,smartctl -a /dev/nvme0n1
首先报告了以下情况:
Error Information (NVMe Log 0x01, 16 of 256 entries)
Num ErrCount SQId CmdId Status PELoc LBA NSID VS
0 129 0 0xa013 0x8004 0x000 0 0 -
然后我进行了长时间的自检,现在错误信息已变为:
Error Information (NVMe Log 0x01, 16 of 256 entries)
Num ErrCount SQId CmdId Status PELoc LBA NSID VS
0 130 0 0x9016 0x8004 0x000 0 0 -
不知道这一切意味着什么,也不知道它是否有效,因为nvme self-test-log /dev/nvme0
看起来不错:
Device Self Test Log for NVME device:nvme0
Current operation : 0
Current Completion : 0%
Self Test Result[0]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x16
Vendor Specific : 0 0
Self Test Result[1]:
Operation Result : 0
Self Test Code : 2
Valid Diagnostic Information : 0
Power on hours (POH) : 0x16
Vendor Specific : 0 0
Self Test Result[2]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x8
Vendor Specific : 0 0
Self Test Result[3]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x7
Vendor Specific : 0 0
Self Test Result[4]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x7
Vendor Specific : 0 0
Self Test Result[5]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x6
Vendor Specific : 0 0
Self Test Result[6]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x5
Vendor Specific : 0 0
Self Test Result[7]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x5
Vendor Specific : 0 0
Self Test Result[8]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x4
Vendor Specific : 0 0
Self Test Result[9]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x3
Vendor Specific : 0 0
Self Test Result[10]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x3
Vendor Specific : 0 0
Self Test Result[11]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x2
Vendor Specific : 0 0
Self Test Result[12]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x1
Vendor Specific : 0 0
Self Test Result[13]:
Operation Result : 0
Self Test Code : 1
Valid Diagnostic Information : 0
Power on hours (POH) : 0x1
Vendor Specific : 0 0
Self Test Result[14]:
Operation Result : 0xf
Self Test Result[15]:
Operation Result : 0xf
Self Test Result[16]:
Operation Result : 0xf
Self Test Result[17]:
Operation Result : 0xf
Self Test Result[18]:
Operation Result : 0xf
Self Test Result[19]:
Operation Result : 0xf
这里有 NVMe/SMART 专业人士吗?Google 有死的 沉默的(只有两个结果,没有任何解释)。
使用smartctl 7.3 2022-02-28 r5338
和nvme-2.4
。
答案1
我还没有完全弄清楚这一点,很难找到信息,也很难解释信息(至少对于我有限的大脑而言),但让我们从这个开始:
Error Information (NVMe Log 0x01, 16 of 256 entries)
Num ErrCount SQId CmdId Status PELoc LBA NSID VS
0 129 0 0xa013 0x8004 0x000 0 0 -
我现在对状态代码很感兴趣。我发现了这个: https://github.com/linux-nvme/nvme-cli/issues/800我正在看“birkelund”(NVMe 软件工程师)的回答,有人询问状态代码 0xc502,他解释说你可以这样解码:
如果您要问该错误代码是如何在 0xC502 中编码的,那么它的 0xC502 >> 1 可以去掉阶段标记。这样我们就得到了 0x6281。然后应用掩码 0x7ff 来提取较低的 11 个字节(3 个用于状态代码类型,8 个用于状态代码),最后得到 0x281。0x2xx 是“媒体和数据完整性错误”,0x81 状态代码是“未恢复的读取错误”。
用更通俗的语言来说,位移位就是除以 2(0xC502 / 2 = 0x6281)。应用掩码 0x7ff 可得到 3 个右侧半字节(0x6281 -> 0x281)。我认为这会使解码变得稍微容易一些。
为了了解他如何获取状态代码类型和状态代码,我做了更多研究:
查找代码类型:
NVME_SCT_GENERIC = 0x0,
NVME_SCT_COMMAND_SPECIFIC = 0x1,
NVME_SCT_MEDIA_ERROR = 0x2,
/* 0x3-0x6 - reserved */
NVME_SCT_VENDOR_SPECIFIC = 0x7,
查找“媒体和数据完整性错误”:
NVME_SC_WRITE_FAULTS = 0x80,
NVME_SC_UNRECOVERED_READ_ERROR = 0x81,
NVME_SC_GUARD_CHECK_ERROR = 0x82,
NVME_SC_APPLICATION_TAG_CHECK_ERROR = 0x83,
NVME_SC_REFERENCE_TAG_CHECK_ERROR = 0x84,
NVME_SC_COMPARE_FAILURE = 0x85,
NVME_SC_ACCESS_DENIED = 0x86,
现在我们可以看到他得到了什么:
0x2xx 表示“媒体和数据完整性错误”,0x81 状态代码表示“未恢复的读取错误”
如果我将相同的逻辑/方法应用于状态 0x8004,我会得到类似的结果:
右移:将值 0x8004 右移一位(0x8004 >> 1),得到 0x4002。然后进行掩码:应用掩码 0x7ff 提取值 0x4002 的低 11 位,得到 0x002。
因此 0 让我们获得 NVME_SCT_GENERIC 状态代码类型(参见上表)和通用状态代码查找:
NVME_SC_SUCCESS = 0x00,
NVME_SC_INVALID_OPCODE = 0x01,
NVME_SC_INVALID_FIELD = 0x02,
NVME_SC_COMMAND_ID_CONFLICT = 0x03,
NVME_SC_DATA_TRANSFER_ERROR = 0x04,
NVME_SC_ABORTED_POWER_LOSS = 0x05,
NVME_SC_INTERNAL_DEVICE_ERROR = 0x06,
NVME_SC_ABORTED_BY_REQUEST = 0x07,
NVME_SC_ABORTED_SQ_DELETION = 0x08,
NVME_SC_ABORTED_FAILED_FUSED = 0x09,
NVME_SC_ABORTED_MISSING_FUSED = 0x0a,
NVME_SC_INVALID_NAMESPACE_OR_FORMAT = 0x0b,
NVME_SC_COMMAND_SEQUENCE_ERROR = 0x0c,
NVME_SC_LBA_OUT_OF_RANGE = 0x80,
NVME_SC_CAPACITY_EXCEEDED = 0x81,
NVME_SC_NAMESPACE_NOT_READY = 0x82,
因此,现在我们有类型错误 0 (NVME_SCT_GENERIC = 0x0) 和状态错误 02 (NVME_SC_INVALID_FIELD = 0x02)。我不知道这意味着什么,但对我来说,这听起来不像是你的 NVMe 驱动器本身的问题。如果 SMART 是“干净的”,我想你不必太担心。
为了寻找进一步的解释,我发现:
NVME_SC_INVALID_FIELD - 命令中的无效字段:定义字段中的保留编码值或不受支持的值。
另外,据我所知,CmdId(在本例中为 0xa013)是不是实际命令,但包含实际命令和参数的“结构”或数据包的 ID,您可以将其传递给队列。因此,CmdId 0xa013 本身并没有告诉我们主机发送给驱动器的实际命令。
免责声明:数学、位移位等等都不是我的强项,所以我可能在计算器中犯了错误、打字错误或其他什么,你应该在依赖它之前检查一下。
答案2
我认为所有 SMART 属性都是健康的。如果您怀疑它们不健康,请将其屏幕截图添加到您的帖子中。
我主要想了解0x8004
您收到的状态代码。我在文件中找到了此代码
nvmecmds.cpp
这是 smartmontools 包的一部分,位于第 294 行:
// Return flagged error message for NVMe status SCT/SC fields or nullptr if unknown.
// If message starts with '-', the status indicates an invalid command (EINVAL).
static const char * nvme_status_to_flagged_str(uint16_t status)
{
// Section 3.3.3.2.1 of NVM Express Base Specification Revision 2.0c, October 4, 2022
uint8_t sc = (uint8_t)status;
switch ((status >> 8) & 0x7) {
case 0x0: // Generic Command Status
if (sc < 0x80) switch (sc) {
case 0x00: return "Successful Completion";
case 0x01: return "-Invalid Command Opcode";
case 0x02: return "-Invalid Field in Command";
case 0x03: return "Command ID Conflict";
case 0x04: return "Data Transfer Error";
按照上面的代码,如果status
是0x8004
,那么变量
sc
包含低 8 位,即4
。当我们执行表达式时switch
,我们需要丢弃低 8 位并取接下来的 3 位,得到结果0
。按照switch
的情况0x0
,由于sc
小于0x80
(为 4),因此我们的结果状态为0x04
“数据传输错误“。
我不能说这个错误是否严重。只有检查 SMART 属性才能了解该磁盘的健康状况。
答案3
我已经下载了Micron SMART 实用程序对于这个名为 msecli 的 NVMe 设备,它说 NVMe 日志是不是支持的。
这可能意味着 smartctl 正在尝试读取不存在的内容并将其报告为虚假错误。我必须给公司发电子邮件,了解到底发生了什么。
编辑:我联系了 Micron,他们告诉我,由于该驱动器是 OEM 品牌,因此他们无法为其提供支持。他们没有回答任何问题。
Smartctl 7.4 现在显示Self-test Log (NVMe Log 0x06)
并且没有错误,但是其他日志仍然包含错误:
Error Information (NVMe Log 0x01, 16 of 256 entries)
Num ErrCount SQId CmdId Status PELoc LBA NSID VS Message
0 143 0 0x001c 0x8004 0x000 0 0 - Invalid Field in Command
考虑到它总是在变化,也许这个错误是假的。
也许有人会更幸运地与 Micron 打交道,然后我们就会找出这些错误的原因。
答案4
有关 superuser dot com 上不同问题/答案的更完整解释和代码,请参见此处: