06 December 2009

(Ubuntu) Grub2の設定

Grub2ブートローダの設定メモ

検証環境

OSがアップデートする毎に、このページの情報を改定・追記している
・Ubuntu 9.10
・Ubuntu 10.04
・Ubuntu 11.10
・Ununtu 12.04
・Ubuntu 14.04
・Ubuntu 16.04

Grub 1からGrub 2に変更時の注意事項

■ /boot/grub/grub.cfg を直接編集しない
旧来のGrub 1では、このファイルを編集したが、Grub 2では、このファイルはupdate-grubコマンドで自動作成されるので編集してはいけない。

■ 設定ファイル一覧
/etc/default/grub : 全般的な設定(タイムアウトやデフォルトの設定値など)
/etc/grub.d/* : メニュー項目やインターフェースの設定ファイル群
/usr/share/grub/grub-mkconfig.lib : パーティション情報などからgrub.cfgを作成する設定ファイル

■ 実行ファイル一覧
grub-install : Grub2をMBRやPBRに書き込む
update-grub : 設定ファイルを用いて/boot/grub/grub.cfgを作成する
update-grub2 : update-grubと同じ
grub-probe : 指定されたパーティションの情報を表示する(/etc/grub.d/* 内から呼び出される)

Grub2ブートローダをMBR(またはPBR)にインストールする

インストールしたい場所(/dev/sdaや/dev/sda2 などのデバイス名)を引数に指定して grub-install コマンドを実行する。

grub-install /dev/sda

上書きされたGrub2ブートローダを再インストールする

Windowsの再インストールなどでMBRのGrub2ブートローダが削除されてしまった場合の復旧方法。

・UbuntuのインストールDVDで起動する
・Grub2のStage2がインストールされているパーティションをマウントする
・Grub2をMBRにインストールする

sudo grub-install --boot-directory=/media/ubuntu/ubuntu_partition/boot /dev/sda

赤で着色した/media/ubuntu/ubuntu_partitionが、マウントされたStage2のあるパーティション

・grub.cfgの再構築(再起動後にエラーとなり、Grubメッセージに従いrootパスワードを入力することでコンソール画面に移行するので、そこでこの作業を行っても良い)

sudo update-grub

memtest+86や他のOSのエントリを消去する

/etc/grub.d/ディレクトリの設定スクリプトの実行権限を削除すればよい。
・Ubuntu Forums The Grub 2 Guide 『Adding Entries to Grub 2』の”Omitting memtest86+”に書かれている方法を用いる。

memtest+86 : chmod -x /etc/grub.d/20_memtest86+
他のOS : chmod -x /etc/grub.d/30_os-prober

(自動的に追加される)特定のエントリを消去する

/etc/grub.d/30_os-prober で自動的に加えられるエントリに不必要なものがある場合 (例えば、リカバリ用のパーティション)の対処方法。
・Ubuntu Forums Grub 2 Title Tweaks の『F. Hiding Windows (Vista) Recovery Partition Entry』セクションに書かれている方法を用いる。

まず、/boot/grub/grub.cfgで消したいエントリを検索し、たとえばそのエントリ名が『menuentry "Windows NT/2000/XP (on /dev/sda3)"』となっている場合は次のようなスクリプトを付け加える。

/etc/grub.d/30_os-prober
for OS in ${OSPROBED} ; do
  DEVICE="`echo ${OS} | cut -d ':' -f 1`"
  LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
  LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"
  BOOT="`echo ${OS} | cut -d ':' -f 4`"
 
  if [ -z "${LONGNAME}" ] ; then
    LONGNAME="${LABEL}"
  fi
# Added to remove Windows Recovery
  if [ "$LONGNAME" = "Windows NT/2000/XP" ] && [ "${DEVICE}" = "/dev/sda3" ] ; then
    continue
  fi
# End Added

任意のエントリを加える

/etc/grub.d/40_custom にgrub.cfgに追記したい内容を”そのまま”記述する。

/etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
 
menuentry "Windows XP Service Pack 3 (on /dev/sda1)" {
    insmod ntfs
    set root=(hd0,1)
    drivemap -s (hd0) ${root}
    chainloader +1
}
 
menuentry "Ubuntu12.04 boot loader (on /dev/sda7)" {
    set root=(hd0,7)
    drivemap -s (hd0,7) ${root}
    chainloader +1
}
 
menuentry "Boot from USB (on /dev/sdb)" {
    set root=(hd1)
    drivemap -s (hd1) ${root}
    chainloader +1
}

ブートメニューのタイムアウトやデフォルトの選択項目を設定する

/etc/default/grub に記述する。
・Ubuntu Forums The Grub 2 Guide 『Grub 2 Files & Options』の”/etc/default/grub”セクションに書かれている方法を用いる。

GRUB_DEFAULTに設定する文字列は、/boot/grub/grub.cfg の menuentry の値をそのまま書けばよい。

/etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
 
#GRUB_DEFAULT=0
GRUB_DEFAULT="Windows NT/2000/XP (loader) (on /dev/sda1)"
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT="5"
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="splash"
GRUB_CMDLINE_LINUX=""
 
# Uncomment to disable generation of recovery mode menu entrys
GRUB_DISABLE_LINUX_RECOVERY="true"

ブートローダの背景画像を変更(設定)する

・Ubuntu Forums The Grub 2 Guide 『Grub 2 Splash Images 』セクションに書かれている方法を用いる。

/boot/grub,/usr/share/images/desktop-base,/usr/share/images/grub と指定されているディレクトリのどれかに、my-images.png か my-images.tga というファイルを保存すればよい。(grub2-splashimagesパッケージでは640x480のフルカラーtga画像がインストールされる)

画像はフルカラーでないと表示されない。PNGで256色等に減色しないこと。

■ Ubuntu 9.10の場合

/etc/grub.d/05_debian_theme
# check for usable backgrounds
use_bg=false
if [ "$GRUB_TERMINAL_OUTPUT" = "gfxterm" ] ; then
  for i in {/boot/grub,/usr/share/images/desktop-base,/usr/share/images/grub}/my-image.{png,tga} ; do
    if is_path_readable_by_grub $i ; then
      bg=$i
      case ${bg} in
        *.png)          reader=png ;;
        *.tga)          reader=tga ;;
        *.jpg|*.jpeg)   reader=jpeg ;;
      esac
      if test -e /boot/grub/${reader}.mod ; then
        echo "Found Debian background: `basename ${bg}`" >&2
        use_bg=true
        break
      fi
    fi
  done
fi

■ Ubuntu 10.04LTSの場合

/etc/grub.d/05_debian_theme
#!/bin/bash -e
 
source /usr/lib/grub/grub-mkconfig_lib
 
# this allows desktop-base to override our settings
f=/usr/share/desktop-base/grub_background.sh
if test -e ${f} ; then
  source ${f}
else
  WALLPAPER="/usr/share/images/grub/MyImage.png"
  COLOR_NORMAL="white/black"
  COLOR_HIGHLIGHT="black/light-gray"
fi
 
set_mono_theme()
{
 
〜 以下省略 〜

■ Ubuntu 11.10 / 12.04LTSの場合

/etc/grub.d/05_debian_theme
#!/bin/sh
set -e
 
# grub-mkconfig helper script.
 
〜 中略 〜
 
# Include the configuration of desktop-base if available.
if [ -f "/usr/share/desktop-base/grub_background.sh" ]; then
	. "/usr/share/desktop-base/grub_background.sh"
fi
 
WALLPAPER="/usr/share/images/grub/MyImage.png"
COLOR_NORMAL="white/black"
COLOR_HIGHLIGHT="black/light-gray"
 
# First check whether the user has specified a background image explicitly.
# If so, try to use it. Don't try the other possibilities in that case
# (#608263).
if [ -n "${GRUB_BACKGROUND+x}" ]; then
	set_background_image "${GRUB_BACKGROUND}" || set_default_theme
	exit 0
fi
 
〜 以下省略 〜

grub.cfgのrootパーティション指定をUUIDのみに変更

Ubuntu14.04では、UUIDが使えない場合にパーティション番号でrootを指定できるようになっているが、通常のBIOSではUUIDのみでOKなので、grub.cfgの判読性を上げるためにパーティション番号設定を削除する。

/usr/share/grub/grub-mkconfig.lib の 170行目あたり
  # If there's a filesystem UUID that GRUB is capable of identifying, use it;
  # otherwise set root as per value in device.map.
  fs_hint="`"${grub_probe}" --device $@ --target=compatibility_hint`"
  if [ "x$fs_hint" != x ]; then
    echo "set root='$fs_hint'"
  fi
  if fs_uuid="`"${grub_probe}" --device $@ --target=fs_uuid 2> /dev/null`" ; then
    hints="`"${grub_probe}" --device $@ --target=hints_string 2> /dev/null`" || hints=
#    echo "if [ x\$feature_platform_search_hint = xy ]; then"
#    echo "  search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
#    echo "else"
#    echo "  search --no-floppy --fs-uuid --set=root ${fs_uuid}"
#    echo "fi"
    echo "search --no-floppy --fs-uuid --set=root ${fs_uuid}"
  fi
  IFS="$old_ifs"

上記変更前のgrub.cfg例

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f58befa6-e32f-4936-b9c3-170a73afeb8f' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos9'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos9 --hint-efi=hd0,msdos9 --hint-baremetal=ahci0,msdos9  f58befa6-e32f-4936-b9c3-170a73afeb8f
	else
	  search --no-floppy --fs-uuid --set=root f58befa6-e32f-4936-b9c3-170a73afeb8f
	fi
	linux	/boot/vmlinuz-3.13.0-24-generic root=UUID=f58befa6-e32f-4936-b9c3-170a73afeb8f ro  quiet splash $vt_handoff
	initrd	/boot/initrd.img-3.13.0-24-generic
}

変更後のgrub.cfg例

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f58befa6-e32f-4936-b9c3-170a73afeb8f' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos9'
	search --no-floppy --fs-uuid --set=root f58befa6-e32f-4936-b9c3-170a73afeb8f
	linux	/boot/vmlinuz-3.13.0-24-generic root=UUID=f58befa6-e32f-4936-b9c3-170a73afeb8f ro  quiet splash $vt_handoff
	initrd	/boot/initrd.img-3.13.0-24-generic
}

参考資料

Ubuntu日本語フォーラム Grub 2 入門 (本家版の日本語訳)
・Ubuntu Forums The Grub 2 Guide
ArchLinux Grub wiki