数据损坏和磁盘错误涵盖不同的领域,例如访问驱动器、驱动器损坏和性能缓慢的问题。
以下事件 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 状态,字节偏移29
30
显示导致重试的 SCSI 请求块(SRB)状态,字节偏移31
显示正在重试的 SCSI 命令。 在这种情况下,SCSI 状态为 00
(SCSISTAT_GOOD
)、SRB 状态为 09
(SRB_STATUS_TIMEOUT
),SCSI 命令为 28
(SCSIOP_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_TIMEOUT
或SRB_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 不对这些产品的性能或可靠性提供任何明示或暗示性担保。