GRUBの使い方入門

 コンピュータの電源を入れると最初に実行されるソフトウェアが、オペレーティングシステムを起動するためのブートローダだ。多くのLinuxシステムにはGRUB(GRand Unified Bootloader)というブートローダが組み込まれており、その働きによってLinuxカーネルが起動される。今回は、GRUBの開発経緯とインストールや設定に関するヒントを紹介しよう。

 Erich Stefan Boleyn氏の手で開発されたGRUBは、現在GNUプロジェクトの一部になっている。最新のプロダクション版はGRUB 0.9xで、GRUB Legacyとも呼ばれている。2002年、開発者たちの関心がGRUB 2に移ったことでこのGRUB Legacyコードへの機能追加はストップしたが、今でも定期的にパッチやバグフィックスが提供されている。GRUB 2はまだ開発バージョンなので、大半のディストリビューションは依然としてGRUB Legacyに頼っている。

 GRUBはどのオペレーティングシステム(OS)にも依存していない。フリーソフトウェア財団(Free Software Foundation)のMultiboot Specificationに準拠して書かれているため、ほとんどすべてのOSをブートできる。事実、2つ以上のOSをハードディスクにインストールすれば、1台のコンピュータで複数のOSのブートが可能になる。以下に、GRUBの機能を示す。

  • 動的コンフィグレーション。ユーザはブート時に設定やパラメータを変更可能。
  • 複数の実行ファイル形式およびハードディスクのファイルシステムに対応。
  • GUIとCLIのどちらのインタフェースでも、ブート対象のOSを選択可能。

 Linux環境で(カーネルのブートを別にして)よく実行されるGRUBのタスクの1つに、LinuxとMicrosoft Windowsのデュアルブート化がある。デュアルブートシステムを作り上げる一般的なパターンは、まずWindowsをインストール(まだインストールしていない場合)し、その後、別のハードディスクまたは空いているパーティションにLinuxをインストールするというものだ。ほとんどのLinuxディストリビューションは、Windowsインストール環境の存在を検知して、オープンソースのブートローダ(GRUB、LILOなど)のインストール作業とLinux/Windowsのデュアルブート設定を自動的に行ったうえでWindowsのブートローダの置き換えまでやってくれる。

GRUBのインストール

 GRUBを使用する大半のLinuxディストリビューションには、すぐに使える状態でGRUBがインストールされている。デフォルトでGRUBがインストールされていないディストリビューションでは、パッケージシステムにGRUBが入っていることが多いので、手動インストールを始める前に、まずはそこをチェックしてほしい。

 すでに別のブートローダがインストールされている場合は、そのブートローダでサポートされていないOSを使おうとするのでない限り、わざわざGRUBに入れ換える必要はない。

 GRUBのインストール途中に問題が起こった場合は、マシンが起動しなくなる恐れがある。何をしようとしているのかわからない人は、問題発生時に表示される指示をプライマリハードディスク(/dev/hda、SCSIやSATAハードディスクの場合は/dev/sda)に対して適用すべきではない。それよりも、最初にUSBドライブかフロッピーディスクドライブで試してみることだ。

 GRUBを手動でインストールするには、GNUのWebサイトからGRUBをダウンロードし、それがLegacy版であることを確認する。パッケージを入手したら、以下のコマンドによって展開、ビルド、インストールを行う。

tar -xzvf grub-0.9x.tar.gz
cd grub-0.9x
./configure
make
sudo make install

 最後の行でsudoコマンドを使っているのは、rootユーザによる実行が必要なためだ。すべてうまく行けば、GRUBがインストールされ、使える状態になる。ビルドやインストールの途中で問題が起きた場合は、参照先としてGRUBのFAQやGRUB wikiが役に立つ。

GRUBメニューの設定

 ほとんどのユーザがGRUBに対して求めることは、決まったOSの自動ブート、またはハードディスクにインストールされたOSからのブート対象の選択だろう。そのためにGRUBメニューの機能が存在する。その設定ファイルが、GRUBのインストールされているドライブの「grub」ディレクトリにあるmenu.lstだ。ブートの途中でこのファイルが見つかると、GRUBは自動的にそのメニューを読み込む。

 メニュー設定は、普通のプレーンテキストに一連のディレクティブ(命令)と設定パラメータが記したものだ。以下に、Ubuntu 7.04向けのデフォルトのmunu.lstファイルを簡略化したものを示す。

default	   0
timeout    3
hiddenmenu

title      Ubuntu, kernel 2.6.20-15-generic
root       (hd0,0)
kernel     /boot/vmlinuz-2.6.20-15-... ro quiet splash
initrd     /boot/initrd.img-2.6.20-15-generic
  • defaultは、デフォルトのエントリを示す。1つのエントリには、少なくともtitlerootkernelという3つのディレクティブが含まれる。エントリ番号は0から順に割り当てられる。
  • timeoutは、メニューの表示時間を秒単位で表したもの。この時間が過ぎるとデフォルトエントリの実行が始まる。
  • hiddenmenuは、メニューの表示を行わないことを意味する。このパラメータは、ユーザに選択を求めずに自動でブート処理を行うときに用いられる。
  • titleは、エントリ実行前のメニューに表示されるテキストを示す。
  • rootは、このエントリのカーネルが存在するデバイスとパーティションをGRUBに対して指定する。
  • kernelは、そのエントリが選択された場合にブートするカーネルを示す。このディレクティブの後に続くオプション群は、カーネルに渡されて処理される。roは読み取り専用(物理的にデバイスは読み取り専用ではないので、カーネルによる書き込みを回避するだけのもの)であることを、quietはデバッグ情報を表示しないことを、splashはブート処理中にスプラッシュ画面を表示することをそれぞれ意味する。
  • initrdは、カーネル読み込み後に実行する初期化処理をGRUBに指定する。これらのディレクティブが実行されると、システムの制御がGRUBからOSへと移る。

 ここでは、その他いくつかのパラメータを設定することができる。カラースキームの指定、スプラッシュ画像の背景表示、さらにはメニュー保護用のブート時パスワードの指定といったことが可能だ。GRUBのマニュアルには、利用できるコマンドの一覧が記されている。

 GRUBでWindowsをブートする必要があるなら、先ほどのメニュー設定ファイルに以下のようなエントリを追加するとよい。これは、プライマリハードディスクにインストールされたWindows 2000をブートする命令をGRUBに与えるものだ。

