Windowsで不良ブロックがあるディスクの特定

定期的なバックアップをしているが、バックアッププログラムからディスクで読み込みエラーが発生したという通知があった。

イベントビューアーで「 Windowsログ」の「システム」をみると「デバイス \Device\Harddisk0\DR0 に不良ブロックがあります。」がエラーとして記録されていた。

\Device\Harddisk0\DR0 がどのディスクを意味しているのか分からなかったので調べてみた。

大雑把なディスクの特定

大雑把にディスクを特定するなら、\Device\Harddiskx\DRyxと「コンピュータの管理」(compmgmt.msc)「記憶域」「ディスクの管理」で表示されている「ディスクn」の数字nが一致するディスクということになるようだ。

\Device\Harddisk0\DR0 の場合には「ディスク0」ということになる。

対応関係の確認

きちんと、対応関係を把握しようと思うと面倒な感じ。もっとも、以下よりも簡単な方法があるかもしれない。

名前空間を調べる (WinObj)

Windowsのオブジェクトマネージャーの名前空間の情報にアクセスしてその情報を表示するための WinObj コマンドを利用することで、まず、基本的な対応関係を調べることができる。

WinObj コマンドは、Windowsのトラブルシューティングツール群 Sysinternalsに含まれている。

Sysinternalsについては以下に説明がある。

https://technet.microsoft.com/ja-jp/sysinternals/bb545021.aspx

WinObj コマンドは、以下からアクセス可能である。

https://technet.microsoft.com/ja-jp/sysinternals/winobj.aspx

次の記事のように \Global?? の下を調べることで、デバイス名とそれを参照している名前の対応がわかる。

maruton's memorandum[Windows][Sysinternanls]WinObj

以下のスクリーンショットでは、\Device\Harddisk0\DR0 は PhysicalDrive0 から参照されていることがわかる。

デバイス情報を取得する

WMI(Windows Management Instrumentation)を利用してデバイス情報を取得する。

PowerShell を使うことも、コマンドプロンプトからWMICコマンドを使うこともできる。

Windows PowerShell (Get-WmiObject)

Windows PowerShell から Get-WmiObjectコマンドを利用して物理ディスクの情報を表示する。

Get-WmiObjectの使い方は以下などで知ることができる。

http://blog.powershell-from.jp/?p=1563

WMI の Win32_DiskDrive クラスを利用して物理ディスクの情報を取得する。

以下では、ディスクの Caption、DeviceID、SerialNumber、PNPDeviceIDを調べた。

この例では、PHYSICALDRIVE0は、Crucial_CT1050MX300SSD1のシリアル番号1710161BF???であることがわかる(???は置き換えている)。

また、そのディスクの PNPDeviceID は、「SCSI\DISK&VEN_ATA&PROD_CRUCIAL_CT1050MX\4&4CDE086&0&000000」であることがわかる。

他の情報が知りたい場合には、Win32_DiskDrive class に関する次のWebを調べて必要なプロパティをformat-listの引数にすることで、取得することができる。

https://docs.microsoft.com/ja-jp/windows/desktop/CIMWin32Prov/win32-diskdrive

コマンドプロンプト(WMIC)

wmic (WMIC.exe)を利用してデバイスの情報を表示する。

wmicの使い方は以下などで知ることができる。

WindowsでWMIとwmicコマンドを使ってシステムを管理する(基本編)

WMI(wmic)を使ってシステムのディスクサイズや空き領域などをリモートから調査する

今回の対象はディスクドライブであるので、wmic で以下のようなコマンドで、ディスクのmodel、name、pnpdeviceid、serialnumberを調べた。

この例では、PHYSICALDRIVE0は、Crucial_CT1050MX300SSD1のシリアル番号1710161BF???であることがわかる(???は置き換えている)。

また、そのディスクの pnpdeviceid は、「SCSI\DISK&VEN_ATA&PROD_CRUCIAL_CT1050MX\4&4CDE086&0&000000」であることがわかる。

デバイスのプロパティ

同じ種類のデバイスを複数台利用している場合には、モデル名などだけでは特定できない。

ここでは、デバイスのプロパティから pnpdeviceid を確認する。

エクスプローラでディスクを右クリックしてそのドライブのプロパティを表示し、「ハードウェア」タブから候補のディスクを選択し、「プロパティ」ボタンを押す、表示された「詳細」タブから「デバイス インスタンス パス」を調べる。

もしくは、デバイスマネージャ(devmgmt.msc)を起動し、ディスクドライブから候補のディスクを選択し、右クリックして「プロパティ」を表示させ、表示された「詳細」タブから「デバイス インスタンス パス」を調べる。

この例では、「SCSI\DISK&VEN_ATA&PROD_CRUCIAL_CT1050MX\4&4CDE086&0&000000 」とあるものが対応するデバイスになる。

この場合には Crucial CT1050MX300 が問題のディスクであることが確認できた。

Crucial の SSD エラーの解消

上記のディスクエラーは、SSDのファームウェアを M0CR070 に更新したら出なくなった。

Crucial Storage Executiveでファームウェアの更新をしようとしたが、最初はうまくいかなかった。Crucial Storage Executiveのバージョンが古いようだったので、それをCrucial Storage Executiveから自動更新しようとしたがうまくいかなかった。仕方がないので、手動でその時の最新版をダウンロードして更新した。

最新版のCrucial Storage Executiveでもファームウェアの自動更新ができなかったので、ファームウェアを手動で更新することにした。しかし、日本のCrucialのサイトでは最新ファームウェアが M0CR060 であったので、アメリカのCrucialのサイトから最新ファームウェアが M0CR070 をダウンロードして、更新を行った。

ちなみに、ファームウェア更新前に chkdsk.exe調べても、エラーは発見されなかった。このため、chkdskでは修復できなかった。また、Crucial Storage Executive でもエラーなしと表示されていたので、エラーの原因ははっきりしなかった。

原因が除去されたのかどうかはわからないが、ファームウェア更新によってバックアップ時にエラーは発生しなくなった。