Ubuntuをアップグレードしたら起動できなくなった時の対処

# 概要

軽い気持ちでUbuntu19.04から19.10にアップグレードした時に、紫の画面から起動が進めなくなってしまいました。
セーフモードで起動すると以下のようなメッセージで起動処理が終わっていて、カーネルの起動でこけていそうでした。

```
Kernel panic - not syncing : VFS
```

# 調査

実際にカーネルが悪いのか確かめるために、カーネルのバージョンを変えて起動してみます。

## カーネルを選択

#### 1. マシンを起動する際にShiftを押し続けて、Grubのメニューを表示させる


#### 2. 2番目の`Advanced options for Ubuntu`を選択する
![IMG_2682.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259782/4a0bfa19-3e66-84e8-248d-2a872c5094e9.jpeg)



#### 3. カーネルを選択

今回は上二つの新しいカーネルが悪さをしていると考えたので、3つ目を選択して起動します。
![IMG_2683.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259782/e7770433-d157-ce6c-eb1d-21260d90ba06.jpeg)

そうすると無事起動することができました。

# 対処
## カーネルのバージョンを固定

このままだとデフォルトのカーネルのバージョンが変わっていないので、カーネルのバージョンを固定します。

#### 1. 選択できるカーネル一覧

```bash

$ grep menuentry /boot/grub/grub.cfg

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-99eddd62-fe37-404b-a276-916c752c04fb' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-99eddd62-fe37-404b-a276-916c752c04fb' {
	menuentry 'Ubuntu, with Linux 5.3.0-29-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-29-generic-advanced-99eddd62-fe37-404b-a276-916c752c04fb' {
	menuentry 'Ubuntu, with Linux 5.3.0-29-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-29-generic-recovery-99eddd62-fe37-404b-a276-916c752c04fb' {
	menuentry 'Ubuntu, with Linux 5.0.0-38-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.0.0-38-generic-advanced-99eddd62-fe37-404b-a276-916c752c04fb' {
	menuentry 'Ubuntu, with Linux 5.0.0-38-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.0.0-38-generic-recovery-99eddd62-fe37-404b-a276-916c752c04fb' {
	menuentry 'Ubuntu, with Linux 5.0.0-37-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.0.0-37-generic-advanced-99eddd62-fe37-404b-a276-916c752c04fb' {
	menuentry 'Ubuntu, with Linux 5.0.0-37-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.0.0-37-generic-recovery-99eddd62-fe37-404b-a276-916c752c04fb' {
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {
```

先ほどのメニューに出ていた6つのカーネルが出力されていることがわかります。

#### 2. カーネルを固定

今回は3つ目の`Ubuntu, with Linux 5.0.0-38-generic`で起動できたので、これに固定します。

```bash

$ sudo vim /etc/default/grub

GRUB_DEFAULT="Ubuntu, with Linux 5.0.0-38-generic"
```

#### 3. 設定ファイルを生成

```
$ sudo update-grub

Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.3.0-29-generic
Found linux image: /boot/vmlinuz-5.0.0-38-generic
Found initrd image: /boot/initrd.img-5.0.0-38-generic
Warning: Please don't use old title `Ubuntu, with Linux 5.0.0-38-generic' for GRUB_DEFAULT, use `Advanced options for Ubuntu>Ubuntu, with Linux 5.0.0-38-generic' (for versions before 2.00) or `gnulinux-advanced-99eddd62-fe37-404b-a276-916c752c04fb>gnulinux-5.0.0-38-generic-advanced-99eddd62-fe37-404b-a276-916c752c04fb' (for 2.00 or later)
Found linux image: /boot/vmlinuz-5.0.0-37-generic
Found initrd image: /boot/initrd.img-5.0.0-37-generic
Adding boot menu entry for EFI firmware configuration
done
```

ここで、`done`で終わっているので、成功していると思いきや、

```
Warning: Please don't use old title `Ubuntu, with Linux 5.0.0-38-generic' for GRUB_DEFAULT, use `Advanced options for Ubuntu>Ubuntu, with Linux 5.0.0-38-generic' (for versions before 2.00) or `gnulinux-advanced-99eddd62-fe37-404b-a276-916c752c04fb>gnulinux-5.0.0-38-generic-advanced-99eddd62-fe37-404b-a276-916c752c04fb' (for 2.00 or later)
```
の部分で、grub2.0以上ではカーネルの設定方法が変わっているよ、というエラーが出ています。この通りに、タイトルで指定するのではなく、オプション名で指定します。

```bash

$ sudo vim /etc/default/grub

GRUB_DEFAULT="gnulinux-advanced-99eddd62-fe37-404b-a276-916c752c04fb>gnulinux-5.0.0-38-generic-advanced-99eddd62-fe37-404b-a276-916c752c04fb"
```

もう一度設定ファイル生成します。

```
$ sudo update-grub

Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.3.0-29-generic
Found linux image: /boot/vmlinuz-5.0.0-38-generic
Found initrd image: /boot/initrd.img-5.0.0-38-generic
Found linux image: /boot/vmlinuz-5.0.0-37-generic
Found initrd image: /boot/initrd.img-5.0.0-37-generic
Adding boot menu entry for EFI firmware configuration
done
```

これで起動時のカーネルのバージョンを固定することができました。

# 参考

https://ytooyama.hatenadiary.jp/entry/2018/06/25/235429