7. 技術的な詳細

(Randall Hopper、 の寄稿によるものです)

この章は、 ハードディスクやハードディスクの起動プロセスに関する基礎知識を提供します。 これは、複数の OS を起動する設定で問題が起こった時、 それを解決するのに役立つでしょう。 最初はごく基本的な用語から始まりますので、 章全体を流し読みして、見慣れない内容が出てくるところから 読み始めても構いません。

7.1. ハードディスクの基礎

まず、ハードディスク上のデータの位置を示すのに使われる、 基本となる用語が 3 つあります。それは、シリンダ、ヘッド、セクタです。 これらの用語の関係を知ることが、とりわけ重要と言うわけではありません。 が、これらがディスク上の物理的なデータの位置を示す、 ということは覚えておきましょう。

ハードディスクにはそれぞれ、 固有ののシリンダ数、ヘッド数、シリンダヘッドごとのセクタ数があります (シリンダヘッドはトラックとも呼ばれます)。 この情報は、ハードディスクの“ディスクジオメトリ”を定義します。 セクタ数は大抵の場合、1 セクタが 512 バイト、 1 トラックが 63 セクタに対応するようになっていますが、 シリンダとヘッドの数はディスクによってさまざまです。 このように、計算すると、 ディスクに納めることのできるデータのバイト数が分かります:

(シリンダ数) × (ヘッド数) × (63 セクタ/トラック) × (512 バイト/セクタ)

たとえば Western Digital AC31600 EIDE ハードディスクの場合、次のようになります。

(3148 シリンダ) × (16 ヘッド) × (63 セクタ/トラック) × (512 バイト/セクタ)

これを計算すると 1,624,670,208 バイト、 つまり約 1.6 GB になります。

ハードディスクの物理的なディスクジオメトリ情報 (シリンダ数、ヘッド数、トラックあたりのセクタ数) は、 ATAID などのインターネット上にあるプログラムを用いて 調べることができます。おそらくハードディスク自体にも、 こういった情報が付属しているでしょう。 しかし注意して欲しいのですが、BIOS LBA (Section 7.3 参照) を使用している場合、 物理的なジオメトリ情報を得るためのプログラムはどんなものでも良い、 というわけではありません。 これは、数多くのプログラム (たとえば MSD.EXE や FreeBSD の fdisk) が物理的なディスクジオメトリ情報を認識しないためです。 これらはその代りに、 変換されたジオメトリ (LBA を使った仮想的なセクタ数) を報告します。 この言葉が何を意味しているのかについては、後述します。

これらの用語について役立つこととしては、 与えられた三つの数字--シリンダ数、ヘッダ数、 トラックあたりのセクタ数--は、ハードディスク上の特定のセクタ (データの 512 バイトブロック) を絶対位置で決定します。 シリンダ、ヘッドは 0 から、セクタは 1 から番号付けされます。

さらに詳しい技術情報に興味がある方には、 ディスクジオメトリ、起動セクタ、BIOS などに関する情報は ネット上の至るところで得ることができることをお知らせしておきます。 Lycos、Yahoo などで boot sector (起動セクタ)master boot record (マスターブートレコード) などを検索してみてください。 それらの役立つ情報の中でも、 Hale Landis の How It Works (動作の仕組み) ドキュメント集は参考になります。このドキュメント集に関しては Section 6 の章を参照してください。

もう用語については十分ですね。 次は起動についてお話します。

7.2. 起動のプロセス

ハードディスクの一番先頭のセクタ上 (シリンダ 0、ヘッド 0、セクタ 1) には、 マスターブートレコード (MBR) が存在します。 MBR には、ハードディスクのマップ情報が含まれていて、 最大 4 つの パーティション を認識することができます。それぞれのパーティションは、 ディスク上の連続したデータ領域の塊です。 FreeBSD では、このパーティションを スライス と呼んでいます。これは、FreeBSD 独自のパーティションと混乱しないようにですが、 ここではスライスという言葉は使いません。 各パーティションには、それぞれ別の OS を入れることができます。

MBR の各パーティションエントリには、 パーティション IDシリンダ/ヘッド/セクタの開始位置シリンダ/ヘッド/セクタの終了位置 があります。パーティション ID は、パーティションの種類 (どの OS を使用しているか) を、 開始位置/終了位置 はパーティションの位置を示します。 Table 1 に、 良く使われるパーティション ID のリストを示します。

Table 1. パーティション ID - Partition IDs

ID (hex) 説明
01 DOS12 基本領域 (12-bit FAT)
04 DOS16 基本領域 (16-bit FAT)
05 DOS 拡張領域
06 大容量 DOS 基本領域 (> 32MB)
0A OS/2®
83 Linux (EXT2FS)
A5 FreeBSD、NetBSD、386BSD (UFS)

