|
Linux 環境を作るには、少なくとも 1 つのファイルシステムが必要です。実際には /home, /usr, /tmp, /var などを別のファイルシステムに分けて、マウントで繋いで運用することもよくあります。そこで、ハードディスクは中身を「パーティション」に分割して、パーティションごとにファイルシステムを作って使うようになっています。これによって、1 台のハードディスクに複数のファイルシステムを使った Linux 環境を作ったり、複数の OS をインストールしたりできるようになっています。
そもそも現在の PC 互換機の元である IBM-PC/AT では、1 台のハードディスクに 4 つまでパーティションを作れる仕様になっていました。しかし、当初は数十 MB だったハードディスクの容量が増大するに従ってこの規格も不十分になったため、元の 4 つの「基本」パーティションのうちの 1 つを「拡張」パーティションとして、その中を再分割して「論理」パーティションを作れるように拡張がなされました。論理パーティションには、一部の OS で起動パーティションとしにくいなどの制限もありますが、とにかく拡張パーティションの中にいくつでも作れるので、ハードディスクに作れるパーティションの数は無制限となりました。
Linux ではこのハードディスクやパーティションもデバイスファイルとして表します。ハードディスクはプライマリマスタから順に /dev/sda, /dev/sdb … となります。パーティションはハードディスクのデバイスファイルに、基本・拡張パーティションには 1 〜 4 、論理パーティションには 5 から始まる番号を付け、/dev/sda1, /dev/sdb5 のように表します。
| |
|
|
ディスクは読み書きしたデータを、「セクタ」(Sector) という単位で入出力しています。PC 互換機のハードディスクでは、1 セクタ は 512Bytes です。このセクタのうち、特にハードディスクの先頭 1 セクタは MBR (Master Boot Record) と呼ばれ、基本・拡張パーティションのディスク上での位置を記録したパーティションテーブル(16Bytes × 4) と、ブートローダの一部 (最大 446Bytes)、それに識別符号 (2Bytes) が格納されています。
ブートローダ (Boot Loader) は、一言で言えば「OS を起動するプログラム」です。定義には諸説ありますが、一般的には OS カーネルの起動前に稼働するプログラムのうち、BIOS が OS の手前で起動するソフトウェアをブートローダと呼んでいます。ここでは、PC 互換機の起動手順に沿ってブートローダの役目を説明します。
PC 互換機では、電源が入るとまず CPU が特定のメモリアドレスにある BIOS を実行します。BIOS はマシンの初期化などの処理を行い、最後に BIOS 設定で指定されている順にディスクの特定位置 (多くの場合は先頭) を読み込み、そこにあるプログラムを実行します。ハードディスクの場合は MBR の中のブートローダが実行されるのですが、446 Bytes 以下というこの 1 段目のブートローダに複雑な処理はできないので、多くの場合 1 段目はディスク上の別の場所にある 2 段目を読み込んで実行するだけとなっています。実質的なブートローダの処理をするのはこの 2 段目で、OS カーネルを読み込んで実行するまでの処理をこなします。こうして無事 OS が起動できるとブートローダの役目は終わりです。
実際のブートローダにはもっと多段式のものもありますが、とにかく「自分自身の処理→次の段を読み込んで実行」を繰り返して OS を起動する点は同じです。この流れをブートストラップ (Boot Strap) と言います。
単純なブートローダは特定の OS しか起動できませんが、複数の OS に対応し、起動する OS を選択できる「ブートセレクト」機能を持つブートローダもあります。また、そのようなブートローダの中にはブートストラップの仕組みを利用して、自分では OS を起動せず、選択した OS の専用ブートローダに継投するだけの「チェインローダ」というものもあります。Linux で使われるブートローダは Windows などに配慮してブートセレクト機能を搭載するものが殆どですが、Linux 以外の OS はチェインロードの場合が多いようです。
ARMA ではブートローダとして GRUB (GNU GRUB) を採用しています。GRUB には次のような特長があります。
|
|
XFS, ReiserFS, Ext2, FAT などのファイルシステムを直接認識できる。
|
|
|
|
8.4GB (1024 シリンダ) 以上の領域からも OS を起動できる。
|
|
|
|
OS を矢印キーを使って選択できる「GRUB メニュー」。
|
|
この他にも、BIOS トラップ、ネットワークブートなど、様々な局面で柔軟に OS を起動できる機能を意欲的に収録しています。
中でもファイルシステムを直接認識できるのが GRUB の最大特徴と言えます。詳しくは後述しますが、GRUB はファイルシステムから /boot/grub/menu.lst という設定「ファイル」を読み込み、それに従って、例えば /boot/vmlinuz-2.6.31.6 というカーネルイメージ「ファイル」を読みこんで起動できるのです。よって、GRUB ではカーネルイメージのファイル名が変わっても menu.lst を書き換えるだけで OK です。
GRUB はファイルシステムを扱うことはできますが、ドライブは BIOS を経由して認識しますので、ドライブの表記は Linux の流儀とは異なります。「BIOS がディスクを認識する順」に番号を割り振った (hd0), (hd1),… や (fd0), (fd1),… を使います。これはあくまで BIOS が認識する順番ですから IDE と SCSI の区別はなく、BIOS の設定で IDE が先なら IDE から、SCSI が先なら SCSI から順に番号が振られます。
| |

