数据损坏和磁盘错误问题排查指南

数据损坏和磁盘错误涵盖不同的领域,例如访问驱动器、驱动器损坏和性能缓慢的问题。

以下事件 ID 指示存在数据损坏或磁盘错误:

  • 事件 ID 153

    重试了磁盘 2 的逻辑块地址123456的 IO 操作。

  • 事件 ID 129

    已颁发到设备 \Device\RaidPort1。

  • 事件 ID 157

    磁盘 2 已意外删除。

  • 事件 ID 55

    磁盘上的文件系统结构已损坏且不可用。 请在卷上运行 chkdsk 实用工具。

  • 事件 ID 98

    卷 C:(\Device\HarddiskVolume3)需要脱机执行完整 Chkdsk。 请通过命令行在本地运行“CHKDSK /F”,或通过 PowerShell 在本地或远程运行“REPAIR-VOLUME <驱动器:>”。

故障排除清单

注意

本文介绍需要在提升的命令提示符下运行的命令。

  • 在系统事件日志中,搜索 New Technology File System (NTFS) 和与磁盘相关的警告和错误。 例如,事件 ID 55、153 或 98。

  • 运行 chkdsk /scan 命令并查看结果。

    注意

    chkdsk /scan 命令是只读的。

  • 运行以下命令,查询驱动器,以获取特定于 NTFS 的卷信息:

    fsutil fsinfo ntfsinfo <rootpath>:

    注意

    占位符 <根路径> 表示根驱动器的驱动器号。

  • 运行 fsutil dirty query <volumepath>: 命令以检查卷是否脏了。

    注意

    占位符 <volumepath> 表示驱动器号。

    • 对于文件系统为 NTFS 的卷,如果卷脏了,请运行 chkdsk /f /r 命令。 chkdsk /F /R 命令需要停机,因为无法访问磁盘。

    • 对于文件系统为复原文件系统 (ReFS) 的卷,磁盘损坏将自动修复。

  • 如果“chkdsk”实用工具无法修复磁盘错误,请从备份执行还原。

  • 运行存储验证,以检查是否收到任何与存储相关的错误。

  • 从群集中移除磁盘,并在操作系统级别进行检查。

  • 在记录了事件的所有卷上运行 chkdsk /f 命令。

  • 更新第三方存储驱动程序或固件。

如果问题仍然存在,请尝试以下办法:

  • 卸载任何第三方磁盘管理软件(例如 Diskeeper)。

  • 删除或更新筛选驱动程序。

  • 联系硬件供应商并运行硬件诊断,以免发生任何硬件问题。

  • 与存储供应商联系以检查多路径配置。

  • 更新 SCSI 端口或 RAID 控制器驱动程序。

  • 换用不同类型的驱动程序。 例如,RAID 控制器驱动程序或单片驱动程序。

  • 更新主机 Bud 适配器 (HBA) 驱动程序。

  • 更新设备特定模块 (DSM) 的多路径驱动程序。

  • 更新 HBA 固件。

事件 ID 153 疑难解答

事件 ID 153 表明存储子系统出错。 事件 ID 153 类似于事件 ID 129,但不同之处在于,当 Storport 驱动程序使对磁盘的请求超时时,会记录事件 ID 129;当 Storport 微型端口驱动程序使请求超时时,会记录事件 ID 153。 微型端口驱动程序也可以称为适配器驱动程序或 HBA 驱动程序,通常由硬件供应商编写。

如果记录事件 ID 153 或事件 ID 129,磁盘 I/O 超时是常见的原因,因为存储控制器无法处理负载。 在这种情况下,I/O 操作超时,微型端口驱动程序(来自供应商)将消息发回 Storport 驱动程序(堆栈中的最后一个Microsoft存储驱动程序)。 然后,Storport 驱动程序转换信息并在事件查看器中记录事件。

由于微型端口驱动程序对请求执行环境有足够的了解,因此某些微型端口驱动程序会自行安排请求的时间,而不是让 Storport 驱动程序处理请求计时。 微型端口驱动程序可以中止单个请求并返回错误,而 Storport 驱动程序在超时后重置驱动器。 重置驱动器对 I/O 子系统造成干扰,如果只有一个请求超时,可能不需要。微型端口驱动程序将错误返回到记录事件 ID 153 并重试请求的类驱动程序。