注: パーティションには、起動ができないものもあります (例えば DOS 拡張領域)。 つまり、できるものもあれば、できないものもあるというわけです。 パーティションが起動可能かどうかは、 各パーティションの先頭に存在する パーティション起動セクタの設定で決まります。

好みのブートマネージャを設定した場合を考えてみます。 ブートマネージャは、接続されているすべてのハードディスクの MBR パーティションテーブルのエントリをリストアップし、 そしてそのリストから、どのエントリを起動するのか 選択できるようにしてくれます。 ブートマネージャは、 起動の際、最初に接続が検出されたハードディスクのマスターブートセクタにある、 特別なプログラムコードによって呼び出されます。 呼び出されたブートマネージャは、選択したパーティションに対応するエントリを MBR パーティションテーブルから調べ、 シリンダ/ヘッド/セクタの開始位置を取得します。 それから、そのジオメトリ情報を使うことでパーティションの起動セクタを読み込み、 制御をそちらに渡します。 読み込まれる起動セクタには、そのパーティション上の OS をロードするために必要な情報が含まれています。

今、かるく触れた内容を理解することは、とても重要です。 ハードディスクには、必ず MBR が存在します。 しかし重要なのは、そのうち BIOS により最初に接続が検出された ハードディスク上にあるものです。 IDE ハードディスクだけを使用しているなら、 最初のIDE ディスクです (例えば、最初のコントローラーのプライマリ側)。 SCSI だけで構成されたシステムの場合も、同じことが言えます。 もし、IDE と SCSI の両方のハードディスクを持っている場合には、 多くの場合、IDE ディスクが先に検出されるため、 1 台目の IDE ディスクが、最初に検出されるハードディスクになります。 先ほど述べたように、インストールするブートマネージャは、 最初に検出されたハードディスク上の MBR に格納されることになります。

7.3. 起動の制限と注意事項

ここでは、用心しなければならない、興味深い内容についてお話します。

7.3.1. 恐怖の 1024 シリンダ制限と BIOS LBA の作用

起動プロセスの最初の部分は、すべて BIOS によって実現されています。 (BIOS とは、コンピュータのためのスタートアップコードを提供する、 システムマザーボードに載っているソフトウェアチップのことです)。 そのため、この最初のプロセスは BIOS インタフェースによって制限を受けます。

このプロセスの間、ハードディスクを読み込むために使用された BIOS インタフェース (INT 13H、Subfunction 2) は、 シリンダ番号へ 10 ビット、ヘッド番号へ 8 ビット、 セクタ番号へ 6 ビット割り当てます。 これがこのインタフェースを使う場合 (例 … ハードディスクの MBR から呼び出されるブートマネージャや、 起動セクタから呼び出される OS ローダーなど) に次のような制限を与えるのです:

  • 最大 1024 シリンダ

  • 最大 256 ヘッド

  • 最大 64 セクタ/トラック (実際には 63 で 0 は利用できません)

さて、容量の大きなハードディスクには多くのシリンダがありますが、 ヘッドは多数ありません。 そのため、大容量のハードディスクにおいては、 シリンダ数が 1024 を越えます。 このことや BIOS インタフェースを考慮すると、 ハードディスクのどこからでも起動できるとは限らないのです。 すべての起動可能なパーティションの起動セクタから呼び出されるブートマネージャや OS ローダーは 1024 シリンダより下のシリンダに存在しなければなりません。 実際に、お使いのハードディスクが典型的なものでヘッドが 16 であれば、 次のようになります:

1024 シリンダ/ディスク × 16 ヘッド/ディスク × 63 セクタ/(シリンダ - ヘッド) × 512 バイト/セクタ

これが、よく言われる 528MB 制限です。

ここが BIOS LBA (Logical Block Addressing) が入ってくるところです。 BIOS LBA はシリンダを再定義することにより、 BIOS API を呼び出すコードが BIOS インタフェース経由で 1024 シリンダ より上の物理シリンダにアクセスするようにします。 つまり、BIOS を通して見る場合に、実際より少ないシリンダ数、 多いヘッド数として扱われるようにシリンダ数、 ヘッド数を再マップしてくれるのです。 言い替えれば、シリンダ数とヘッド数のバランスを変更することで、 ハードディスクが相対的にヘッドが少なく、 シリンダが多くなるということを利用することにより、 双方の数が上記に述べられている制限 (1024 シリンダ、256 ヘッド) を越えないと言うことになります。