論理パーティションのパーティションテーブルは拡張パーティションの中にあります。
|
|
例えば、次のような IDE のハードディスクが2つ、SCSI のハードディスクか2つ、IDE の CD ドライブが一つの環境では、以下のように GRUB でのドライブ名が与えられます。
さて、ここで BIOS の設定を変えて SCSI を先に認識するようにすると、GRUB でのディスク名と機器との対応が変わります。よって、IDE と SCSI を併用する場合は、事前に BIOS がディスクを認識する順番を確認しするようにしてください。
GRUB でのパーティション番号は、Linux のデバイスファイルと基本的に同じです。ただし、GRUB では 0 から、Linux では 1 から数え始めるので、GRUB でのパーティション番号は「Linux での番号-1」になります。例えば、/dev/sda = (hd0) である環境では、/dev/sda1 = (hd0,0)、 /dev/sda5 = (hd0,4) となります。
さらに、GRUB でファイルを指定するときは、GRUB 形式のパーティション名に続けて、その「パーティション内のファイルシステム」でのパスを付けます。例を示すと、/dev/sda = (hd0) の環境で、/dev/sda3 を /boot にマウントしているならば、Linux 上で /boot/grub/menu.lst というファイルは、GRUB では (hd0,2)/grub/menu.lst となります。
GRUB の動作は GRUB を MBR にインストールした場合とパーティションにインストールした場合で異なります。ここでは ARMA 標準の動作である MBR にインストールした場合について、PC 互換機の電源投入後の動きを追って説明します。
マシンの電源投入後、BIOS は MBR に書き込まれた GRUB stage1 を読み込みます。446Bytes 以下の stage1 ではファイルシステムを認識する余裕がないので、stage1 はセクタを直接指定して stage 1.5 を読み込みます。この stage 1.5 は MBR 直後にある「パーティションに割り当てられないセクタ」に書き込まれているので、そこを使う特殊なプログラム (多くの場合は他のブートローダ) を使わない限り書き換えられる心配はありません。
| |

CD-ROM など、BIOS がハードディスクと認識しない機器は GRUB では無視されます。またこの他に USB メモリをドライブとしてカウントする場合など、BIOS によって変わる場合があります。
|
|
stage1.5 は、XFS, Ext2, ReiserFS, JFS, FAT などのファイルシステムのうち「1 つだけ」を認識でき、stage2 を読み込みます。stage2 は GRUB メニューや GRUB シェルを含む GRUB の本体です。stage2 は先程挙げたファイルシステムを「全て」認識でき、設定ファイルを読み込んで解釈して GRUB メニューを表示します。後は GRUB メニューや GRUB シェルを通じてユーザの指示した通りに OS を起動するわけです。
GRUB の設定ファイルは /boot/grub/menu.lst です。
|
timeout 15
|
| title ARMA 3.0 (2.6.31.6)
| root (hd0,1)
| kernel /boot/vmlinuz-2.6.31.6 root=/dev/sda2 vga=0x301
|
| title Windows
| rootnoverify (hd0,0)
| chainloader +1
|
|
|
timeout 行では GRUB メニューでユーザの選択を待つ時間を秒単位で設定します。時間切れになると、一番最初に書かれている OS を自動的に起動します。
title 行には GRUB メニューに表示させる OS の識別名を指定します。個々の OS の起動設定は、この title 行から次の title 行までの間に書きます。
root 行では GRUB の「ルートデバイス」、即ち GRUB が作業対象とするパーティションを指定します。通常は起動したい OS があるパーティションを GRUB 形式で指定すればよいでしょう。
| |

インストーラはあらかじめ、GRUB のインストール時に stage2 の所在とそこのファイルシステムの種類を調べ、それを認識できる stage1.5 を選んでインストールしています。
|
|
kernel 行では起動させる OS のカーネルイメージファイルを GRUB 形式のパスで指定し、同時にカーネルオプションを与えます。このとき、イメージファイルがルートデバイスにあれば、パスのうちパーティションを表す部分、上の例で言えば (hd0,0)/boot/vmlinuz-2.6.31.6 と書くべきところの (hd0,0) を省略できます。さらに、Linux を起動する場合は、最低限のカーネルオプションとして root= に続けて / にマウントするパーティションを指定しておきます。
rootnoverify 行は root と似ていますが、GRUB にルートデバイスのファイルシステムを認識させない点が違います。
GRUB が認識できないファイルシステムを使う OS をチェインロードする場合などに使います。
chainloader 行にはチェインロードするブートローダのセクタを X+Y の形式で、X にブートローダの先頭セクタの番号 (0 なら省略可)、Yには読み込むセクタ数を指定します。つまり、上の例の +1 では先頭 1 セクタを読み込むことを表しています。
| 3.5.6 GRUB メニューと GRUB シェル
|
|
| |