下面是事件 ID 153 的示例:

Log Name: System
Source: disk
Event ID: 153
Level: Warning
Description: The IO operation at logical block address 123456 for Disk 2 was retried.

此事件指示请求失败,并已由类驱动程序重试。 在这种情况下,没有记录任何错误消息,因为 Storport 驱动程序没有超时请求。 在排查磁盘错误时,缺少消息会导致混淆,因为没有错误的证据。

在事件日志的“详细信息”选项卡上,详细信息显示导致重试的错误以及请求是读取还是写入请求。 例如:

0000: 0004010F 002C0003 00000000 80040099
0010: 00000000 00000000 00000000 00000000
0020: 00000000 00000000 28090000

in bytes

0000: 0F 01 04 00 03 00 2C 00 ......,.
0008: 00 00 00 00 99 00 04 80 ......
0010: 00 00 00 00 00 00 00 00 ........
0018: 00 00 00 00 00 00 00 00 ........
0020: 00 00 00 00 00 00 00 00 ........
0028: 00 00 09 28             ...*

在此示例中,字节偏移显示 SCSI 状态,字节偏移2930显示导致重试的 SCSI 请求块(SRB)状态,字节偏移31显示正在重试的 SCSI 命令。 在这种情况下,SCSI 状态为 00SCSISTAT_GOOD)、SRB 状态为 09SRB_STATUS_TIMEOUT),SCSI 命令为 28SCSIOP_READ)。

下面是最常见的 SCSI 命令:

SCSIOP_READ - 0x28
SCSIOP_WRITE - 0x2A

有关 SCSI 操作和状态的列表,请参阅 scsi.h

下面是最常见的 SRB 状态:

SRB_STATUS_TIMEOUT - 0x09
SRB_STATUS_BUS_RESET - 0x0E
SRB_STATUS_COMMAND_TIMEOUT - 0x0B

有关 SRB 状态的列表,请参阅 srb.h

注意

  • 超时错误 (SRB_STATUS_TIMEOUTSRB_STATUS_COMMAND_TIMEOUT) 指示请求在适配器中超时。 请求已发送到驱动器,超时期间内没有响应。

  • 总线重置错误 (SRB_STATUS_BUS_RESET) 指示设备已重置,并且由于重置而正在重试请求,因为驱动器收到重置时会中止所有不完整的请求。

管理员需要验证磁盘子系统的运行状况。 尽管偶尔超时可能是系统的正常操作的一部分,但频繁的重试请求表示应修复的存储的性能问题。

详细信息

由于此问题通常不在操作系统之外,请检查以下常见原因:

  • 配置了某种类型的限制,例如 I/O 限制。 有时,VMware 中的存储 I/O 控制会导致此问题。

  • 负载过高的驱动器过多位于同一存储控制器上。 因此,驱动器需要在不同的控制器之间拆分。

  • 如果配置了多路径 I/O(MPIO),则单个电缆或损坏的 NIC 可能会导致 iSCSI 出现问题。

事件 ID 129 疑难解答

系统会将存储器适配器 (HBA) 驱动程序的名称作为源来记录事件 ID 129。 Storport 驱动程序(Storport.sys)在检测到请求超时时记录此事件。HBA 驱动程序的名称用于事件中,因为它是与 Storport 驱动程序关联的微型端口驱动程序。

下面是事件 ID 129 的示例:

Event Type:       Warning
Event Source:     <HBA_Name>
Event Category:   None
Event ID:         129
Computer:         <Computer_Name>
Description: Reset to device, \Device\RaidPort1, was issued.

有关 Windows I/O 堆栈体系结构的信息

Windows I/O 操作使用分层体系结构,其中设备驱动程序位于设备堆栈上。 在基本模型中,堆栈顶部是文件系统。 接下来是卷管理器,后跟磁盘驱动程序。 端口和微型端口驱动程序位于设备堆栈的底部。 当 I/O 请求到达文件系统时,它将获取该文件的块号,并将其转换为卷中的偏移量。 然后,卷管理器将卷偏移量转换为磁盘上的块号,并将请求传递给磁盘驱动程序。 当请求到达磁盘驱动程序时,它将创建一个命令描述符块(CDB),并将其发送到 SCSI 设备。 磁盘驱动程序将 CDB 嵌入 SCSI_REQUEST_BLOCK (SRB) 结构。 此 SRB 将作为 I/O 请求包 (IRP) 的一部分发送到端口驱动程序 。

