3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(Linux)GRUB2でのマルチブート設定方法

Linuxディストリビューションの比較をするために、一台に複数のLinuxをインストールしてみました。

で、ハマったのがブートローダの設定です。

とりあえず、最初にUbuntuの軽量版 EcoLinux10.04 をインストール後、PuppyLinux4.31 を入れ、Ubuntu10.10を入れました。PuppyLinuxのインストールモードは FRUGAL(簡易インストール)です。(ブートローダEcoLinux付属のGRUBをHDDのMBRに設定しました。) PuppyLinuxインストール後にGRUBのmenu.lstにブートの設定を加えろとあったんで、EcoLinux側の/boot/配下を探したんですが、menu.lstのファイルが見つかりません。

どうやら、Ubunto9.10あたりから、GRUBのバージョンが1.9系(いわゆるGRUB2)に変わったようです。

以前WindowsLinuxでのマルチブートしてた頃はGRUB0.9系(GRUB Legacy)を使っていろいろやったりしてましたが、GRUB2 は大幅に設定方法が変わったようですね。。。。

ということで、GRUB2の設定に挑戦してみました。

GRUB2はブートするパーティションの設定ファイルが /boot/grub/menu.lst から、/boot/grub/grub.cfg に変わったようです。

しかし、このファイルは直接ユーザが編集してはいけないようです。

GRUB2自体の全般的な設定は /etc/default/grub に対して行い、起動パーティションの設定等(ブート時に表示されるメニューの中身)は、/etc/grub.d/ 配下にスクリプトで定義するようですね。

まずデフォルトのままだとPC起動時にGRUBのメニュー画面すら出てきません。

それを出すようにします。

# vi /etc/default/grub

下記の設定をコメントアウトします。

GRUB_HIDDEN_TIMEOUT=0

GRUB_HIDDEN_TIMEOUT_QUIET=true

#GRUB_HIDDEN_TIMEOUT=0

#GRUB_HIDDEN_TIMEOUT_QUIET=true

後は設定反映コマンドを叩きます。これをすることで、/boot/grub/grub.cfg に設定が反映されます。

# update-grub

(この update-grub コマンドは Ubuntu 系のもので実際は、"grub-mkconfig -o /boot/grub/grub.cfg" というコマンドをキックしているだけに過ぎないようです。なので他のディストリビューションgrub-mkconfig でやらないといけないかもしれません。)

/etc/grub.d/ 配下には、00_header , 05_debian_theme , 10_linux , 20_memtest86+ , 30_os-prober , 40_custom のファイルが有りますが、実際に触ることが多くなるのは 40_custom ファイルでしょう。

40_custom に任意のエントリ(ブートの設定)を書いていきます。

しかし、GRUB2の特徴はHDDにあるパーティションとOSを自動的に検出してくれることです。

この機能のお陰で、大抵は設定スクリプトをさわる必要がありません。

update-grub コマンド実行時にパーティション内のOSを自動検出し、ブートメニューに反映してくれます。

今回行った PuppyLinux は FRUGAL インストールなので、カーネルパーティションの /puppy431/vmlinuz に入ります。

よって、GRUB2はこれを自動認識できません。

ということで、40_custom ファイルにブートの定義を書いていきます。

PuppyLinux4.31 は /sda7/puppy431 にインストールしているとします。

menuentry "Puppy 431 frugal on sda1" {

set root=(hd0,7) ←ディスクNo(0から),パーティションNo(1から)

linux /puppy431/vmlinuz psubdir=puppy431

initrd /puppy431/initrd.gz

}

ちなみに Puppy を FULL インストールした場合は update-grub コマンドで自動的的に認識してくれました。

インストールウィザード最後のGRUBの設定は GRUBの更新/インストール を選び、更新を選択すると、下記の設定を menu.lst に書けといいます。

title Puppy Linux 431 full install in sda7

root(hd0,6)

kernel /boot/vmlinuz root=/dev/sda7 pmedia=atahd

もし、これをGRUB2の 40_custom に手動で定義するならこうなります。

menuentry "Puppy Linux 431 full install in sda7" {

set root=(hd0,7)

linux /boot/vmlinuz root=/dev/sda7 pmedia=atahd

}

パーティションの数え方はGRUB Legacy時代と変わったようです。

GRUB Legacyの時は、0からカウントしていたため /sda1(redhat系だとhdaって表記するんですけどね) の場合は、0 としてましたが、GRUB2からは1からカウントするようになったため、/sda1 の場合は1となります。(sdaとかhdaについてる数字をそのまま使えばいいようになったわけですね。)

ブートメニューのデフォルト項目を設定するには、/etc/default/grub を編集します。

設定する値は、メニューに出てくる文字列つまり、/boot/grub/grub.cfg の menuentry の値となります。

# vi /etc/default/grub

#GRUB_DEFAULT=0

GRUB_DEFAULT="Ubuntu, with Linux 2.6.32-21-generic"

GRUB Legacy時代は最初のブートパーティションになる menu.lst さえ変更すればよかったので、どのOSからでも操作できましたが、GRUB2の場合GRUBを入れたOSからでないと編集できないのが不便ですね。

参考:

ブートローダー「GRUB2」とは?どんな設定変更が、どのように可能か? | Viva! Ubuntu!!

野利庵日録:GRUB2導入に準備する

野利庵日録:(GRUB2の話) Ubuntu9.10 本家デスクトップ版を入れてみた

(Ubuntu 9.10) Grub2の設定 (r271-635) 任意のエントリを削除する方法も載っています。

【Ubuntu 9.10】Grub2 でメニューの表示順序を変える:なんでもかんでもコンピュータ メニュー順序変更も載ってますが、update-grubgrub-mkconfigを使っていることが説明されています。

8.4. GRUB を用いたブートプロセスの設定:

パソコンユーザのつぶやき: Grub2の起動メニューエントリー追加 PuppyLinux Frugalインストール Grub2にPuppy Frugalのメニューを追加する方法です。