逆に言えば、イメージファイルはルートデバイスになくても構いません。例えば、ハードディスクから起動するのにカーネルのイメージファイルは FD から読み込ませることも可能です。
|
|
設定ファイルを変更したらマシンを再起動します。設定が正しければ以下のような GRUB メニューが表示されます。GRUB メニューでは[↑][↓]で起動する OS を選択し、[Enter]で起動できます。一時的に設定を変更して起動するには、OS を選択した後[e]で編集画面に入ると行単位での編集ができます。
|
| GRUB version 0.97 (639K lower / 261056K upper memory)
|
| +-------------------------------------------------------------------+
| | ARMA 3.0 (2.6.31.6) |
| | Windows |
| | |
| | |
| | |
| | |
| +-------------------------------------------------------------------+
| Use the ↑ and ↓ keys to select which entry is highlighed.
| Press enter to boot the selected OS, 'e' to edit the
| commands before booting, or 'c' for a command-line.
|
| The highlighted entry will be booted automatically in 15 seconds.
|
|
|
| |

実際の画面とは少々異なります。
|
|
何らかのエラーが発生した場合や、GRUB メニューで[c]を押した場合は GRUB シェルに入ります。GRUB シェルは /boot/grub/menu.lst に書いたような GRUB の内部コマンドを実行できる「OS を手動で起動する」ための専用シェルです。ARMA3.0ではGRUB のキーボードは日本語に固定されています。英語キーボードをお使いの場合は以下の表を参考に (特に記号部分を) 読み替えてください。
この GRUB シェルのおかげで、ブートローダのトラブル時にとれる対策の幅が広がります。例えば、カーネルイメージの入った GRUB 起動フロッピーディスクを用意しておけば、殆どどんな場合でもとにかく OS を起動することだけはできます。
それでは、GRUB シェルの利用例として Linux と Windows の起動例を示しておきましょう。基本的には /boot/grub/menu.lst に書いたことをそのまま 1 行ずつ入力し、最後に boot で起動するだけです。
|
grub> find /boot/vmlinuz-2.6.31.6
| (hd0,0)
|
| grub> root (hd0,1)
| Filesystem type is xfs, partition type 0x83
|
| grub> kernel /boot/vmlinuz-2.6.31.6 root=/dev/hda2 vga=0x301
| [Linux-bzImage, setup=0x1400, size=0x10f456]
|
| grub> boot
|
|
|
|
grub> rootnoverify (hd0,0)
| Filesystem type is fat, partition type 0xe
|
| grub> chainloader +1
|
| grub> boot
|
|
|
GRUB をアップグレードする場合、他のブートローダなどによって GRUB stage1 や stage1.5 が上書きされてしまい GRUB が起動できなくなった場合、stage2 の GRUB 形式でのパスが変わった場合、もしくは stage2 が入っているファイルシステムの種類が変わった場合には GRUB の再インストールが必要です。再インストールには様々な方法がありますが、ここでは最も確実な、GRUB をインストールしたフロッピーディスク (以下 GRUB FD) を使う方法を紹介します。
まず、GRUB FD を持っていない場合は次の手順で作ります。
|
# cd /boot/grub
| # dd if=stage1 of=/dev/fd0 bs=512 count=1
| # dd if=stage2 of=/dev/fd0 bs=512 seek=1
|
|
|
GRUB をアップグレードする場合は、grub パッケージは安全のため直接 /boot/grub のファイルを書き換えず /usr/lib/grub/i386-pc にファイルを置く仕様になっているため、/usr/lib/grub/i386-pc の GRUB 関連ファイルを全て /boot/grub にコピーしておきます。
さて、準備ができたら GRUB FD でマシンを再起動し、GRUB シェルに入ります。そして、Linux でいう /boot/grub があるパーティションをルートデバイスにしてから setup<ディスク> で GRUB をインストールします。
|
grub> root (hd0,1)
| Filesystem type is xfs, partition type 0x83
|
| grub> setup (hd0)
| Checking if "/boot/grub/stage1" exists... yes
| Checking if "/boot/grub/stage2" exists... yes
| Checking if "/boot/grub/xfs_stage1_5" exists... yes
| Running "embed /boot/grub/xfs_stage1_5 (hd0)"... 20 sectors are embedded.
| succeeded
| Running "install /boot/grub/stage1 d (hd0) (hd0)1+20 p (hd0,1)/boot/grub/
| stage2 /boot/grub/menu.lst"... succeeded
| Done.
|
|
|
以上でインストールは完了です。
| |

GRUB シェル上ではタブ補完や Emacs 風の行編集も使えるため、ブートローダ上のプログラムとは思えないほど操作感は良好です。
|
|