GCE にアクセスできない時、カーネルパニックが起きていたので対処

概要

GCP の GCE インスタンスにアクセスできなくなった。

環境

  • GCE e2-small
  • CentOS7

現象

コンソールからも ssh アクセスできない

コンソールから ssh アクセスできない。

コンソール上ではインスタンは起動している状態。

停止→開始を行っても変化なし。

シリアルコンソールを確認

こういうときはシリアルコンソールを確認する。

確認手順

  • 対象インスンタンスを選択
  • 「シリアルポート 1 (コンソール)」を選択
  • カーネルパニックが発生していることを確認

Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

[    2.085311] No filesystem could mount root, tried: 
[    2.086372] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[    2.087610] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G               ------------ T 3.10.0-1160.53.1.el7.x86_64 #1
[    2.090179] Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011

VFS: Unable to mount root fs on unknown-block(0,0)」なので、マウントされたディスクに問題がある?

今回は yum update 後に起こってしまったため、カーネルのバージョンを1個前に戻す必要がある。

対応

該当インスタンスを停止

アクセスできなくなった GCE インスタンスを停止する。

スナップショット作成

アクセスできないインスタンのスナップショットを作成する。

スナップショットから救助用ディスク作成

resucue-disk と名付けた救助用ディスクを作成する。

上記で作成したスナップショットをソースとする。

別インスタン(救助用)を作成

インスタンスを作成 → ブートディスク → 同じ OS を指定

救助用ディスクをアタッチ

アタッチ前がこちら。

停止中の該当インスタンスを選択し「編集」→「既存のディスクを接続」。

GCP コンソール上でアタッチされていることを確認。

ssh コンソール上から /dev/sdb が追加されたことを確認。

fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sdb: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: gpt
Disk identifier: 3A6E3AAE-3FD4-4285-9617-FA32808F648A


#         Start          End    Size  Type            Name
 1         2048       411647    200M  EFI System      EFI System Partition
 2       411648     62912607   29.8G  Microsoft basic 
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: gpt
Disk identifier: 6DEC12CB-4836-479C-8AE4-8332371DF027


#         Start          End    Size  Type            Name
 1         2048       411647    200M  EFI System      EFI System Partition
 2       411648     62912607   29.8G  Microsoft basic

/dev/sdb はまだ認識されていない。

/dev/sdb をマウントする。

  • /dev/sdb1 が boot パーティション
  • /dev/sdb2 が LVM
mkdir /data_disk
mount -o nouuid /dev/sdb2 /data_disk

認識した。

確認できた。

この時点で、必要なファイルをバックアップして終わりでも大丈夫。

※後ほど /dev/sdb1 もマウントすることになる

カーネルを修復 ( GRUB2 )

最新の Kernel で不具合が起きているため、古い Kernel を利用するよう指定する。

Kernel の起動順序は GRUB で設定される。今回は CentOS7 なので GRUB2 を設定していく。

マウントした /data_disk をルートディレクトリにする。

for m in dev proc run sys; do mount -o bind {,/data_disk}/$m; done
chroot /data_disk

kernel 一覧を確認。0番目が最も新しく不具合が出たため、 1 番目を指定する。

% awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg
CentOS Linux (3.10.0-1160.53.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1160.49.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1160.45.1.el7.x86_64) 7 (Core)

デフォルト起動させる kernel を修正する。初期値は GRUB_DEFAULT=sved となっていたので 1 に変更。

vi /etc/default/grub
---
GRUB_DEFAULT=1
---

/boot/grub2/grub.cfgファイルを再作成。

grub2-mkconfig -o /boot/grub2/grub.cfg

起動する kernel を指定。ただ、下記のコマンドは失敗した。

grub2-set-default 1
# grub2-set-default 1
/usr/bin/grub2-editenv: error: cannot rename the file /boot/grub2/grubenv.new to /boot/grub2/grubenv: No such file or directory.
/usr/bin/grub2-editenv: error: cannot rename the file /boot/grub2/grubenv.new to /boot/grub2/grubenv: No such file or directory.
/usr/bin/grub2-editenv: error: cannot rename the file /boot/grub2/grubenv.new to /boot/grub2/grubenv: No such file or directory.

grubenv がないため。正確には、grubenv の実態が存在する /dev/sdb1 がアタッチされていないため。

# ls -la /boot/grub2/
total 16
drwx------. 2 root root   56 Jan 25 05:56 .
dr-xr-xr-x. 5 root root 4096 Jan 23 09:36 ..
-rw-r--r--. 1 root root 6104 Jan 25 05:56 grub.cfg
lrwxrwxrwx. 1 root root   25 Nov  5 05:34 grubenv -> ../efi/EFI/centos/grubenv
-rw-r--r--. 1 root root 1024 Jan 25 05:57 grubenv.new

boot 配下に grubenv がないことを確認。

# ls -la /boot/efi/
total 4
drwxr-xr-x. 2 root root    6 Nov  5 05:31 .
dr-xr-xr-x. 5 root root 4096 Jan 23 09:36 ..

/dev/sdb1 をマウントする。

mount /dev/sdb1 /data_disk/boot/efi/

マウントできたことを確認。

# ls -la boot/efi/EFI/centos/
total 7028
drwxr-xr-x. 3 root root    4096 Jan 23 09:36 .
drwxr-xr-x. 4 root root    4096 Nov  5 05:34 ..
-rwxr-xr-x. 1 root root     134 Aug  1  2020 BOOT.CSV
-rwxr-xr-x. 1 root root     134 Aug  1  2020 BOOTX64.CSV
drwxr-xr-x. 2 root root    4096 Nov  5 05:34 fonts
-rwxr-xr-x. 1 root root    6360 Jan 23 09:36 grub.cfg
-rwxr-xr-x. 1 root root    1024 Jan 23 09:36 grubenv
-rwxr-xr-x. 1 root root 1122120 Oct 14 09:12 grubx64.efi
-rwxr-xr-x. 1 root root 1154640 Aug  1  2020 mmx64.efi
-rwxr-xr-x. 1 root root 1154640 Aug  1  2020 MokManager.efi
-rwxr-xr-x. 1 root root 1243864 Aug  1  2020 shim.efi
-rwxr-xr-x. 1 root root 1237824 Aug  1  2020 shimx64-centos.efi
-rwxr-xr-x. 1 root root 1243864 Aug  1  2020 shimx64.efi

grub2 系のコマンドが利用できた。

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

1 に変更。

# grub2-set-default 1
# grub2-editenv list
saved_entry=1

このディスクをデタッチ後、別インスタンスのブートディスクに設定し、ssh でログインできることを確認できた。

後片付け

ダメな kernel は再インストール。

yum reinstall kernel-3.10.0-1160.53.1.el7.x86_64

GRUB は勝手に更新された。

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

再起動。

reboot

諸々の設定は戻して、不要なリソースは削除しておくこと。

参考

Kernel Panic on CentOS – Google Compute Engine Instance

SSH のトラブルシューティング

[Kernel panic] VFS: Unable to mount root fs on unknown-block(0,0) の対処方法

CentOS7 ブートローダ周り

CentOS 7で採用された新ブートローダ「GRUB 2」

Amazon EC2 インスタンスが更新によって正常に再起動しなくなった後で、既知の安定したカーネルに戻すにはどうすればよいですか?

コメント

タイトルとURLをコピーしました