BIOS LBA を用いることで、 ハードディスク容量の制限が仮想的になくなりました (まぁ、8GB まで上がったと言うところでしょうか)。 LBA BIOS を使用している場合は、FreeBSD または 他の OS をどこにでも載せることができ、 1024 のシリンダ制限に引っかかることもありません。

1.6GB Western Digital を再度例として考えてみましょう。 物理的なジオメトリは、次のとおりです:

(3148 シリンダ、16 ヘッド、63 セクタ/トラック、512 バイト/セクタ)

しかしながら、BIOS LBA は次のように再マッピングを行います:

(787 シリンダ、64 ヘッド、63 セクタ/トラック、512 バイト/セクタ)

実際には同じサイズのディスクなのですが、 シリンダとヘッドの計算は BIOS API の範囲内で行われます (偶然にも、私のハードディスクの一つには、 Linux と FreeBSD が物理的なシリンダ 1024 番目より上に載っています。 これらのOS が問題なく起動するのも、BIOS LBA のおかげなのです)。

7.3.2. ブートマネージャとディスクの割り当て

ブートマネージャのインストール時、 他に気をつけねばいけないことは、 ブートマネージャ用として領域を割り当てることです。 1 つ、あるいは複数の OS の再インストールを余儀なくされたくないなら、 一番気にしなくてはいけないトピックです。

(MBR のある) マスターブートセクタ、 パーティション起動セクタ、起動プロセス についての Section 7.2 の説明を読んだ後は、 自分のハードディスクのどこに、 この気のきくブートマネージャが存在するのか気になるところですね。 それはと言いますと、いくつかのブートマネージャは、 パーティションテーブルの隣の、マスターブートセクタ (シリンダ 0、ヘッド 0、セクタ 1) に納まり切る程に小さいのです。 ブートマネージャによってはもう少し容量が必要なものもあり、 その領域は一般には空いているため、 シリンダ 0 ヘッド 0 セクタ 1 にあるマスターブートセクタを 越えたいくつかのセクタにまで自身を拡張しています。

ありがたいことに (FreeBSD を含む) OS のいくつかは、 必要ならばマスターブートセクタの直後、 シリンダ 0、ヘッド 0、セクタ 2 からパーティションを 起動することができます。 実際に、先頭に空きのある、あるいは全体が空のディスクで FreeBSD の sysinstall を実行すると、デフォルトではその場所から FreeBSD パーティションが始まります (少なくとも私が行った時はそうでした)。 そして、MBR の後にあるいくつかのセクタを消費するような ブートマネージャをインストールする場合、 最初のパーティションのデータの先頭が上書きされます。 FreeBSD の場合は、ディスクラベルが上書きされ、 FreeBSD が起動できなくなります。

このような問題を避ける簡単な方法としては (また、後で異なるブートマネージャを試す柔軟性を持たすためにも)、 パーティションを切る時に、 ハードディスクの最初のトラックを割り当てないまま まるまる残しておくことです。 つまり、シリンダ 0、ヘッド 0、セクタ 2 からシリンダ 0、 ヘッド 0、セクタ 63 までを空けておき、 パーティションをシリンダ 0、ヘッド 1、セクタ 1 から開始するということです。 更に良いことに、ハードディスクの先頭に DOS パーティションを 作成する際、DOS はデフォルトでこの場所を空けておきます (これがブートマネージャのいくつかはその場所が空きだと 仮定するという理由です)。 というわけで、ディスクの先頭に DOS パーティションを作成することで この問題を避けることができるのです。 私はこのやり方が好みで、自分で 1MB の DOS パーティションを先頭に 作成します。そうすると、パーティションを切り直す時、 DOS のドライブ名をずらすことも必要ないのです。

参考として、次のブートマネージャはコードとデータを 記録する際にマスターブートセクタを使用します:

  • OS-BS 1.35

  • Boot Easy

  • LILO

次のブートマネージャはマスターブートセクタの後にある セクタをいくつか使用します:

  • OS-BS 2.0 Beta 8 (sectors 2-5)

  • OS/2 boot manager

7.3.3. マシンが起動しない場合はどうするか?

ブートマネージャをインストールした際に、 MBR が起動しない状態にしてしまうことがあります。 あまりないことですが、既にインストールしたブートマネージャが ある状態で FDISK してしまうと起こることがあります。

ハードディスクに起動可能な DOS パーティションがある場合、 DOS フロッピーから起動します。次を実行します:

A:\> FDISK /MBR

オリジナルに戻すには、シンプルな DOS の起動コードを システムに戻します。そうすると、ハードディスクから DOS (DOS に限る) を起動することができます。 もう一つの手としては、起動可能なフロッピーを使って、 ブートマネージャのインストールプログラムを再度実行します。