Skip to content

CentOS7でbootできなくなったときの対処

2020/8/6

自宅の環境ではKVM上でいくつかの仮想サーバが動いている。
仮想サーバのOSはCentOS7.8で、yum-cronを動かして放置していた。
先日、久しぶりにOS再起動をしたところ、OSが起動できなくなってしまった。
起動時のログを見ていると、以下のログが出ていた。

[    1.013801] List of all partitions:
[    1.015108] No filesystem could mount root, tried: 
[    1.016734] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[    1.019481] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.10.0-1127.18.2.el7.x86_64 #1
[    1.022194] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
[    1.023881] Call Trace:
[    1.025034]  [<ffffffffb577ffa5>] dump_stack+0x19/0x1b
[    1.026803]  [<ffffffffb5779541>] panic+0xe8/0x21f
[    1.028402]  [<ffffffffb5d8b794>] mount_block_root+0x291/0x2a0
[    1.030085]  [<ffffffffb5d8b7f6>] mount_root+0x53/0x56
[    1.031749]  [<ffffffffb5d8b935>] prepare_namespace+0x13c/0x174
[    1.034253]  [<ffffffffb5d8b412>] kernel_init_freeable+0x222/0x249
[    1.036027]  [<ffffffffb5d8ab28>] ? initcall_blacklist+0xb0/0xb0
[    1.037817]  [<ffffffffb576e6b0>] ? rest_init+0x80/0x80
[    1.039407]  [<ffffffffb576e6be>] kernel_init+0xe/0x100
[    1.040978]  [<ffffffffb5792d37>] ret_from_fork_nospec_begin+0x21/0x21
[    1.042843]  [<ffffffffb576e6b0>] ? rest_init+0x80/0x80
[    1.044603] Kernel Offset: 0x34000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)

rootのファイルシステムがマウントできず、カーネルパニックを起こしているらしい。
調べてみた結果、yumとかで新しいカーネルバージョンにアップデートされると、 上記のエラーメッセージが出て、できなくなることがあるらしい。
対処としては、OS起動時にカーネルバージョン選択画面が出てくるので、古いカーネルバージョンを指定して起動してあげれば起動できるようにはなるらしい。

さて、それはわかったが、KVMだとそれをどうやればいいんだろうということだ。 GUI環境がまったくなく、起動時にカーネルバージョンを指定することができない。
KVMのコマンドでカーネルバージョンの指定をする方法等調べてみたが、その方法は見つけることができなかった。

直接bootの設定ファイルを書き換えて対処できないかと思考錯誤してみて、対処できたので、その方法をまとめる。

KVMではOSをレスキューモードで起動するオプションが用意されている。

# virt-rescue -d [仮想マシン名]

色々と起動時のメッセージが出た後、レスキューモードで起動されたことが表示される。

Welcome to virt-rescue, the libguestfs rescue shell.

Note: The contents of / (root) are the rescue appliance.
You have to mount the guest’s partitions under /sysroot
before you can examine them.

><rescue>

まずは、仮想マシンのファイルシステムをマウントして操作できるようにする。
fdisk -l でdiskの情報を出力する。

><rescue> fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000dea8a

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    41943039    20458496   8e  Linux LVM

Disk /dev/sdb: 4294 MB, 4294967296 bytes, 8388608 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/centos-root: 18.8 GB, 18798870528 bytes, 36716544 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

/dev/sda1がbootパーティション、
/dev/sda2がLVMで、
* /dev/mapper/centos-root * /dev/mapper/centos-swap

の論理パーティションがあることがわかる。

bootパーティションを書き換えるのでマウントし、中身を覗いてみる。
(/mnt/bootディレクトリを作成し、そこに/dev/sda1をマウントさせた)

