GRUBの詳細

2001/01/21
コマンドライン

 GRUBはこのコマンドラインの説明なくして、本当は語れない。しかし初心者には難しい話も多いので、別のページにした。できればUNIXを知っている人に読んでもらいたい。
 


 GRUB version 0.5.96.1 (640k lower / 3072k upper memory)

 [Minimal BASH-like line editiing is supported. For the first word, TAB
  lists possible command completion. Anywhere else TAB lists the possible
  completions of a device/filename. ]

 grub>


 GRUB Shellは上記にもあるように、BASHライクファイル名補完機能をもっている。従って、lsこそできないが、忘れてしまったカーネル名なども何とか指定することができる。UNIX使いなら、全く説明するまでもないことだが、知らない人のために説明しておこう。

 例えば、「root」コマンドで目的のパーティションをルートに指定して、多分カーネルがあるであろう/bootディレクトリの分かっている先頭文字「vm」までタイプして、TABキーを押してみる。

[TABによるファイル名補完と候補の表示]


 grub> root (hd0,5)
   Filesystem type is ext2fs, partition type 0x83

 grub> kernel /boot/vm
   Possible files are: vmlinux-2.2.13-33 vmlinuz-2.2.13-33 vmlinuz vmlinuz-old1

 grub> kernel /boot/vmlinu

 上記のように候補が表示されると共に、ユニークにできる共通の部分までファイル名が補完される。これをうまく使えば、ファイルをパーティションの中から探すことができる。

 またこの補完機能は、「ファイル名」に限らない。例えば「(hd0,1)」といったハードディスクやパーティションを示す識別子に対しても有効である。実はあらゆるコマンド引数に有効なので、この機能は正確には「ファイル名補完機能」ではなく、「コマンド引数補完機能」というべきだろう。例えば、root (まで入力してタブを打った場合、次のように表示される。

[ディスクの候補の表示]


 grub> root (
 Pssibile disks are:  fd0  hd0  hd1

 grub> root (

 (の次は何らかのディスクを示すものが来るので、候補としてgrubが認識(つまりBIOSで認識)しているディスクが表示される。さらに(hd0まで入力してタブキーをたたくと次のようにパーティション候補が表示される。

[パーティションの候補の表示]


 grub> root (hd0,
 Pssibile partitions are:
  Partition num 0,  Filesystem type is unknown, partition type 0x7
  Partition num 1,  Filesystem type is fat, partition type 0xb
  Partition num 4,  Filesystem type is unknown, partition type 0x7
  Partition num 5,  Filesystem type is ext2fs, partition type 0x82
  Partition num 6,  Filesystem type is ext2fs, partition type 0x82
  Partition num 7,  Filesystem type is unknown, partition type 0x83

 grub> root (

 そのハードディスクに存在するパーティションの情報が見える。パーティションの情報としては、パーティション番号ファイルシステム、及びパーティションタイプだ。ファイルシステムはgrubが認識できるものだけが、その名称で表示され、それ以外は「unknown」となっている。パーティションタイプは16進数で表示される。この機能を使えば、ハードディスクの中からext2fsパーティションなどを見つけることもできる訳である。
 

 ところで先ほどのファイル名の補完だが、これは今ルートになっている(rootコマンドで指定した)パーティションからしか探してはくれない。ハードディスク上のどこのパーティションにカーネルなどがあるかも分からない場合、ファイル名を指定して、そのファイルが存在するパーティションを探してくれる機能もある。find」コマンドだ。

[「find」コマンドによるファイルの検索]


 grub> find /boot/vmlinuz
   (hd0,6)  (hd0,7)  (hd1,1) (hd1,5)

 本物のshellのfindコマンドよりは遥かに単純で、引数は絶対パス名のファイル名(ディレクトリ名もだめ)しか取れないが、そのファイルの存在するパーティションを教えてくれる。

 またファイルがテキストならcat」コマンドで内容を確認することもできる。

[「cat」コマンドによるファイル内容の表示]


 grub> cat /etc/fstab
    ・
   ・・・ファイルの内容表示
    ・
    ・

 ルートパーティションがわからないときに、/etc/fstabを確認するときは便利である。



実践編

 コマンドをうまく組み合わせれば、あたながその内容を全く知らないパソコンの前に立って、GRUBのプロンプトを見たときでも、そのパソコンにインストールされているLinuxを起動させてしまうことができる。次のような手順である。

 まずはとにかく接続ハードディスクパーティションを確認しよう。これはroot (と入力してTABキーだった。
 


 grub> root (
 Pssibile disks are:  fd0  hd0  hd1

 grub> root (hd0,
 Pssibile partitions are:
  Partition num 0,  Filesystem type is ext2fs, partition type 0x83
  Partition num 4,  Filesystem type is ext2fs, partition type 0x83
  Partition num 6,  Filesystem type is ext2fs, partition type 0x83
  Partition num 7,  Filesystem type is unknown, partition type 0x82
 

 沢山Linux Native(ext2fs)のパーティションがある。この中のどこかにカーネルがあるはずである。適当にあたりをつけて、ファイルを探してみる。どうせLinuxのカーネルなど、ルート/bootvmlinuzか何かの名前で存在しているに決まっているから、/vmlinzあたりで、探して見よう。
 


 GRUB version 0.5.96.1 (640k lower / 3072k upper memory)

 [Minimal BASH-like line editiing is supported. For the first word, TAB
  lists possible command completion. Anywhere else TAB lists the possible
  completions of a device/filename. ]

 grub> find /boot/vmlinuz
 
 Error 15: File not found

 grub> find /vmlinuz
  (hd0,0)

 /boot/vmlinuzでは見つからなかったが、/vmlinuzはあった。早速このパーティション(hd0,0)「/dev/hda1」をルートに指定して(これにより、そのパーティションに移動したイメージとなる)、更にルートディレクトリのファイルを見てみる。
 


 grub> root (hd0,0)
   Filesystem type is ext2fs, partition type 0x83

 grub> find /
   Possible files are: vmlinux-2.2.13-33 vmlinuz-2.2.13-33 vmlinuz initrd boot.b
  chain.b os2_d.b boot.0200 boot.0308

 ルートコマンドで、そのパーティションが確かにext2fs(Linux Native)であることも確認できた。「find /」のあとTABを打てば、/ディレクトリ配下のファイルを表示してくれる。ちょっとしたlsコマンドの役目を果たすという訳だ。

 いろんなファイルが見つかったが、カーネルは「vmlinuz」で良さそうだ。きっとvmlinuz-2.2.13-33にシンボリックリンクが張ってあるのだろう。initrdもあるからRAMディスクも指定する必要があることも分かる。

 次にルートパーティションを調べる必要がある。このパーティションが(hd0,0)であることから、ルートパーティションは「/dev/hda1」である可能性もあるが、昔からの習慣でカーネルをルートパーティションとは別のパーティションに置き、このブート用のパーティションを/bootとしてマウントしている可能性がある。それにルートパーティションは、SCSIハードディスクやセカンダリのハードディスクだという可能性もある。「cat」コマンドで/etc/fstabを確認しよう。
 


 grub> cat /etc/fstab
 
 Error 15: File not found

 grub> find /etc
 Error 15: File not found

 「/etc」ディレクトリすら見つからない。やはりこのパーティション(hd0,0)「/dev/hda1」ルートパーティションではないようである。では、findで「/etc/fstab」を探しよう。
  


 grub> find /etc/fstab
  (hd0,4)

 (hd0,4)「/dev/hda5」にあった。一応このパーティションに移って、/etc/fstabの内容を確認しよう。
 


 grub> root (hd0,4)
  Filesystem type is ext2fs, partition type 0x83
 
 grub> cat /etc/fstab
 /dev/hda5          /                        ext2     default         1   1
 /dev/hda1          /boot                  ext2     default         1   1
 /dev/hda6          /usr                    ext2     default         1   1
 /dev/hda7          /home                 ext2     default         1   1
 /dev/fd0           /mnt/floppy          ext2     noauto,users  0  0

 間違いない。ルートパーティションは/bootとは別のパーティションだ。さすがに「etc」ディレクトリは、別のパーティションにマウントはされていないようなので、/etc/fstabが見つかったこのパーティション(hd0,4)「/dev/hda5」が、ルートパーティションであることは間違いないようである。

 これでカーネル、ルートパーティション、初期RAMディスクの位置を確認できたので当該Linuxを起動できる。

 尚、ここで誤解されがちなのだが、ルートからみた場合、カーネルは/boot/vmlinuzなのだが、これはあくまで/dev/hda5パーティションをルートパーティションの/bootにマウントしているためにこう見えるのであって、/dev/hda5パーティション上ではあくまでファイルシステムのルートにこのvmlinuzは存在する。

 従って、GRUBのカーネル指定では、root指定したパーティションのファイルシステム上で見える形、つまり、この場合は「/boot/vmlinuz」ではなく、「/vmlinuz」と指定する。initrdも同様である。

 では、早速カーネルのあるパーティションにrootコマンドで戻って、起動してみよう。
 


 grub> root (hd0,0)
   Filesystem type is ext2fs, partition type 0x83

 grub> kernel /vmlinuz root=/dev/hda5
   [Linux-bzImage, setup=0xe00, size=0xa09e0]

 grub> initrd /initrd
  
[Linux-initrd @ 0x7078000, 0x177000 bytes]

 カーネルのロードも初期RAMディスクのロードもうまくいったようである。尚カーネルなどの指定は、直接パーティションも指定すれば、rootコマンドでそのパーティションを指定する必要はない。その場合、以下のような指定になる。
 


 grub> kernel (hd0,0)/vmlinuz root=/dev/hda5
   [Linux-bzImage, setup=0xe00, size=0xa09e0]

 grub> initrd (hd0,0)/initrd
   [Linux-initrd @ 0x7078000, 0x177000 bytes]

 
 さあ、後はもうブートするだけだね。最後にbootコマンドを叩く。
  


 grub> boot
    ・
  ブートメッセージ
    ・
    ・

 うまくLinuxが起動したらご喝采!!

 同じような手法で、他のOSも起動できてしまう。Windows系のOSは特にカーネルなどの指定もないので、もっと簡単に起動できてしまうだろう。

 こんな芸当ができるブートローダはGRUBをおいて他にはないだろう。

 


GRUBブートディスクの作成

 ただし上記の芸当を行う場合、あなたの知らないパソコンにGRUBがインストールされていないといけない訳だ。しかしGRUBブートディスクを用意しておけば、その必要すらないのである。

 GRUBブートディレクトリは、ブートフロッピーディスクの作成でも触れている方法でイメージから作成できるが、ここでは自分で作る方法を紹介する。またせっかく自分で作るので、前述の方法では作れない、Windowsからでもその中身を見えることができるDOSフォーマットのブートフロッピーディスクを作ってみよう。

 ブートフロッピーディスクを作成するにはGRUBコマンドが必要なのだが、ハードディスク上から実行する必要があるため、どうしてもパソコンにPC-UNIXが導入され、そこでGRUBがmakeされていなければならない。ここではLinux上でGRUBブートディスクを作るが、そのことは何ら起動しようとするパソコンにLinuxがインストールされていることを要求するものではない。完全に起動パソコンからは独立した、非常に汎用的なブートディスクになる。
 
[GRUBブートディスクの作成]


 > mount -t vfat /dev/fd0 /mnt/floppy/

 > mkdir /mnt/floppy/boot
    
 > mkdir /mnt/floppy/boot/grub
    
 > cp /boot/grub/stage* /mnt/floppy/boot/grub
    
 > grub
    

 まずはDOSフォーマットされたフロッピーディスクを用意してマウントする。次にそのフロッピー上に/boot/grubというディレクトリを作って、そこにstage1stage2を置く。(ブートフロッピーディレクトリの作成にはstage1_5ファイルは必要ない) その後でGRUB Shellを起動する。

[フロッピーへのGRUBのインストール]


 GRUB version 0.5.96.1 (640k lower / 3072k upper memory)

 [Minimal BASH-like line editiing is supported. For the first word, TAB
  lists possible command completion. Anywhere else TAB lists the possible
  completions of a device/filename. ]

 grub>
root (fd0)
  Filesystem type is fat,  using whole disk

 grub> setup (fd0)
  Checking if "/boot/grub/stage1" exists...  yes
  Checking if "/boot/grub/stage2" exists...  yes
  Running "install /boot/grub/stage1 d (fd0) /boot/grub/stage2 p /boot/grub/menu.lst ... succeeded
 Done.

 

 使うコマンドはMBRにインストールする場合と同じだ。パラメータにそれぞれフロッピーディスクドライブである(fd0)を指定する。以上で、GRUBブートディスクの完成だ。このブートディスクでどんなパソコンでも、大抵のOSが起動できるはずである。


戻る