PCがHDD容量を誤認識する場合の対処方法

HDD関連のトラブルとして、HDD容量が正しく認識されない、という類の事故があります。たとえば

  • 新品の1TBのHDDなのに、BIOSとかOSは33MBのHDDとして認識している。初期不良?相性問題?
  • 普段使っているHDDを外して、別PCにつないだら、HDD容量を正しく認識しなくなった。HDDこわれた?
  • いつも使っているHDDが突然認識されなくなった。BIOSの画面で確認するとHDD容量が大幅に減っているように見える。データ消失?

といったものです。

この手のトラブルは、実は簡単に復旧できる場合が多いです。知ってて損は無い情報なので、以下原因と復旧方法を説明します。

HPA (Hidden Protected Area)

HDDにはHPAと呼ばれる、隠し領域*1が設定できます。HPAとして設定した領域は、BIOSから無視され、OSからもアクセスすることはできません。通常の使い方だと、例えばノートPCのリカバリ用のファイルを置く領域がHPAになっていたりします。

そして

  • 数年前の古いマザーボードに、最近のHDDを接続した (つまりマザーボードBIOSにバグがある)
  • 怪しいHDD-USB接続キットを使った
  • (その他不運な出来事)

といったキッカケでHPAが勝手に設定されると、前述の"HDD容量が正しく認識されない系"のトラブルが発生します。

このような場合は、以下の手順で HPA を無効にするだけで復旧できます。

Step-1) HPA領域の確認

KNOPPIX等の適当なLinuxでPCをブートして、 hdparm コマンドで HPA の設定状況を調べます。

$ sudo hdparm  -N /dev/sdb
/dev/sdb:
 max sectors   = 65134/1953525168, HPA is enabled

このように "HPA is enabled"とでれば HPA が有効になっていて、隠し領域が設定されています。上記の例だと、1953525168セクタ中 65134セクタだけが利用できる状態で、残りのセクタはOSからも BIOSからも見えません。

HPAが設定されると、 fdisk コマンドの出力も、以下のようになります。

$ LANG=C sudo /sbin/fdisk -l /dev/sdb

Disk /dev/sdb: 33 MB, 33348608 bytes
255 heads, 63 sectors/track, 4 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: ********

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       60000   481949968+  83  Linux
Partition 1 has different physical/logical endings:
     phys=(1023, 254, 63) logical=(59999, 254, 63)
/dev/sdb2           60001      121601   494810032+  83  Linux
Partition 2 has different physical/logical beginnings (non-Linux?):
     phys=(1023, 254, 63) logical=(60000, 0, 1)
Partition 2 has different physical/logical endings:
     phys=(1023, 254, 63) logical=(121600, 254, 63)

この例だと、HDD自体は1TBあるのですが、HPAが設定されているため、先頭の33MBしか見えない状況になっています。

この場合は HPAの設定を削除するだけで、正常な状態に戻ります。

Step-2) HPAの削除

hdparamコマンドいっぱつです。これで、HPAが無効になります。

$ sudo hdparm  -N -p1953525168  /dev/sdb/dev/sdb:
 setting max visible sectors to 1953525168 (permanent)
 max sectors   = 1953525168/1953525168, HPA is disabled

あとはPCを再起動するだけです。簡単ですね。

2010/07/22 追記その1

hdparmの-N オプションの詳細については、
http://manpages.ubuntu.com/manpages/jaunty/man8/hdparm.8.html
あたりをご覧ください。

2010/07/22 追記その2

上記のLinuxを使う方法以外に、

HDAT2というソフトを使ってHPAエリアの削除→HPA無効化を設定

する方法もあるとのことです。

コメントをくださった、まさむねさん、ありがとうございました。

*1:隠しセクタとか隠しパーティションと呼ぶ場合もあります。