端口驱动程序执行大部分请求处理。 存在不同的端口驱动程序,具体取决于体系结构。 例如,ATA 端口驱动程序(Ataport.sys)和 SCSI 端口驱动程序(Storport.sys)。 以下是端口驱动程序的一些职责:

  • 为请求提供计时服务

  • 强制实施队列深度以确保设备没有比它可以处理更多的请求

  • 为数据缓冲区生成“散点”和“收集”数组

端口驱动程序与微型端口驱动程序接口,微型端口驱动程序由硬件供应商设计为使用特定适配器。 它负责从端口驱动程序获取请求并将其发送到目标逻辑单元号(LUN)。 端口驱动程序调用 HwStorStartIo() 函数以向微型端口驱动程序发送请求,微型端口驱动程序会将请求发送到 HBA 驱动程序,以便可以通过物理介质(光纤或以太网)将请求发送到 LUN。 请求完成后,微型端口驱动程序将调用StorPortNotification()NotificationType函数,并将参数设置为RequestComplete值,以及指向已完成 SRB 的指针。

将请求发送到微型端口驱动程序时,Storport 驱动程序会将请求置于挂起的队列中,并计时。 请求完成后,将从此队列中删除该请求。

计时机制很简单。 每个逻辑单元有一个计时器,并且初始化为 -1。 当第一个请求发送到微型端口驱动程序时,计时器将设置为 SRB 中的超时值。 磁盘超时值是位于以下注册表项下的可调整参数:

HKLM\System\CurrentControlSet\Services\Disk\TimeOutValue

某些硬件供应商将优化此值,以最好地匹配其硬件。 如果没有存储供应商的指导,请不要更改此值。

计时器每秒递减一次。 请求完成后,计时器将刷新,并在挂起的队列中刷新头请求的超时值。 因此,只要请求完成,计时器就永远不会变为零。 如果计时器为零,则表示设备已停止响应。 例如,当 Storport 驱动程序记录事件 ID 129 时,Storport 驱动程序必须尝试重置单元来采取纠正措施。 重置单元时,所有不完整的请求都已完成并出现错误,并重试。 清除挂起队列时,计时器设置为 -1初始值。

每个 SRB 都设置了一个计时器值。 完成请求后,队列计时器将刷新,并在列表的头使用 SRB 的超时值进行刷新。

事件 ID 129 的最常见原因是无响应 LUN 或已删除的请求。 删除的请求可能是由于存储区域网络(SAN)上存在故障路由器或其他硬件问题导致的。

事件 ID 157 疑难解答

此事件指示 Classpnp.sys 驱动程序已收到不可移动磁盘的即插即用管理器(PNP)的意外删除请求。

当系统与磁盘通信中断(例如 SAN 构造错误或 SCSI 总线问题)时,通常会发生此问题。 这些错误也可能由发生故障的磁盘导致,或者当用户在系统运行时拔出磁盘时。 在这种情况下,管理员需要验证磁盘子系统的热度。

事件 ID 55 和 98 疑难解答

如果记录了事件 ID 55、50、140 和 98 等 NTFS 事件,则需要运行“chkdsk”实用工具。

由于 NTFS 无法将数据写入事务日志,所以这可能会影响 NTFS 停止或回退无法写入事务数据的操作的能力。

下面是事件 ID 55 的示例:

Event Type: Error
Event Source: NTFS
Event ID: 55
Description: The file system structure on the disk is corrupt and unusable. Please run the chkdsk utility on the volume.

通常,当发生文件系统损坏时,将记录事件 ID 55。 发生以下一个或多个问题时,会发生文件系统损坏:

  • 磁盘具有错误的扇区。

  • 文件系统传送到磁盘子系统的 I/O 请求未成功完成。

大多数问题都与硬件相关,硬件可能意外损坏。 可以尝试以下方法来解决问题:

  • 更新 SCSI 端口或 RAID 控制器驱动程序。

  • 删除或更新筛选驱动程序。

  • 更新第三方存储驱动程序或固件。

  • 换用不同类型的驱动程序。 例如,RAID 控制器驱动程序或单片驱动程序。

  • 将硬件重新排列为各种组合。

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。