BIOS パラメータを変更する必要がある場合について

「Change Head 」の応用

2011-1-1, 2013-9-7 , 2015-2-20, 2015-3-2

■ はじめに

 DISK BIOSがおこなうハードディスクへの読み書きでは、かつては セクタ番号、ヘッド番号、シリンダ番号という3つの値(CHS)でセクタ番地を 指定してアクセスしていました。これらは現在では架空のものとなり、 32bitの連続なLBAでディスク番地は扱われ、パーティションの管理も システムのブート過程でもLBAで扱われているはずなのですが、未だに意味を 持っている点がいくつかあるようです。たとえば次のような場合です。

とくに問題なのは、ディスクインターフェイスのBIOSによって、あるいは ディスクの総容量によって、あるいは既存パーティションのフォーマットの されかたによって、CHSが変わりうるという点です。何かの拍子にCHSが変化すると 以下で述べるような問題が起こりえます。

■ Silicon Image チップのストレージボード

 とくにSiliconImage社のチップを載せたボードのBIOSで、(1)に関連して 問題が発生します。 intelチップセットの機能であるオンボードATAの場合、 ある程度大きな容量のハードディスクについては、255ヘッド、63セクタ という設定になるのですが、SiliconImage製チップのボードのBIOSでは、 必ず16ヘッド、63セクタを指定してきます。

 Windows2000/XPのブートローダは、ブートの過程で、ヘッド×セクタ数に 依存するような動作をするようです。各パーティションの先頭(いわゆるPBR) にも、それが作られたときのヘッド数、セクタ数が記録されていますが、 それと現在のBIOSから得られるものとが一致しない場合、"NTLDR Missing" というエラーで停止してしまいます。

 これを回避するには、PBRに記録された値を現在のBIOSの値に合わせる 必要があります。これまで255ヘッド63セクタで使用していたハードディスクを SiliconImage社のチップを載せたボードに繋ぐ場合は、そのようにPBRを 書き換えると、NTLDRが起動できるようになります。

 いっぽうこれまでSiliconImage社のチップを載せたボードで使っていた ハードディスクを、intelチップセットオンボードのDISKインターフェイスに 繋いだ場合は、なぜかNTLDRが起動できるようです。理由は以下で説明します。

■ HDDを見てから決まるヘッド数・セクタ数

 intelチップセットオンボードのDISKインターフェイスは、 何もパーティションのないハードディスクを繋いで(別のハードディスクから) システムを起動すると、255ヘッド、63セクタとなるのですが、 既にパーティションが存在すると、そのパーティションテーブルに書かれた 情報(LBAが使われる現在では機能的に廃止されている)とPBRの両方を調べ、 そこに書かれているとおりのヘッド数、セクタ数にBIOSを設定します。

 これは、255:63を決め打ちすることに比べると、ある意味非常に柔軟で 便利な機能です。大昔の小容量ハードディスクの時代には16ヘッドで 扱われていましたが、その当時のハードディスクを繋いだときには ちゃんと16ヘッドで認識しようというわけですので、認識不良になる 心配がありません。16ヘッドに限らず、特別なシステムで認識していた 状態のまま認識できるのは便利です。

 しかし、本来BIOSがハードディスクのパーティションを先にみて からパラメータを決めるというのは、本末転倒のおかしなことであり、 万一でたらめなデータがハードディスクに書かれていた場合、 ヘッド数、セクタ数をとんでもない値に設定する可能性があります。

 実際そのようなことは起こっており、とくにこれから問題となる 可能性が出てきました。これまではパーティションテーブルは MBR形式しかなく、またWindowsで使う限りはパーティションはほとんど FATかNTFSでした。

 EFI対応でないBIOSがチェックするのはこれらだけのようで、 例えばEFI-GPT形式のディスクや、メーカ製のリカバリ領域を持つ ディスクでは、BIOSの想定した位置に想定外の値が書かれているため、 おかしなヘッド数、セクタ数をBIOSを設定してしまいます。これにより、 最悪の場合Windows2000やWindowsXP(Service Packにより異なるIPLのバージョンによる) が起動できなくなる恐れがあります。

 しかしMBRで使う限りでは、この機能を逆手にとれば、任意の ヘッド数、セクタ数にできます。これは本来はBIOSメニューなどで 設定すべきものですが、そもそもCHSの設定は形骸化しているもの であり、BIOSメニューでも設定できる機種・マザーボードはほとんど なくなってきています。

