インフラエンジニアbacchiのわかったことまとめ

bacchi.me

CentOS 7で最新のバージョンのkernelを起動させる

CentOS7になってブートローダーがGRUB2になりました。

kernelのセキュリティアップデートなどで新しいkernelを入れた後リブートすると
新しいkernelで起動していると思ったら古いままだったいう事はありませんか?

本来 期待するところは、最新のkernelが起動してくることかと思います。

ところが下記のようにmenuentryが登録された場合、
OS起動時にデフォルトで起動してくるのは、1番上のkernel(=1番古いkernel)になります。

# grep ^menuentry /boot/grub2/grub.cfg | awk -F' '{ print $2 }'
CentOS Linux, with Linux 3.10.0-123.el7.x86_64           ## 古い!
CentOS Linux, with Linux 3.10.0-123.20.1.el7.x86_64      ## 新しい!
CentOS Linux, with Linux 3.10.0-123.6.3.el7.x86_64       ## ちょっと古い!
CentOS Linux, with Linux 0-rescue-dfed4baf487a4b7684a419db9a770c4d

menuentryが新しい順に並んでくれなかった場合に、
デフォルトで起動するkernelを任意のものにする方法を教えてもらったのでご紹介します。

デフォルトで起動するkernelを任意に指定する

以下の手順で設定をしていきましょう!

menuentryの順番を確認する

/etc/grub2.confで先頭がmenuentryから始まる行を確認します。

# grep ^menuentry /boot/grub2/grub.cfg | awk -F' '{ print $2 }'
CentOS Linux, with Linux 3.10.0-123.el7.x86_64           # 0番目
CentOS Linux, with Linux 3.10.0-123.20.1.el7.x86_64      # 1番目
CentOS Linux, with Linux 3.10.0-123.6.3.el7.x86_64       # 2番目
CentOS Linux, with Linux 0-rescue-dfed4baf487a4b7684a419db9a770c4d

起動するkernelを番号で指定する。

/etc/default/grubのGRUB_DEFAULTに起動するkernelの番号を指定します。

# vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=1                              ## 0から1へ変更する
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=jp106 crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet ipv6.disable=1 net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"

ここで注意すべきなのが、最初のmenuentryを0として上から順に扱われているということです。

上記でgrepしたmenuentryの例では、最新のkernelを起動するならGRUB_DEFAULT=1と指定する必要があります。

/boot/grub2/grub.cfgを再生成する

/etc/default/grub の編集が完了したら、grub.cfgを生成し直す必要があります。
以下のようにコマンドを実行してください。

# 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.20.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.20.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-123.6.3.el7.x86_64
Found initrd image: /boot/initrd-3.10.0-123.6.3.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-dfed4baf487a4b7684a419db9a770c4d
Found initrd image: /boot/initramfs-0-rescue-dfed4baf487a4b7684a419db9a770c4d.img
done

次回起動するkernelを確認します。

# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-123.20.1.el7.x86_64) 7 (Core)

ちなみに、現在のkernelは以下のとおりです。

# uname -a
Linux XXXXX.com 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

ここまで完了したらサーバーを再起動します。

再起動後、kernelのバージョンを確認します。

# uname -a
Linux XXXXX.com 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

新しいバージョンのkernelを使用していることが確認できました!

まとめ

### /etc/grub2.confなりで先頭がmenuentryから始まる行を確認する
# grep ^menuentry /boot/grub2/grub.cfg | awk -F' '{ print $2 }'

最初のmenuentryを0として扱い、/etc/default/grub の"GRUB_DEFAULT=”に使いたいkernelの番号を指定する。

編集が完了したら、以下のコマンドでgrub.cfgを生成し直す
# grub2-mkconfig -o /boot/grub2/grub.cfg

以下のコマンドで次に起動するkernelのバージョンを確認し、問題なければ再起動をする
# grub2-editenv list
  • B!