『error: file '/boot/vmlinuz-3.10.0-693.2.2.el7.x86_64' not found.』と表示されてCentOSが起動しない
うちのCentOS、リブートすると『error: file ‘/boot/vmlinuz-3.10.0-693.2.2.el7.x86_64’ not found.』とエラーを表示するだけで起動してくれません。
言われた通りに適当なキーを押すとカーネルを選択するように言われます。
この画面で3.10.0-693.2.2.el7.x86_64
以外のカーネルを選べば起動はしてくれます。
※毎回2番目に新しい3.10.0-514.26.2.el7.x86_64
を選択
しかし、システムメンテなんかで強制的にリブートされる場合は起動が完了せず上の表示のままで起動されないし、sshdが立ち上がる前だからVPSのコントロールパネルにログインしてコンソール経由して操作しなくちゃならないしと、頻繁に発生する事象ではないものの起きた時はなかなか面倒なので対処しました。
ちなみに作業開始時点では、GRUBについてはブートローダーであること以外は知らない状態だったので、断片的ではあるものの良い勉強になりました。
環境
- さくらのVPS v4
- CentOS Linux release 7.6.1810 (Core)
- GRUB 2.02
uname -r
は3.10.0-514.26.2.el7.x86_64
現状を把握する
実際に/boot/
にないのか見てみます。
$ ls /boot/vmlinuz* | sort
/boot/vmlinuz-0-rescue-3908835f3199424b43e75b0c63a19a07
/boot/vmlinuz-0-rescue-57fc8d29ddde412198e08c91aba22b4c
/boot/vmlinuz-3.10.0-514.26.2.el7.x86_64
/boot/vmlinuz-3.10.0-957.12.1.el7.x86_64
/boot/vmlinuz-3.10.0-957.21.2.el7.x86_64
/boot/vmlinuz-3.10.0-957.21.3.el7.x86_64
/boot/vmlinuz-3.10.0-957.27.2.el7.x86_64
ない、が、代わりに?もっと新しいバージョンのカーネルがありそうです。
次にyumでインストール済みのカーネルを確認します。
$ yum list installed | grep kernel.x86_64
kernel.x86_64 3.10.0-514.26.2.el7 @updates
kernel.x86_64 3.10.0-957.12.1.el7 @updates
kernel.x86_64 3.10.0-957.21.2.el7 @updates
kernel.x86_64 3.10.0-957.21.3.el7 @updates
kernel.x86_64 3.10.0-957.27.2.el7 @updates
/boot/
にあるカーネルと一致しました。
この時点で3.10.0-693.2.2.el7.x86_64
はなさそうなので次にGRUBの確認をしていきます。まずはデフォルトエントリーを確認します。
$ sudo grub2-editenv
saved_entry=CentOS Linux (3.10.0-693.2.2.el7.x86_64) 7 (Core)
問題のバージョンが指定されています。
メニューエントリーの一覧を確認します。
$ sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
0 : CentOS Linux (3.10.0-693.2.2.el7.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-514.21.1.el7.x86_64) 7 (Core)
3 : CentOS Linux 7 Rescue 57fc8d29ddde412198e08c91aba22b4c (3.10.0-514.16.1.el7.x86_64)
4 : CentOS Linux (3.10.0-514.16.1.el7.x86_64) 7 (Core)
5 : CentOS Linux (3.10.0-327.36.3.el7.x86_64) 7 (Core)
6 : CentOS Linux (3.10.0-327.28.3.el7.x86_64) 7 (Core)
7 : CentOS Linux (0-rescue-3908835f3199424b43e75b0c63a19a07) 7 (Core)
ここまでで
3.10.0-693.2.2.el7.x86_64
はない- それより新しいカーネル
3.10.0-957.*
はある。ただしメニューエントリーにはない
ということがわかったので、次の作業はこんな感じかなと。
- メニューエントリーの更新
- メニューエントリーに追加されなかった理由の把握
メニューエントリーの更新
Red Hatのシステム管理者ガイドを見ると
grub.cfg での通常の操作 (カーネルの削除や追加など)、grubby ツールと new-kernel-pkg ツール (スクリプト用) を使用して行う必要があります。grubby を使用してデフォルトのカーネルを変更する場合、変更内容は新しいカーネルがインストールされたときに継承されます。
〜中略〜
一般的に、他の手段がない場合を除き、grub2-mkconfig を手動で実行して grub.cfg ファイルを置き換えることは推奨されません。
とあるので、grubby
コマンドでバージョン確認と、メニューエントリーの一覧表示をしてみます。
# grubby --version
grubby version 8.28
# grubby --info ALL
error opening /boot/grub/grub.cfg for read: No such file or directory
一覧表示でエラーとなりました。設定ファイルは/boot/grub2/grub.cfg
を見て欲しいところですが、そうじゃないファイルを見にいっているようで…(man grubby
のDefault Behaviorの項にある振る舞いと違う!)。
--config-path
オプションでパスを指定すればよいようなのでそのようにすれば正常に実行できました。
# grubby --config-file /boot/grub2/grub.cfg --info ALL
index=0
kernel=/boot/vmlinuz-3.10.0-693.2.2.el7.x86_64
args="ro vconsole.font=latarcyrheb-sun16 consoleblank=0 nomodeset elevator=noop net.ifnames=0 biosdevname=0 console=tty1 console=ttyS0,115200n8r LANG=C"
root=UUID=c9321269-7178-43b4-b696-4de4e92a4518
title=CentOS Linux (3.10.0-693.2.2.el7.x86_64) 7 (Core)
index=1
kernel=/boot/vmlinuz-3.10.0-514.26.2.el7.x86_64
args="ro vconsole.font=latarcyrheb-sun16 consoleblank=0 nomodeset elevator=noop net.ifnames=0 biosdevname=0 console=tty1 console=ttyS0,115200n8r LANG=C"
root=UUID=c9321269-7178-43b4-b696-4de4e92a4518
initrd=/boot/initramfs-3.10.0-514.26.2.el7.x86_64.img
title=CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)
index=2
:
:
次に新しいカーネルをメニューエントリーに追加します。既存エントリーを参考に、カーネル、RAMディスクイメージ、カーネルパラメータ、名称に関するパラメータをオプションで指定します。
# grubby --config-file /boot/grub2/grub.cfg --add-kernel /boot/vmlinuz-3.10.0-957.27.2.el7.x86_64 --initrd /boot/initramfs-3.10.0-957.27.2.el7.x86_64.img --title 'CentOS Linux (3.10.0-957.27.2.el7.x86_64) 7 (Core)' --copy-default
# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
0 : CentOS Linux (3.10.0-957.27.2.el7.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-693.2.2.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)
3 : CentOS Linux (3.10.0-514.21.1.el7.x86_64) 7 (Core)
4 : CentOS Linux 7 Rescue 57fc8d29ddde412198e08c91aba22b4c (3.10.0-514.16.1.el7.x86_64)
5 : CentOS Linux (3.10.0-514.16.1.el7.x86_64) 7 (Core)
6 : CentOS Linux (3.10.0-327.36.3.el7.x86_64) 7 (Core)
7 : CentOS Linux (3.10.0-327.28.3.el7.x86_64) 7 (Core)
8 : CentOS Linux (0-rescue-3908835f3199424b43e75b0c63a19a07) 7 (Core)
# grubby --config-file /boot/grub2/grub.cfg --info 0
index=0
kernel=/boot/vmlinuz-3.10.0-957.27.2.el7.x86_64
args="ro vconsole.font=latarcyrheb-sun16 consoleblank=0 nomodeset elevator=noop net.ifnames=0 biosdevname=0 console=tty1 console=ttyS0,115200n8r LANG=C"
root=UUID=c9321269-7178-43b4-b696-4de4e92a4518
initrd=/boot/initramfs-3.10.0-957.27.2.el7.x86_64.img
title=CentOS Linux (3.10.0-957.27.2.el7.x86_64) 7 (Core)
起動時にデフォルトで使うカーネルが、追加したものになっているかを確認します。
# grubby --config-file /boot/grub2/grub.cfg --default-index
1
追加したものになっていないので、変更します。
# grubby --config-file /boot/grub2/grub.cfg --set-default-index 0
# grubby --config-file /boot/grub2/grub.cfg --default-index
0
# grubby --config-file /boot/grub2/grub.cfg --default-kernel
/boot/vmlinuz-3.10.0-957.27.2.el7.x86_64
ここまでで、次回起動時は追加したカーネルが利用されるはずなので確認していきます。
# reboot
〜しばらく間を空けてssh -> 成功〜
$ uname -r
3.10.0-957.27.2.el7.x86_64
sshできること、新しいカーネルが使われていることが確認できました!
最後に、起動できないカーネルのエントリーを削除し、念のためリブートが想定通り行えるかを確認します。
# grubby --config-file /boot/grub2/grub.cfg --info 1 | grep kernel
kernel=/boot/vmlinuz-3.10.0-693.2.2.el7.x86_64
# grubby --config-file /boot/grub2/grub.cfg --remove-kernel /boot/vmlinuz-3.10.0-693.2.2.el7.x86_64
# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
0 : CentOS Linux (3.10.0-957.27.2.el7.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-514.21.1.el7.x86_64) 7 (Core)
3 : CentOS Linux 7 Rescue 57fc8d29ddde412198e08c91aba22b4c (3.10.0-514.16.1.el7.x86_64)
4 : CentOS Linux (3.10.0-514.16.1.el7.x86_64) 7 (Core)
5 : CentOS Linux (3.10.0-327.36.3.el7.x86_64) 7 (Core)
6 : CentOS Linux (3.10.0-327.28.3.el7.x86_64) 7 (Core)
7 : CentOS Linux (0-rescue-3908835f3199424b43e75b0c63a19a07) 7 (Core)
# reboot
メニューエントリーに追加されなかった理由の把握
ググり力及ばずわかりませんでした。次回カーネルの更新がある場合に確認しようと思います。
参考
- 第25章 GRUB 2 での作業 - Red Hat Customer Portal
- GRUB2をざっくり把握することと、ベストプラクティスの記載が見つけられればということで、一通り
- CentOS 7でデフォルトのカーネルを変更・指定する - Qiita
- メニューエントリーを一覧表示する方法を参考にしました
- Linuxがブートするまで · Keichi Takahashi
- GRUB、特にinitrdについて役割を把握するのに助けになりました