title Windows 2000
unhide (hd0,0)
hide (hd0,1)
hide (hd0,2)
rootnoverify (hd0,0)
chainloader +1

まとめ

 GRUBを使えば、カスタマイズされたLinuxディストリビューションのUSBドライブからの直接ブート、組み込みデバイスの自動ブート、使用するディストリビューションやOSを選択できるマシンの構築といったことが可能だ。

コラム:GRUBを使ったUSBドライブからのブート

 かつてGRUBは、汎用のブート用フロッピーディスクの作成によく使われていた。GRUBを有効化したフロッピーディスクを使うと、システム上でGRUBが認識すればどんなOSでも直接ブートすることが可能であった。この点は、マスターブートレコード(MBR)が壊れたパーティションの修復やシステムのリカバリに活用された。

 時代は変わり、最近のコンピュータの多くはフロッピーディスクドライブを搭載しなくなった。その代わり、USBドライブからブートを行うことができる。必然的に、GRUBはUSBドライブに適応していくことになる。GRUBを使ってUSBドライブからブートを行うには、パーティションが適切に設定され、サポートされたファイルシステム(BSD FFS、DOS FAT 16およびFAT 32、Minix fs、Linux ext2fs、ReiserFS、JFS、XFS、VSTa fs)を持つUSBドライブをまず用意する。あとは、rootまたはsudo権限のあるユーザでログインし、以下の手順を実行すればよい。

 最初に、USBドライブのマウントを行う。多くのディストリビューションでは、システムがUSBストレージデバイスを認識すると自動的にマウントしてくれる。自動マウントが行われないディストリビューションの場合は、SCSI管理ツール群を含むsg3-utilsパッケージをインストールする必要がある (LinuxではUSBドライブがSCSIとして処理されるため)。sg3-utilsのインストール後、「sg_scan -i」を実行してデバイスの一覧からUSBドライブのデバイス名を見つけ出し、/dev/sg*という情報を書き留める。続いて、sg_mapを実行してデバイスが実際にどのような形でシステムにマッピングされているか確認する。具体的には/dev/sg*という名前にマッピングされている/dev/sd*の行を探してデバイス名を取得すればよい。私のマシンではUSBドライブが/dev/sdaになっているので、マウントを行うコマンドは次のようになる。

# mkdir /mnt/usb
# mount /dev/sda1 /mnt/usb

 次に、ブート用のステージファイルをUSBドライブにコピーする。ステージファイルは、GRUBを構成する実行ファイルである。ファイルシステムに合ったステージファイルをコピーする必要がある。GNOMEでは、USBドライブのアイコンを右クリックして「Properties」を選択すると、ファイルシステムの情報が「Volume」タブに表示される。GNOMEを実行していない環境でも、fdiskを使うとファイルシステムの種類がわかる。

 コピーすべきファイルは、stage1、stage2、そして使用しているファイルシステム用のステージファイルの3つである (以下の例では、ext2ファイルシステムに対応したe2fsステージファイルが使われている)。ステージファイルのコピーが終わったら、MBRの作成ができるようにUSBドライブをアンマウントする必要がある。

mkdir /mnt/usb/grub
cp /boot/grub/stage* /boot/grub/e2fs_stage1_5 /mnt/usb/grub/
umount /mnt/usb

 最後に、USBドライブにMBRをインストールする。MBRは、ブート処理専用としてデバイス上に確保された512バイトの非表示領域である。MBRのインストールには、GRUB関連の処理を行うシンプルなコマンドシェル、GRUBシェルを使用する。

grub
grub> device (hd0) /dev/sda
grub> root (hd0,0)
grub> setup (hd0)
grub> quit
  • deviceは、コマンドの実行時に使用するディスクデバイスを指定する。
  • rootは、GRUBがブートに使用するデフォルトパーティションの設定を行う。これは、先ほどステージファイルをコピーしたパーティションになる。なお、GRUBにおける数のカウントは1ではなく0から始まる。
  • setupは、USBドライブ上にMBRを作成する。
  • quitは、GRUBコマンドシェルを終了する。

 以上でGRUBのインストールが完了したので、USBドライブからのブートが可能である。ブートを実行すると、マシン起動時に大量のディレクトリ情報がGRUBシェルに表示されるはずである。コマンドシェルでどんなことができるかについては、GRUBコマンドラインのマニュアルを参照してもらいたい。

 昔のようにGRUBでフロッピーディスクを使いたいという人は、フロッピーディスクをFATファイルシステムでフォーマットし、上記の/dev/sda1を/dev/fd0に、hd0をfd0に置き換えて実行するとよい。

Chad Filesはソフトウェア開発者兼ライター。10年以上のソフトウェアアプリケーション開発経験があり、多数のオープンソースプロジェクトに貢献。最近はEmbedded GentooのメディアジュークボックスデバイスのブートにGRUBを利用している。

NewsForge.com 原文