Debian/Ubuntu JP Advent Calendar 2012 – grub2のデフォルト起動エントリーを変更する

Pocket

この記事は Debian/Ubuntu JP Advent Calendar 2012 : ATND の 12/6(木) の記事です。

今日のお題はDebianのデフォルトブートローダーであるgrub2の起動エントリーを変更する方法について紹介します。

現在のgrub2は設定ファイルである/boot/grub/grub.cfgを直接編集することはなく、基本的な制御は/etc/default/grubを編集し、update-grubを実行することでgrub.cfgを再生性させる使い方が正しいとされています。

デフォルトでインストールされる/etc/default/grubでは、エントリーの一番先頭がデフォルトで選択されるようになっています(GRUB_DEFAULT=0)。複数のOSをインストールしている環境では、毎回カーソルキーで起動OSを選択するのは面倒だと思うので、一度選択したエントリーを記憶させるモードを使っている人も多いと思います。

具体的には、以下のような感じに/etc/default/grubを書き換えます。

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

#GRUB_DEFAULT=0
GRUB_SAVEDEFAULT=true
GRUB_DEFAULT=saved

GRUB_DEFAULT=0をGRUB_DEFAULT=savedにかえ、GRUB_SAVEDEFAULT=trueを追加します。これで次回起動したOSのエントリーが/boot/grub/grubenvにsaved_entry=OS Entry Nameという形で保存されます。

これは、Debianが起動中であればgrub-set-defaultコマンドで変更させることができます。エントリー名はgrub.cfgのなかでmenuentry命令で定義しているので、grepしてみればどういう名前で登録されているかがわかります。

# grep menuentry /boot/grub/grub.cfg
menuentry 'Debian GNU/Linux, with Linux 3.2.0-4-amd64' --class debian --class gnu-linux --class gnu --class os {
menuentry 'Debian GNU/Linux, with Linux 3.2.0-4-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {
menuentry "Windows 8 (loader) (on /dev/sda1)" --class windows --class os {

たとえばこの状態で、grub-set-default “Windows 8 (loader) (on /dev/sda1)”を実行すれば、grubenvが書き換わり次回の起動時に自動的にWindows8を起動するエントリーが初期選択される状態になります。

これで、リモートから起動するOSを変更することも可能です。

過去の記事、「Windons7のVirtualBoxでデュアルブート用のraw partitionにあるLinuxを起動させる」と連携すれば、Windows OS側で一度VirtualBoxを起動し、その中のDebianでgrub-set-defaultを実行することで、Windowsでもgrubのエントリー変更させることが間接的に可能です。できれば直接Windowsでgrubenvの修正ができるとよいのですが、/boot/grub以下の読み書きができないといけないのでちょっと難しいでしょうね。