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)"』となっている場合は次のようなスクリプトを付け加える。
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に追記したい内容を”そのまま”記述する。
#!/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 の値をそのまま書けばよい。
# 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の場合
# 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の場合
#!/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の場合
#!/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の判読性を上げるためにパーティション番号設定を削除する。
# 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