><rescue> mkdir /mnt/boot
><rescue> mount /dev/sda1 /mnt/boot/
><rescue> cd /mnt/boot/
><rescue> ls -l
total 169052
-rw-------. 1 root root  3600165 Mar 17 23:53 System.map-3.10.0-1062.18.1.el7.x86_64
-rw-------. 1 root root  3611728 Jun  3 14:32 System.map-3.10.0-1127.10.1.el7.x86_64
-rw-------. 1 root root  3612279 Jun 23 15:50 System.map-3.10.0-1127.13.1.el7.x86_64
-rw-------. 1 root root  3612386 Jul 26 15:31 System.map-3.10.0-1127.18.2.el7.x86_64
-rw-------. 1 root root  3611697 May 12 17:01 System.map-3.10.0-1127.8.2.el7.x86_64
-rw-r--r--. 1 root root   153187 Mar 17 23:53 config-3.10.0-1062.18.1.el7.x86_64
-rw-r--r--. 1 root root   153567 Jun  3 14:32 config-3.10.0-1127.10.1.el7.x86_64
-rw-r--r--. 1 root root   153567 Jun 23 15:50 config-3.10.0-1127.13.1.el7.x86_64
-rw-r--r--. 1 root root   153567 Jul 26 15:31 config-3.10.0-1127.18.2.el7.x86_64
-rw-r--r--. 1 root root   153566 May 12 17:01 config-3.10.0-1127.8.2.el7.x86_64
drwxr-xr-x. 3 root root       16 Oct 17  2017 efi
drwxr-xr-x. 2 root root       26 Aug 27  2017 grub
drwx------. 5 root root     4096 Jul 31 12:02 grub2
-rw-r--r--. 1 root root 29085758 May 12  2015 initramfs-0-rescue-d45dd82781eb6f6143cf189e1d9a7755.img
-rw-------. 1 root root 21051372 Jun 25 22:09 initramfs-3.10.0-1062.18.1.el7.x86_64.img
-rw-------. 1 root root 21063705 Jun 25 22:09 initramfs-3.10.0-1127.10.1.el7.x86_64.img
-rw-------. 1 root root 21065960 Jun 25 22:08 initramfs-3.10.0-1127.13.1.el7.x86_64.img
-rw-------. 1 root root 21061094 Jun 11 00:28 initramfs-3.10.0-1127.8.2.el7.x86_64.img
-rw-r--r--. 1 root root   611392 Oct 17  2017 initrd-plymouth.img
-rw-r--r--. 1 root root   318991 Mar 17 23:53 symvers-3.10.0-1062.18.1.el7.x86_64.gz
-rw-r--r--. 1 root root   320504 Jun  3 14:32 symvers-3.10.0-1127.10.1.el7.x86_64.gz
-rw-r--r--. 1 root root   320513 Jun 23 15:50 symvers-3.10.0-1127.13.1.el7.x86_64.gz
-rw-r--r--. 1 root root   320536 Jul 26 15:31 symvers-3.10.0-1127.18.2.el7.x86_64.gz
-rw-r--r--. 1 root root   320504 May 12 17:01 symvers-3.10.0-1127.8.2.el7.x86_64.gz
-rwxr-xr-x. 1 root root  4902656 May 12  2015 vmlinuz-0-rescue-d45dd82781eb6f6143cf189e1d9a7755
-rwxr-xr-x. 1 root root  6738112 Mar 17 23:53 vmlinuz-3.10.0-1062.18.1.el7.x86_64
-rwxr-xr-x. 1 root root  6762688 Jun  3 14:32 vmlinuz-3.10.0-1127.10.1.el7.x86_64
-rwxr-xr-x. 1 root root  6762688 Jun 23 15:50 vmlinuz-3.10.0-1127.13.1.el7.x86_64
-rwxr-xr-x. 1 root root  6761064 Jul 26 15:31 vmlinuz-3.10.0-1127.18.2.el7.x86_64
-rwxr-xr-x. 1 root root  6762688 May 12 17:01 vmlinuz-3.10.0-1127.8.2.el7.x86_64

><rescue> cd grub2
><rescue> ls
><rescue> ls -l
total 64
-rw-r--r--. 1 root root   84 May 12  2015 device.map
drwxr-xr-x. 2 root root   24 May 12  2015 fonts
-rw-r--r--. 1 root root 7597 Jul 30 23:02 grub.cfg
-rw-r--r--. 1 root root 6741 Aug  9  2015 grub.cfg.1503876154.rpmsave
-rw-r--r--. 1 root root 7619 Aug 27  2017 grub.cfg.1508282747.rpmsave
-rw-r--r--. 1 root root 7629 Sep 28  2018 grub.cfg.1543960359.rpmsave
-rw-r--r--. 1 root root 7635 Jul 31  2019 grub.cfg.1568853580.rpmsave
-rw-r--r--. 1 root root 1024 Jul 30 23:02 grubenv
drwxr-xr-x. 2 root root 8192 May 12  2015 i386-pc
drwxr-xr-x. 2 root root 4096 May 12  2015 locale

7/26 15:31に最新のカーネルが入ったらしい。
(問題が発生したのは7/31)
3.10.0-1127.18.2.el7.x86_64とは違うカーネルバージョンでブートしたい。

結論から、grub2/grubenvを書き換えることで、起動時のデフォルトカーネルバージョンを変更することができた。
grub2/grubenvを覗いてみる。

# cat grubenv
# GRUB Environment Block
saved_entry=CentOS Linux (3.10.0-1127.18.2.el7.x86_64) 7 (Core)
#######################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################

3.10.0-1127.18.2.el7.x86_64 がカーネルバージョンなので、これを書き換えてやれば良さそうだ。

ただ書き換えようとしたとき、viコマンドを使ったところ、viコマンドが存在しないメッセージが表示された。
そこで、viが入っているrootパーティションもマウントすることで、viを使えるようにした。

><rescue> mkdir /mnt/root
><rescue> mount /dev/mapper/centos-root /mnt/root/

→こうすることで、/mnt/root/bin/のパスでマウントされるので、/mnt/root/bin/viとフルパスを記載してviを動かす。
(パスを通してもいいが、1回使うだけなので)

viを使って、grub2/grubenvを書き換える。

><rescue> /mnt/root/bin/vi grubenv

以下のように書き換えた

saved_entry=CentOS Linux (3.10.0-1127.18.2.el7.x86_64) 7 (Core)
↓
saved_entry=CentOS Linux (3.10.0-1127.13.1.el7.x86_64) 7 (Core)

一つ前のバージョン3.10.0-1127.13.1.el7.x86_64 に変更した。

レスキューモードを抜け

><rescue> exit
exit

起動してみる。

virsh start [仮想マシン名]

起動できた!
起動したOSのカーネルバージョンを確認してみる。

# uname -r
3.10.0-1127.13.1.el7.x86_64

ちゃんと指定したカーネルバージョンで起動していることを確認できた。

起動できるようになれば、あとは多数のサイトに案内されている通りの方法で対処できる。
しかし、yum-cron設定して放置しておくのもなかなか危ないと思った体験だった。
(個人の趣味レベルのサーバなので、あまり問題にはならないが)