新搭載のGRUB 2とCentOS 7でのレスキューモード
この連載が、書籍『CentOS 7 実践ガイド』になりました!
IT技術者のための現場ノウハウ CentOS 7 実践ガイド
CentOS 7を取り巻く市場動向、サーバーシステムの選定、システム設計、構築手順など前回に引き続き、CentOS 7のインストーラーの変更点についてみていきます。今回は、新しく搭載されたGRUB 2、運用管理者が知っておくべきCentOS 7でのレスキューモードの利用方法についてご紹介します。
CentOS 7で採用された新ブートローダ「GRUB 2」
CentOS 7から、ブートローダにGRUB 2が採用されています。従来のCentOS 6系までのGRUBと構造が大きく異なるため、注意が必要です。以下では、CentOS 7の管理者が、最低限知っておくべきGRUB 2の設定方法について紹介します。
GRUB 2の設定の基本は、/etc/default/grubファイルの編集と、grub2-mkconfigコマンドによる設定ファイルの生成です。GRUB 2の設定ファイル/etc/default/grubファイルにパラメータを設定し、grub2-mkconfigによってその設定を含んだファイル/boot/grub2/grub2.cfgファイルを生成します。
以下は、GRUB 2メニューが表示される時間(タイムアウト)を60秒に設定し、さらにIPv6を無効にする例です。タイムアウト値は、/etc/default/grubファイルの「GRUB_TIMEOUT=」に設定します。ブートパラメータは、/etc/default/grubファイルの「GRUB_CMDLINE_LINUX=」に設定します。
# vi /etc/default/grub GRUB_TIMEOUT=60 ←デフォルトの5を60に変更 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="nomodeset crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us rhgb quiet ipv6.disable=1" ←IPv6を無効化するパラメータを追加 GRUB_DISABLE_RECOVERY="true" ~
上記/etc/default/grubファイルの変更を有効にするため、/boot/grub2/grub.cfgを再生成します。
# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.org # grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-123.6.3.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-123.6.3.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-41f28cff512735f914d4f894f1944df1 Found initrd image: /boot/initramfs-0-rescue-41f28cff512735f914d4f894f1944df1.img done
BIOS搭載マシンとUEFI搭載マシンでgrub2-mkconfigコマンドで出力するファイルgrub.cfgファイルのパスが異なりますので注意して下さい。
# grub2-mkconfig -o /boot/grub2/grub.cfg
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
OSを再起動してタイムアウト値が反映されているかを確認します。
# reboot
OSのブートメニューが表示されたら、メニュー画面が60秒間表示されていることを確認します。OSが起動したら、ブートパラメータが有効になっているかを確認します。
# cat /proc/cmdline BOOT_IMAGE=/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1 ro nomodeset crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us rhgb quiet ipv6.disable=1
以上でカーネルのパラメータを変更することができました。CentOS 6系に慣れた管理者は、grub2-mkconfigコマンドを実行することを忘れてしまうミスを犯しがちです。GRUB 2の設定は慎重に行うようにして下さい。
ブートメニューのエントリーを追加する方法
GRUB 2では、複数のブートメニューエントリーが/boot/grub2/grub.cfgファイルに生成されますが、独自のブートパラメータを含んだカスタムのブートメニューエントリーを追加したい場合、grub.cfgファイルを直接編集することはできません。そこで、GRUB 2では、/etc/grub.d/40_customファイルを使用します。このファイルに、カスタムのエントリーを追加することができます。以下では、既存のエントリーにさらにカスタムのエントリーを追加する例です。
まず、cpコマンドで、既存の40_customファイルのバックアップを取っておき、バックアップを取ったファイルの実行権限を削除します。
# cd /etc/grub.d/ # cp 40_custom 40_custom.org # chmod -x 40_custom.org
カスタムのエントリーを40_customファイルに記述します。
# vi 40_custom menuentry 'CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' { load_video set gfxpayload=keep insmod gzio insmod part_msdos insmod xfs set root='hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 033eb63d-33d5-49e4-b045-463f2297ccaa else search --no-floppy --fs-uuid --set=root 033eb63d-33d5-49e4-b045-463f2297ccaa fi linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1 ro nomodeset crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=jp106 rhgb quiet ipv6.disable=0 initrd16 /initramfs-3.10.0-123.el7.x86_64.img }
今回は、カスタムメニューを追加したことがわかるように、上記ファイルのmenuentry行に、'CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64'を記載しました。
さらに、追加したカスタムメニューがOS起動時に自動的に選択されるように/etc/default/grubファイルを編集します。複数あるエントリーから特定のものを選択してデフォルトで起動させるには、40_custom ファイルのmenuentry行で、''で囲んだエントリー名の文字列をGRUB_DEFAULT行にそのまま記述することが可能です。
# vi /etc/default/grub ... GRUB_DEFAULT='CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64' ...
/boot/grub2/grub.cfgファイルを生成します。
# grub2-mkconfig -o /boot/grub2/grub.cfg
ブート可能なカーネルのエントリーを表示するには、/boot/gurb2/grub.cfgファイルのmenuentryの以下の'CentOS Linux, ...'の箇所を確認します。
# cat /boot/grub2/grub.cfg |grep ^menuentry menuentry 'CentOS Linux, with Linux 3.10.0-123.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' { menuentry 'CentOS Linux, with Linux 3.10.0-123.6.3.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.6.3.el7.x86_64-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' { menuentry 'CentOS Linux, with Linux 0-rescue-41f28cff512735f914d4f894f1944df1' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-41f28cff512735f914d4f894f1944df1-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' { menuentry 'CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-f5dd4af7-9cb9-4dd1-a6fe-a1b59725f0e1' {
また、以下のようにawkコマンドを駆使することで、'CentOS Linux...'の箇所のみを抽出することもできます。
# awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg CentOS Linux, with Linux 3.10.0-123.el7.x86_64 CentOS Linux, with Linux 3.10.0-123.6.3.el7.x86_64 CentOS Linux, with Linux 0-rescue-41f28cff512735f914d4f894f1944df1 CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64
上記より、メニューエントリー' CUSTOM CentOS Linux, with Linux 3.10.0-123.el7.x86_64'が登録されていることがわかります。以上で、新しく追加したカスタムのエントリーで起動する準備が整いましたので、OSを再起動します。
# reboot
OS再起動後に、自動的にカスタムのメニューが選択され、正常に起動するかを確認してください。
先述のawkコマンドを駆使したエントリーの表示では、4つのエントリーが表示されていますが、デフォルトで起動してほしいエントリーは、/etc/default/grubファイル内で、数字で指定することも可能です。たとえば、先述のawkコマンドの出力結果の一番上に出力されている「CentOS Linux, with Linux 3.10.0-123.el7.x86_64」をブート時にデフォルトで起動させる場合は、/etc/default/grubファイルのGRUB_DEFAULT=0を指定します。
# vi /etc/default/grub ... GRUB_DEFAULT=0 ...
/etc/default/grubファイルを更新したら、必ず/boot/grub2/grub.cfgファイルを生成してからOSを再起動して下さい。
# grub2-mkconfig -o /boot/grub2/grub.cfg && reboot