寻找 smartctl NVMe 日志错误解释 (0xa013 0x8004 和 0x9016 0x8004)

寻找 smartctl NVMe 日志错误解释 (0xa013 0x8004 和 0x9016 0x8004)

对于我的 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 r5338nvme-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";

按照上面的代码,如果status0x8004,那么变量 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 上不同问题/答案的更完整解释和代码,请参见此处:

无法识别我的 NVMe 磁盘的 SMART 错误/问题

相关内容