Hatena::Grouplinux2

Going My Linux Way このページをアンテナに追加 RSSフィード

2012年04月13日(金)

Grub2 の設定

| 23:49 | Grub2 の設定 - Going My Linux Way を含むブックマーク はてなブックマーク - Grub2 の設定 - Going My Linux Way Grub2 の設定 - Going My Linux Way のブックマークコメント

Ubuntuブートローダは Grub2 です。

いつのころからか Grub から Grub2 になってました。

ちなみに、Grub2 というけれどバージョンは 1.99 です。(何で!?)

設定

/boot/grub/grub.cfg が設定ファイルです。

流儀としては、このファイルを直接修正せずに以下の手順で設定を変更します。

  1. 構成ファイルを修正する
    1. /etc/default/grub
    2. /etc/grub.d/* (00_header、10_linux、...など)
  2. update-grub を実行する

update-grub を実行すると/boot/grub/grub.cfg が再作成されます。grub-install もしてくれるようです。

ググると update-grub2 というコマンドもでてきますが、それは update-grub のリンクです。

[追記:2012/04/21]

でも、grubインストール先を明示的に指定、あるいは変更する場合は、grub-install を使います。

$ sudo grub-install /dev/sda   # /dev/sda へインストール

/etc/default/grub

デフォルトで、ブート時の GRUB メニューが非表示なのは、このファイルの設定です。

以下を修正すると表示されるようになります。

  :
#GRUB_HIDDEN_TIMEOUT=0     # (この行をコメントアウトする)
  :

/etc/grub.d/*

デフォルトで以下のようになってます。

$ ls -F /etc/grub.d/
00_header*        10_linux*      20_memtest86+*  40_custom*  README
05_debian_theme*  20_linux_xen*  30_os-prober*   41_custom*

ファイル名の頭の番号はネームスペースになっていて分類されています。

README に説明があります。

All executable files in this directory are processed in shell expansion order.

  00_*: Reserved for 00_header.
  10_*: Native boot entries.
  20_*: Third party apps (e.g. memtest86+).

The number namespace in-between is configurable by system installer and/or
administrator.  For example, you can add an entry to boot another OS as
01_otheros, 11_otheros, etc, depending on the position you want it to occupy in
the menu; and then adjust the default setting via /etc/default/grub.

既存のものはシェルスクリプトで書かれていますが、実行可能ファイルなら何でも構わないようです*1。(つまり、シェルスクリプトでも実行権付与を忘れると有効になりません)

これらは、update-grub 実行時に実行されます。

標準出力grub.cfg の断片を出力するように作成します。

update-grub 実行時も、標準入力標準エラー出力TTY に繋がったままなので、やろうと思えば会話的に処理することも可能です。

halt エントリと reboot エントリ

GRUB のメニューに、halt エントリと reboot エントリを追加してみます。

お遊びですが、以下の Ruby スクリプトで構成ファイルを作成して、エントリのラベルは update-grub 実行時に会話的に入力するようにしてみます。

/etc/grub.d/42_custom.rb

#!/usr/bin/env ruby
# -*- coding: UTF-8 -*-

$stderr.print "Enter label for 'halt': "
label_halt = $<.gets.chomp
label_halt = 'halt' if label_halt.empty?

$stderr.print "Enter label for 'reboot': "
label_reboot = $<.gets.chomp
label_reboot = 'reboot' if label_reboot.empty?

print <<-EOF
menuentry "#{label_halt}" {
  halt
}

menuentry "#{label_reboot}" {
  reboot
}
EOF

実行。

$ sudo chmod +x /etc/grub.d/42_custom.rb  # 実行権付与
$ sudo update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.0.0-17-generic
Found initrd image: /boot/initrd.img-3.0.0-17-generic
Found linux image: /boot/vmlinuz-3.0.0-15-generic
Found initrd image: /boot/initrd.img-3.0.0-15-generic
Found linux image: /boot/vmlinuz-3.0.0-12-generic
Found initrd image: /boot/initrd.img-3.0.0-12-generic
Found memtest86+ image: /boot/memtest86+.bin
Enter label for 'halt': Goodbye, world!    # ここで「Goodbye, world!」入力
Enter label for 'reboot': I'll be back!!   # ここで「I'll be back!!」入力
done

で、リブートします。すると 更新された GRUB メニューが表示されました。

f:id:lnznt:20120413233824j:image

「Goodbye, world!」を選択すると halt します。

「I'll be back!!」を選択すると reboot します。

(すごい勢いで落ちるんですが大丈夫なんだろうか。。。)

----

42_custom.rb は後でオーソドックスなシェルスクリプトに差し替えました。

*1:公式に保証されているかわかりません

トラックバック - http://linux2.g.hatena.ne.jp/lnznt/20120413