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)に変わったようです。
以前WindowsとLinuxでのマルチブートしてた頃は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 Legacy時代は最初のブートパーティションになる menu.lst さえ変更すればよかったので、どのOSからでも操作できましたが、GRUB2の場合GRUBを入れたOSからでないと編集できないのが不便ですね。
参考:
ブートローダー「GRUB2」とは?どんな設定変更が、どのように可能か? | Viva! Ubuntu!!
野利庵日録:(GRUB2の話) Ubuntu9.10 本家デスクトップ版を入れてみた
(Ubuntu 9.10) Grub2の設定 (r271-635) 任意のエントリを削除する方法も載っています。
【Ubuntu 9.10】Grub2 でメニューの表示順序を変える:なんでもかんでもコンピュータ メニュー順序変更も載ってますが、update-grubがgrub-mkconfigを使っていることが説明されています。
パソコンユーザのつぶやき: Grub2の起動メニューエントリー追加 PuppyLinux Frugalインストール Grub2にPuppy Frugalのメニューを追加する方法です。