我想知道硬盘上的缺陷扇区存储在哪里: - 在文件系统独立区域,这样如果使用相同/不同的文件系统再次格式化硬盘,它们会显示为坏的吗?
我问这个问题是因为我的数字卫星 PVR 的硬盘出现了错误,所以我将 HD 连接到我的电脑,但是由于它使用专有文件系统(XTV),我已使用 NTFS 对其进行格式化并发出 CHKDSK /F /R 来验证扇区:结果 24 个扇区被标记为坏的。
卸载磁盘并插入 PVR,使用 XTV 文件系统重新初始化磁盘。
此时,我想知道标记为坏的扇区是否仍被标记
答案1
磁盘坏道是文件系统独立的。
磁盘中有两个坏扇区列表,它们存储在名为 SystemArea 的区域中,该区域也位于盘片上,位于用户(例如 OS)可访问扇区之前,由磁盘本身管理。它们的名称是 P 列表和 G 列表。P 列表是主列表,在磁盘制造并由缺陷扇区测试后永久写入磁盘。G 列表是增长列表,可动态管理和维护。一段时间后,扇区可能会因磁性而变坏,这是绝对正常,或者可能因 ECC 错误而损坏。对于这些和其他任何动态原因,G 列表会跟踪您能看到的坏扇区。当然,有一些磁盘工具可以操作 G 列表和仅 G 列表。您无法更改 P 列表的内容。
文件系统也可以跟踪坏扇区。你可以将其视为访问速度的考虑因素。追踪机制是遗憾的是,它依赖于 FS。在看到该 fs 本身的源代码之前,我们无法说“哦,我的 fs 一直在正确地跟踪坏扇区”。我们不知道它在发出磁盘格式或磁盘检查时是否从磁盘更新 G 列表,而它应该这样做,以便与真正的坏扇区同步。
回到您最初的问题,文件系统必须是操作系统最复杂的部分之一,并且您的 XTV 文件系统应该与物理坏扇区跟踪同步。
答案2
对于已经有 24 个坏扇区的磁盘,最好的办法就是将其扔掉,换上新的(希望您的 PVR 没有锁定到特定磁盘,并且会接受这种更换)。如果磁盘开始变坏,通常这个过程不会停止,很快您就会看到数千个坏扇区或整个磁盘故障。或者磁盘可能会变得非常慢,这会导致在 PVR 中使用时录制或播放中断。
至于您的问题,该CHKDSK /F /R
命令仅在文件系统级别标记坏扇区 — 有关这些扇区的信息仅存储在 NTFS 结构中,并且在重新格式化磁盘时会丢失。因此,现在您的磁盘上有 24 个无法读取的扇区,但您的 PVR 对此一无所知,并且会很乐意尝试使用这些扇区。
但是,硬盘能够自行执行坏扇区重新映射 — 磁盘本身存储着一个“增长缺陷列表”,用于将访问坏扇区的尝试重定向到备用区域。除非使用特殊的低级实用程序,否则计算机(或使用磁盘的任何其他设备)看不到此重新映射。
重新映射通常是由尝试写入之前被磁盘视为不可读的扇区而触发的。因此,您可以尝试忽略该问题并希望获得最佳结果,因为您的 PVR 不应尝试读取重新格式化后尚未写入的扇区,并且磁盘知道这 24 个坏扇区(因为它在测试期间尝试读取它们CHKDSK
)并应在写入一些数据时重新映射它们。当然,如果其他一些扇区稍后也变坏(这很可能发生在开始损坏的磁盘上),这将无济于事。
您还可以做的一件事是访问磁盘制造商的网站并下载磁盘测试实用程序(例如,Seagate 磁盘的 SeaTools),然后将磁盘连接到计算机并执行完整的介质测试。此实用程序可能能够强制磁盘重新映射坏扇区,这样磁盘在以正常方式访问时就不会出现坏扇区(至少在磁盘持续损坏而没有出现其他坏扇区时)。如果磁盘状况特别糟糕,实用程序可能会显示需要更换(但这些实用程序通常不会将只有几个可以重新映射的坏扇区视为严重问题)。
请注意,如果您选择运行磁盘制造商的测试实用程序,则必须将磁盘直接连接到 SATA 控制器(或 IDE,如果您的磁盘和计算机太旧),而不是通过带有 USB 或 FireWire 接口的外部适配器,因为磁盘实用程序必须能够向磁盘发送任意 ATA 命令,而这在使用许多 USB-SATA 或 FireWire-SATA 控制器芯片时是不可能的(即使可能,实用程序很可能也不支持它)。在某些情况下,您可能还需要更改 BIOS 设置以使磁盘实用程序正常工作(例如,如果实用程序不支持 AHCI 或 RAID 模式,则禁用它们);在这种情况下,您必须特别小心地恢复这些设置,否则您的操作系统可能无法再启动(或者更糟的是,如果使用了 RAID 模式,RAID 阵列可能会被破坏)。
答案3
简而言之,如果您在任何文件系统中观察到坏块,则重定向坏扇区的服务区可能已满。我建议您给这个硬盘一个敌人))。
在事件日志中查看磁盘错误:
powershell Get-Eventlog system -newest 10 -EntryType Error -Source Disk
在 eventlog 中查看所有磁盘事件:
powershell Get-Eventlog system -Source Disk
测试SMART状态,smartChk.vbs:
Dim strComputer
Dim strLogin
Dim strPassword
On Error Resume Next
strComputer = "."
If strLogin = "" or strComputer = "." then
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\WMI")
else
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _
"root\CIMV2", _
strLogin, _
strPassword, _
"MS_409")
end If
Set SmartDataItems = objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_FailurePredictData", "WQL", 48)
InstanceName = Array()
SmartData = Array()
SmartLength = Array()
RowCount = 0
For Each objItem In SmartDataItems
Redim Preserve InstanceName(RowCount)
InstanceName(RowCount) = objItem.InstanceName
Redim Preserve SmartData(RowCount)
SmartData(RowCount) = objItem.VendorSpecific
Redim Preserve SmartLength(RowCount)
SmartLength(RowCount) = objItem.Length
RowCount = RowCount + 1
Next
Set SmartDataItems = Nothing
ThresholdData = Array()
Redim Preserve ThresholdData(RowCount)
PredictFailure = Array()
Redim Preserve PredictFailure(RowCount)
Reason = Array()
Redim Preserve Reason(RowCount)
RowCount = 0
Set ThresholdItems = objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_FailurePredictThresholds", "WQL", 48)
For Each objItem In ThresholdItems
ThresholdData(RowCount) = objItem.VendorSpecific
RowCount = RowCount + 1
Next
Set ThresholdItems = Nothing
RowCount = 0
Set PredictStatusItems = objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_FailurePredictStatus", "WQL", 48)
For Each objItem In PredictStatusItems
PredictFailure(RowCount) = objItem.PredictFailure
Reason(RowCount) = objItem.Reason
RowCount = RowCount + 1
Next
Set PredictStatusItems = Nothing
Set oDict = CreateObject("Scripting.Dictionary")
CreateDict(oDict)
Set objFSO = CreateObject("Scripting.FileSystemObject")
If strComputer = "." then
Set objTextFile = objFSO.OpenTextFile("HDD_Smart.csv", 2, True)
else
Set objTextFile = objFSO.OpenTextFile("HDD_Smart_" & strComputer & ".csv", 2, True)
end If
For CurrentDisk = 0 to RowCount - 1
objTextFile.WriteLine("Drive: " & Replace(Mid(InstanceName(CurrentDisk), 9, InStr(InstanceName(CurrentDisk), "__") - 9), "_", " "))
objTextFile.WriteLine("PredictFailure: " & PredictFailure(CurrentDisk))
objTextFile.WriteLine("Reason: " & Reason(CurrentDisk))
objTextFile.WriteLine("ID;Attribute;Type;Flag;Threshold;Value;Worst;Raw;Status;")
aSmartData = SmartData(CurrentDisk)
aThresholdData = ThresholdData(CurrentDisk)
If IsArray(aSmartData) AND IsArray(aThresholdData) Then
LastID = 0
For x = 2 To SmartLength(CurrentDisk) + 2 Step 12
If LastID > aSmartData(x) then
x = 514
else
LastID = aSmartData(x)
If aSmartData(x) <> 0 Then
objTextFile.Write(aSmartData(x) & ";")
If oDict.Item(aSmartData(x)) = "" Then
objTextFile.Write("VendorSpecific(" & aSmartData(x) & ");")
else
objTextFile.Write(oDict.Item(aSmartData(x)) & ";")
end If
If aSmartData(x + 1) MOD 2 Then
objTextFile.Write("Pre-Failure;")
Else
objTextFile.Write("Advisory;")
End If
' objTextFile.Write(aSmartData(x + 1) & ";")
aFlag = aSmartData(x + 1)
txtFlag = ""
If (aFlag And &H1) <> 0 Then txtFlag = "LC," End If
If (aFlag And &H2) <> 0 Then txtFlag = txtFlag & "OC," End If
If (aFlag And &H4) <> 0 Then txtFlag = txtFlag & "PR," End If
If (aFlag And &H8) <> 0 Then txtFlag = txtFlag & "ER," End If
If (aFlag And &H10) <> 0 Then txtFlag = txtFlag & "EC," End If
If (aFlag And &H20) <> 0 Then txtFlag = txtFlag & "SP," End If
If txtFlag <> "" then
txtFlag = Left(txtFlag, Len(txtFlag)-1 )
end If
objTextFile.Write txtFlag & ";"
objTextFile.Write(aThresholdData(x + 1) & ";") 'Threshold
objTextFile.Write(aSmartData(x + 3) & ";") 'Value
objTextFile.Write(aSmartData(x + 4) & ";") 'Worst
objTextFile.Write((aSmartData(x + 8) * 65536 + aSmartData(x + 7) * 4096 + aSmartData(x + 6) * 256 + aSmartData(x + 5)) & ";") 'Raw
If aSmartData(x + 3) >= aThresholdData(x + 1) Then
objTextFile.WriteLine("OK;")
else
objTextFile.WriteLine("NOT OK;")
end If
end If
end If
Next
else
objTextFile.WriteLine("NO DRIVE WITH SMART FOUND;")
end If
objTextFile.WriteLine
Next
objTextFile.WriteLine
objTextFile.WriteLine("LC - life critical;")
objTextFile.WriteLine("OC - online collection;")
objTextFile.WriteLine("PR - performance related;")
objTextFile.WriteLine("ER - error rate;")
objTextFile.WriteLine("EC - event count;")
objTextFile.WriteLine("SP - self preserving;")
objTextFile.Close
Wscript.echo "HDD_SMART Is Done!"
Function CreateDict(oDict)
oDict.Add 1, "Raw Read Error Rate"
oDict.Add 2, "Throughput Performance"
oDict.Add 3, "Spin-Up Time"
oDict.Add 4, "Start/Stop Count"
oDict.Add 5, "Reallocated Sectors Count"
oDict.Add 6, "Read Channel Margin"
oDict.Add 7, "Seek Error Rate Rate"
oDict.Add 8, "Seek Time Performance"
oDict.Add 9, "Power-On Hours (POH)"
oDict.Add 10, "Spin Retry Count"
oDict.Add 11, "Recalibration Retries Count"
oDict.Add 12, "Device Power Cycle Count"
oDict.Add 13, "Soft Read Error Rate"
oDict.Add 184,"End-to-End error"
oDict.Add 187,"Reported UNC Errors"
oDict.Add 190,"Airflow Temperature (WDC)"
' oDict.Add 190, "HDA Temperature"
oDict.Add 191, "G-Sense Error Rate Frequency"
oDict.Add 192, "Power-Off Park Count"
oDict.Add 193, "Load/Unload Cycle Count"
oDict.Add 194, "HDA Temperature"
oDict.Add 195, "Hardware ECC Corrected Count"
oDict.Add 196, "Reallocated Event Count"
oDict.Add 197, "Current Pending Sector Count"
oDict.Add 198, "Off-Line Scan Uncorrectable Sector Count"
oDict.Add 199, "UltraDMA CRC Error Count"
oDict.Add 200, "Write Error Rate"
oDict.Add 201, "Soft Read Error Rate"
oDict.Add 202, "Address Mark Errors Frequency"
oDict.Add 203, "ECC errors (Maxtor: ECC Errors)"
oDict.Add 204, "Soft ECC Correction"
oDict.Add 205, "Thermal Asperity Rate (TAR)"
oDict.Add 206, "Flying Height"
oDict.Add 207, "Spin High Current"
oDict.Add 208, "Spin Buzz"
oDict.Add 209, "Offline Seek Perfomance"
oDict.Add 210, "Vibration During Write"
oDict.Add 211, "Vibration During Read"
oDict.Add 212, "Shock During Write"
oDict.Add 220, "Disk Shift"
oDict.Add 221, "G-Sense Error Rate"
oDict.Add 222, "Loaded Hours"
oDict.Add 223, "Load/Unload Retry Count"
oDict.Add 224, "Load Friction"
oDict.Add 225, "/Unload Cycle Count"
oDict.Add 226, "Load 'In'-time"
oDict.Add 227, "Torque Amplification Count"
oDict.Add 228, "Power-Off Retract Cycle"
oDict.Add 230, "GMR Head Amplitude"
oDict.Add 231, "Temperature"
oDict.Add 240, "Head Flying Hours"
oDict.Add 250, "Read Error Retry Rate"
End Function