■ シリンダ境界は絶対厳守しなければならないのか

 まだLBAのなかったIBM/PCの時代には、パーティションの境界は かならず1シリンダ=ヘッド数×セクタ数の境界(倍数)に合わせる という約束事がありました。古いBIOSやOSでは、これを守っていないと 起動やパーティション認識ができませんでした。

 しかしLBA方式が登場し、BIOSもMS-DOSもLBAに対応(いわゆる int 13h extensionの実装)した時期からは、CHS自体が有名無実化したので、 パーティション境界を守らなくても、起動や認識はできるようになりました。

 Windows 2000やXP自体は、既に述べたCHSの現状一致問題はあり ましたが、パーティション境界がシリンダ境界に一致していなくとも とくに問題なく起動できます。それどころか、Windows Vistaおよび Windows server 2008からは、そもそもこの境界を無視してパーティションを 配置するようになっており、それで作ったパーティションはWindows XP でも問題なく認識できますし、MS-DOS 7.x(Win9x)自体もこの境界を 無視したパーティションからの起動・認識に何ら問題はありません。

 それでもDOS 7.xのFDISKやWindowsXPまでのディスク管理の機能では、 パーティションを新規作成すると、シリンダ境界に配置するという 規則が守られていました(先頭のパーティションは例外で、1トラック 境界である63セクタ=3Fhから開始することとなっている)。

 ところがBIOSの異なるインターフェイスに繋ぎ変えると、この シリンダ境界遵守の規則が逆に災いして致命的なことが起こります。 たとえば以前にはSiliconImageのチップのインターフェイスに繋いで、 パーティション境界が16×63=1008セクタの倍数で基本パーティションが 作られていたハードディスクに、さらに基本パーティションを確保しよう という場合に、境界が整合しなくなります。境界が整合しない場合でも ギャップができるだけであればとくに問題ありませんが、 重なってしまうと大変なことになります。Windowsのディスク アドミニストレータでもこのようなことが起こり、パーティションに 重複が発生しました。そのほかサードパーティ周辺機器メーカが公開 している、とあるフォーマッタでもそのようなことが発生し、 後ろ側にある領域のファイルシステムが破壊されてしまうことが ありました。

■ 新しいシステムでは800hから先頭パーティションが始まる

 Windows VistaおよびWindows server 2008からは、800hのセクタ番地から パーティションを配置するようになりました。これは255ヘッド63セクタの シリンダ境界を守っていませんので、既に述べたような不具合は、発生する 条件を整えれば発生してしまいます。

 またWesternDigital社が2010年頃から発売しているAFTドライブというタイプ のハードディスクでは、あらゆる境界やアクセス単位を4KBつまり8のセクタ番地 にしておかないと、速度の低下を来します。800hから開始するのはこれを 避けるための必要条件ですが、再び古いOSや古いディスクユーティリティを 使おうとすると、境界問題が発生します。

 新しいシステムの方式にも古いものにも対応させるにはどうしたら よいか。開始位置800h化は時代の流れなのでこれは厳守するとして、 ヘッド数セクタ数もこれに合わせて設定すればよいのです。 たとえば64ヘッド、32セクタに設定したとすると、64×32=2048=800hと なって、旧式のCHS方式でも最新方式の800h境界も満たすことができます。 ただ最初からこれでパーティションを確保してある場合はよいですが、 途中で無理矢理ヘッド数セクタ数を変えると、既に述べたようなことが 起こりえます。

 800h開始条件はおいておいて、8の倍数セクタ境界を守ることと 255ヘッド63セクタの標準的なBIOS CHSの両方を満たすためには、 パーティション境界を16×63=1008=3F0hに置くというのも ひとつの方法です。ただ残念ながらこの方法は普及しているようには 見えませんし、Windows7の普及で、800h開始が定着すると考えられるので、 3F0hでの開始&境界という方式は、たぶん普及しないでしょう。 物理セクタ4KBのAFTにはじゅうぶんですが、物理セクタ(書き込みの最小単位)が もっと大きなSSDには適切でないためです。128*63にするという手があります。 これですと128*512バイト=64KB境界となるので、最小書き込み単位が64KBの SSDにも合う方法です(しかしそれ以上の単位、256KBのSSDもあるらしい)。

■ 自在にBIOSシリンダ数・ヘッド数を変える

 以上のような問題の全てに対処するには、intel chipset インターフェイスのBIOSの「大きなお世話」機能をうまく使って、 既存のパーティションがある状態で、任意のヘッド数、セクタ数と なるようにすればよいということになります。 Change Head(CHGHEAD)というソフトウェアツールでそれが可能となります。 いまのところ、

