web-dev-qa-db-ja.com

ハードディスクの不良セクタファイルシステムに依存していますか?

欠陥のあるセクターがハードディスクのどこに保存されているのか疑問に思っていました。-ファイルシステムに依存しない領域にあるため、ハードディスクを同じ/異なるファイルシステムで再度フォーマットすると、不良として表示されますか?

デジタルsatPVRのハードディスクがバグのある動作を示していたので、これを尋ねます。HDをPCに接続しましたが、独自のファイルシステム(XTV)を使用しているため、NTFSでフォーマットし、CHKDSK/F/Rを発行しました。セクターを検証する:その結果、24のセクターが不良としてマークされました。

ディスクをアンマウントしてPVRに接続すると、ディスクはXTVファイルシステムで再初期化されました。

この時点で、不良としてマークされたセクターにはまだフラグが付けられているかどうか疑問に思います

3
Riccardo

ディスクの不良セクタはFileSystem independentです。

Platter上にあるSystemAreaと呼ばれる領域のディスクに格納され、ユーザー(O.S.など)のアクセス可能なセクターの前にある2つの不良セクターリストがあり、それらはディスク自体によって管理されます。それらの名前はP-ListとG-Listです。 P-Listは、欠陥のあるセクターによって製造およびテストされた後、ディスクに永続的に書き込まれるプライマリリストです。 G-Listは、オンザフライで管理および保守されるGrownListです。しばらくすると、セクターは磁気的に悪化する可能性があります。これは絶対に正常であるか、ECCエラーによって悪化する可能性があります。これらおよびその他のオンザフライの原因により、Gリストはあなたが見ることができる不良セクタを追跡します。もちろん、GリストとGリストのみを操作できるディスクツールもいくつかあります。 P-Listの内容を変更することはできません。

ファイルシステムは、不良セクタを追跡することもできます。これは、アクセス速度の考慮事項と考えることができます。そして、その追跡メカニズムは FS依存している、悲しいことに。「ああ、私のfsは不良セクタを正しく追跡し続けている」とは言えません。それ自体がfsです。実際の不良セクタと同期するために、ディスクフォーマットまたはディスクチェックを発行するときに、ディスクからG-Listを更新するかどうかはわかりません。

元の質問に戻ると、ファイルシステムはO.S.の最も洗練された部分の1つである必要があります。 XTVファイルシステムは、物理的な不良セクタの追跡を使用してそのシステムを実行する必要があります。

2
The_aLiEn

すでに24個の不良セクタがあるディスクでできる最善のことは、それを捨てて新しいものと交換することです(PVRが特定のディスクにロックされておらず、そのような交換を受け入れることを願っています)。ディスクが不良になり始めた場合、通常はプロセスが停止せず、すぐに数千の不良セクタまたは完全なディスク障害が発生します。または、ディスクが非常に遅くなり、PVRで使用すると記録または再生が壊れてしまう可能性があります。

あなたの質問については、CHKDSK /F /Rコマンドは、ファイルシステムレベルでのみ不良セクタをマークします。これらのセクタに関する情報はNTFS構造にのみ保存され、ディスクが再フォーマットされると失われます。これで、24個の読み取り不可能なセクターを持つディスクができましたが、PVRはそれについて何も知らず、喜んでそれらのセクターを使用しようとします。

ただし、ハードディスクは不良セクタの再マッピングを実行できます。ディスク自体に「GrownDefect List」が保存されており、不良セクタにアクセスする試みをスペアエリアにリダイレクトするために使用されます。この再マッピングは、特別な低レベルのユーティリティを使用する場合を除いて、コンピュータ(またはディスクを使用している他のデバイス)には表示されません。

再マッピングは通常、ディスクで読み取り不能として以前に観察されたセクターへの書き込みの試みによってトリガーされます。したがって、PVRは再フォーマット後にまだ書き込まれていないセクターを読み取ろうとすべきではなく、ディスクはそれらの24の不良セクターを認識しているため、問題を無視して最善を期待することができます( CHKDSK test)であり、そこにデータが書き込まれたときにそれらを再マップする必要があります。もちろん、これは、他のいくつかのセクターが後で悪くなる場合には役に立ちません(これは、ディスクが壊れ始めたときに発生する可能性が非常に高いです)。

もう1つできることは、ディスクの製造元のWebサイトにアクセスし、ディスクテストユーティリティ(Seagateディスク用のSeaToolsなど)をダウンロードしてから、ディスクをコンピューターに接続して、フルメディアテストを実行することです。このユーティリティは、ディスクによる不良セクタの再マッピングを強制できる場合があります。これにより、通常の方法でアクセスしたときにディスクに不良セクタがあるように見えなくなります(少なくとも、ディスクの継続的な劣化のために他の不良セクタは表示されません)。ディスクの形状が特に悪い場合、ユーティリティは交換が必要であることを示す場合があります(ただし、再マップできる不良セクタがいくつかあるだけでは、通常、これらのユーティリティでは深刻な問題とは見なされません)。

ディスクメーカーのテストユーティリティを実行する場合は、USBまたはFireWireインターフェイスを備えた外部アダプタを介さずに、ディスクをSATAコントローラ(またはディスクとコンピュータが古い場合はIDE)に直接接続する必要があることに注意してください。ディスクユーティリティは任意のATAコマンドをディスクに送信できる必要があるためです。これは、多くのUSB-SATAまたはFireWire-SATAコントローラチップを使用している場合は不可能です(可能であっても、ユーティリティがサポートしていない可能性があります)。場合によっては、ディスクユーティリティを機能させるためにBIOS設定を変更する必要がある場合もあります(たとえば、ユーティリティでサポートされていない場合は、AHCIまたはRAIDモードを無効にします)。この場合、これらの設定を復元するように特に注意する必要があります。そうしないと、OSが起動しなくなる可能性があります(さらに悪いことに、RAIDモードが使用された場合はRAIDアレイが破壊される可能性があります)。

1
Sergey Vlasov

一言で言えば、ファイルシステムのいずれかで不良ブロックが観察された場合、不良セクタをリダ​​イレクトするサービス領域がいっぱいになっている可能性があります。このHDDの敵を与えることをお勧めします))。

イベントログのディスクエラーを参照してください。

powershell Get-Eventlog system -newest 10 -EntryType Error -Source Disk

イベントログですべてのディスクイベントを表示します。

powershell Get-Eventlog system -Source Disk

テストS.M.A.R.T.ステータス、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 
0
STTR