『error: file '/boot/vmlinuz-3.10.0-693.2.2.el7.x86_64' not found.』と表示されてCentOSが起動しない

error: file '/boot/vmlinuz-3.10.0-693.2.2.el7.x86_64' not found.

うちの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 -r3.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.*はある。ただしメニューエントリーにはない

ということがわかったので、次の作業はこんな感じかなと。

  • メニューエントリーの更新
  • メニューエントリーに追加されなかった理由の把握

メニューエントリーの更新

The Red Hat Customer Portal delivers the knowledge, expertise, and guidance available through your Red Hat subscription.

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

メニューエントリーに追加されなかった理由の把握

ググり力及ばずわかりませんでした。次回カーネルの更新がある場合に確認しようと思います。

参考