を用意してあります。これ以外のパラメータにすることはとくに意義を 見いだせませんが、USBメモリのパーティションからWindows 2000,XPを 起動させたい場合などには、任意パラメータ設定が必要となるかもしれません。 次の図はchgheadでの選択画面のスクリーンショットです。

 USBメモリでは、パーティション開始点が通常の3Fhとなっていない 状態でフォーマットされていることが多くありますが、Windowsから通常は パーティションの削除と再割り当てができなくなっていますので、 通常の手段ではどうやっても、BIOSの認識とMBR,PBRに書かれたCHSを 一致させるこができません。

 このような場合でも、USBメモリをBIOSで認識させるように してからDOSを起動し、ヘッド数を変更すれば、なんとかなる可能性が あります。ただしUSBメモリでは再フォーマットは使用機器によっては 認識できなくなる危険性が大きいので、適用は慎重におこなってください。

■ Change Head(CHGHEAD)適用の注意点

【適用できないことも多い】

 BIOSヘッド数やセクタ数が指定通りに変化しないことも多いです。 変更可能な機種の場合でも、FAT32かNTFSのアクティブパーティションが 存在する必要もあるようです。

【古いBIOSでは起動できなくなる】

 近年のAMI BIOSやintel 純正マザーボードのBIOSでは問題は起こりませんが、 Award系BIOSのマザーボードでは、64ヘッド32セクタにすると起動ができなく なります(とくにGIGABYTEのマザーボード)。また63セクタでも16ヘッドや 240ヘッドにした場合でも起動できなくなるBIOSのマザーボードは存在しています。 しかし、もしそのようになった場合でも、別のブートデバイスからDOSを起動 できる環境であれば、DOSでHDDのドライブ内容は認識できます。 FDやUSBメモリからDOSを起動し、"CHGHEAD"を適用して255ヘッド63セクタに戻せば、 起動できなくなる問題を修正できます。

【intel chipset以外は未知】

 AMDチップセット機では試したことがないので、CHSの強制変更が可能か どうかはわかりません。

【新しいパーティション管理方式(GPT)に適用禁止】

 このプログラムで想定しているハードディスクの領域管理方式は、 従来の「Windowsのディスク管理」やFDISKなどで作られるMBR方式です。 Windows VistaやWindows Server 2008 以降で導入されたGPTディスクに 対しては適用する意味もありません。

【論理セクタサイズ512バイト以外は未知】

 int13h extensionのDISK BIOS(3.0)では、2テラバイト以上の HDDを扱うことはできるようになっていますが、パーティションテーブルに 書かれるセクタ番地の大きさが32bitまでなので、2テラバイト以上の HDDから通常のMBRを使用した起動はできません。したがって本プログラムも 適用できません。また、セクタ長を1024バイト以上にして2テラバイトに 対応させているBIOSでの適用結果については、検証していません。

2012-4-30追記

 最近Silicon imageのボードを使っていなかったので気が付きませんでしたが、 SiI3512の場合、BIOS 4.5.02では ヘッド数をIntelチップセットと同じ255にした ようです。4.3.84までは、たとえ255ヘッドの状態で領域確保してあっても、 決めうちで16headとなる仕様でした。

 この仕様変更により、起動ドライブが接続されている状態で SiI3512ボードの BIOSを書き換えると、Windows(2000~XpSP2)が起動できなくなる可能性があります。 そうなった場合は、別手段でDOSを起動して本プログラムCHGHEADを適用し、 パーティションのPBRに書かれているフォーマット時ヘッド/セクタにのところを 255ヘッドとするように書き換えれば、起動できるようになります。

 SiliconImage SiI3124チップの場合は、BIOS バージョン 6.6.00以上で 255ヘッド/63セクタで作ったパーティションは、16ヘッドにならず255ヘッドに なることを確認しました。しかしもともと16ヘッドにしていたものがどうなるか までは確認していません。

 未確認ですが、SiI3114 SATAボード、PCIexpress接続のSiI3132 SATAボード、 SiI0680 ATAボードなどでも同様に仕様変更のためのBIOSが出ているかもしれません。

2013-8-15追記

 SiI3132については、最新のBIOS(非RAID)は 7.7.03 、2009年9月9日のようです。 しかしこのバージョンのBIOSでは 16ヘッド仕様のままでした。 他のチップのBIOSは255ヘッド仕様に移行している中で、これだけが 放って置かれているのは、なぜなのかよくわかりません。

2013-9-07追記

 ChgHead 1.10にバージョンアップし、128ヘッドにする選択を追加しました。

2015-2-20追記

 ChgHead 1.11にバージョンアップし、FAT12のパーティションが存在する場合にも対応するようにしました。

2015-3- 2追記

 ChgHead 1.12にバージョンアップし、'NEC+'の属性のディスク(PC-98使用痕跡とMBRの両方がある)にも適用できるようにしました。

←戻る