めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

GRUB2で知っておくとよいこと

何の話かというと

RHEL7/CentOS7でGRUB2に変わりましたよね。。。

起動メニューを編集しようと思って、/etc/grub2.cfg(もしくは /boot/grub2/grub.cfg)を開いてのけぞりますよね。。。。

そんな貴方へのメッセージです。。。。

起動メニューは自動生成

起動メニューは、/boot以下のファイルを見て自動生成するようになっているので、設定ファイルを直接編集するのはあきらめましょう。

自由にいじれるのは、全般的な設定を指定する /etc/default/grub と独自のエントリーを追加する /etc/grub.d/40_custom です。

/etc/default/grub の内容はこんな感じです。

GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

各エントリーに共通のカーネルオプションは、/etc/default/grub の GRUB_CMDLINE_LINUX に指定します。たとえば、起動メッセージをずらずら流すのが好みの方は、「rhgb quiet」を削除しておきます。設定を変更したら、次のコマンドで変更を反映します。(UEFIブート環境の場合は、「-o /boot/efi/EFI/redhat/grub.cfg」(RHELの場合)、もしくは、「-o /boot/efi/EFI/centos/grub.cfg」(CentOSの場合)を指定。)

# grub2-mkconfig -o /boot/grub2/grub.cfg 
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-229.11.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.11.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-f7553ca5fb094cd0a58e6d7604177d4a
Found initrd image: /boot/initramfs-0-rescue-f7553ca5fb094cd0a58e6d7604177d4a.img
done

デフォルトエントリーの指定方法

GRUB2の起動画面で実際に表示されるエントリーは、次のコマンドで確認します。awkでなくてもいいんですけどね。。。。

# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
Employee SKU, with Linux 3.10.0-229.el7.x86_64
Employee SKU, with Linux 3.10.0-229.11.1.el7.x86_64
Employee SKU, with Linux 0-rescue-f7553ca5fb094cd0a58e6d7604177d4a

こっちの方が簡単?

# grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2

(ちなみに「Employee SKU」というのは、レッドハット社員は無料でRHELが使い放題という福利厚生の証です。。。あと、ソースコードも読み放題です。)

デフォルトエントリーは、/etc/default/grub の GRUB_DEFAULT に指定するのですが先のデフォルトのように「saved」となっている場合は、別ファイルに指定が格納されています。

# head -2 /boot/grub2/grubenv 
# GRUB Environment Block
saved_entry=Red Hat Enterprise Linux Server (3.10.0-229.11.1.el7.x86_64) 7.1 (Maipo)

もしくは、次のコマンドでも確認できます。

# grub2-editenv list
saved_entry=Red Hat Enterprise Linux Server (3.10.0-229.11.1.el7.x86_64) 7.1 (Maipo)

このファイルも直接編集はできないので、次のコマンドで変更します。先の awk で確認したエントリーの一番上が 0 になります。

# grub2-set-default 2
# head -2 /boot/grub2/grubenv 
# GRUB Environment Block
saved_entry=2

むむ。なにやら微妙な気分になりますが、これで正しく設定できているので大丈夫なはずです。。。。。サーバーを再起動して確認してください。

レスキューモードとemergencyモード

メニューのエントリーにある「Linux 0-rescue-...」は、レスキューモードでの起動ですが、これは、いわゆるシングルユーザーモードと同等です。RHEL7/CentOS7では、これとは別に、emergencyモードも用意されており、こちらは、systemdが起動した直後にシェルを起動するというもので、余計なプロセスはまったく存在しない状態になります。ファイルシステムのマウント処理も行われないので、ルートファイルシステムだけが Read-only でマウントされた状態になります。

emergencyモードで起動する際は、GRUB2のメニュー画面で「e」を押して設定編集画面に入って、カーネルオプションの末尾に「systemd.unit=emergency.target」を指定します。(レスキューモードの場合は、「systemd.unit=rescue.target」)

systemdと仲良しの方は、/usr/lib/systemd/system/emergency.service を開くと、emergencyモードで何をしているかがわかると思います。

ステージ1.5(core.img)の配置場所

GRUB/GRUB2の本体は、/bootファイルシステムに保存されていますが、(UEFIではない)古典的なBIOSブート環境では、MBRの先頭にあるブートストラップイメージ(GRUBで言うところのステージ1、GRUB2のboot.img)がロードされた後、どこか別の場所にあるステージ1.5(GRUB2のcore.img)がロードされて、こいつが/bootファイルシステム内の本体を起動します。ステージ1.5の置き場所は、MBRの直後の部分か、/bootファイルシステムがあるパーティションのどこかになりますが、RHEL7/CentOS7では、デフォルトでMBRの直後の部分が使われます。(こちらの図も参照。)

(参考)6.10.1.1. MBR と GPT に関する注意点

2T超えのディスクでGPTを使う場合は、こちらにも注意してください。

RHEL7/CentOS7でGPTを使用する際の注意点