プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

EC2 の Ubuntu で apt upgrade した場合について

こちらの記事『 Let's Encrypt のプロトコルを ACME v1 -> ACME v2 に変更しました』 に書いたように、作業ミスにより、

sudo apt upgrade

を実行してしまいました。

システムに大きな変更はしていないので、特に問題もなくパッケージの更新が終わると思いきや、下記画面が表示されて grub の再設定を求められました。

f:id:junichim:20200514094929p:plain

とりあえずは、 grub はどこにもインストールしないとして進むと次に

f:id:junichim:20200514095032p:plain

と menu.lst が変更されてるのでどうするか?と聞かれます。

とりあえず、『現在インストールされているローカルバージョンを保持』を選択して、処理終了後一度再起動したら、問題なく動作しました。

このままだと気持ち悪いので、何が起きていたのか調べてみました。

問題

今回、この問題が発生した環境は EC2 上の Ubuntu 18.04 になります(ami-0eeb679d57500a06c)。

ネットを調べてみると類似の問題が昔からあるようです。いくつかの記事を見ていると、 apt upgrade --yes としても対話プロンプトが出てくるので自動更新できない、といった感じのものが多いようです。

amazon ec2 - "A new version of /boot/grub/menu.lst is available" when upgrading Ubuntu on an AWS server - Server Fault

(上記の機械翻訳っぽい記事)

AWSサーバーでUbuntuをアップグレードする場合の「/boot/grub/menu.lstの新しいバージョンが利用可能」

linux - How to avoid GRUB errors after running apt-get upgrade - Ubuntu - Server Fault

どうも、EC2 は起動する際に grub-legacy を使っているのに対して、 grub2 の設定とぶつかっているっぽい印象です。

システム更新後ですが、 grub 関連のパッケージはこんな感じに入っているようです。

ubuntu@ip-xxx-xxx-xxx-xxx:~$ dpkg --list | grep -i grub
ii  grub-common                      2.02-2ubuntu8.15                    amd64        GRand Unified Bootloader (common files)
ii  grub-gfxpayload-lists            0.7                                 amd64        GRUB gfxpayload blacklist
ii  grub-legacy-ec2                  1:1                                 all          Handles update-grub for ec2 instances
ii  grub-pc                          2.02-2ubuntu8.15                    amd64        GRand Unified Bootloader, version 2 (PC/BIOS version)
ii  grub-pc-bin                      2.02-2ubuntu8.15                    amd64        GRand Unified Bootloader, version 2 (PC/BIOS binaries)
ii  grub2-common                     2.02-2ubuntu8.15                    amd64        GRand Unified Bootloader (common files for version 2)
ubuntu@ip-xxx-xxx-xxx-xxx:~$ 

最初の画面のプロンプトをよく見ると『 grub-pc の設定』とあったので、その grub-pc パッケージの詳細を表示させるとこんな感じでした。

ubuntu@ip-xxx-xxx-xxx-xxx:~$ apt show grub-pc
Package: grub-pc
Version: 2.02-2ubuntu8.15
Priority: optional
Section: admin
Source: grub2
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 577 kB
Depends: debconf (>= 0.5) | debconf-2.0, grub-common (= 2.02-2ubuntu8.15), grub2-common (= 2.02-2ubuntu8.15), grub-pc-bin (= 2.02-2ubuntu8.15), ucf, grub-gfxpayload-lists
Conflicts: grub (<< 0.97-54), grub-coreboot, grub-efi-amd64, grub-efi-ia32, grub-ieee1275, grub-legacy, grub-xen
Replaces: grub, grub-common (<= 1.97~beta2-1), grub-coreboot, grub-efi-amd64, grub-efi-ia32, grub-ieee1275, grub-legacy, grub2 (<< 2.02-2ubuntu8.15)
Homepage: http://www.gnu.org/software/grub/
Task: ubuntu-live, kubuntu-live, xubuntu-live, lubuntu-live-share, lubuntu-live, lubuntu-live-qt, lubuntu-live-gtk, ubuntustudio-dvd-live, ubuntukylin-live, ubuntu-mate-live, ubuntu-budgie-live
Supported: 5y
Download-Size: 138 kB
APT-Manual-Installed: no
APT-Sources: http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
Description: GRand Unified Bootloader バージョン 2 (PC/BIOS バージョン)
 GRUB は移植可能で強力なブートローダです。このバージョンの GRUB は前のバー
 ジョンよりもきれいな設計に基づいており、また以下のような新しい特徴を持って います。
 .
  - Scripting in grub.cfg using BASH-like syntax.
  - Support for modern partition maps such as GPT.
  - Modular generation of grub.cfg via update-grub.  Packages providing GRUB
    add-ons can plug in their own script rules and trigger updates by invoking
    update-grub.
  - VESA-based graphical mode with background image support and complete 24-bit
    color set.
  - Support for extended charsets.  Users can write UTF-8 text to their menu
    entries.
 .
 このパッケージには、伝統的な PC/BIOS アーキテクチャで使うために構築された バージョンの GRUB が含まれています。

N: 追加レコードが 1 件あります。表示するには '-a' スイッチを付けてください。
ubuntu@ip-xxx-xxx-xxx-xxx:~$ 

grub2 を扱うためのパッケージのようです。一方 grub-legacy-ec2 パッケージを表示させると

ubuntu@ip-xxx-xxx-xxx-xxx:~$ apt show grub-legacy-ec2
Package: grub-legacy-ec2
Version: 1:1
Priority: extra
Section: admin
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 82.9 kB
Depends: debconf (>= 1.5.19) | cdebconf, ucf, debconf (>= 0.5) | debconf-2.0
Suggests: grub-legacy-doc
Conflicts: grub
Task: cloud-image, server
Supported: 5y
Download-Size: 19.4 kB
APT-Manual-Installed: no
APT-Sources: http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
Description: Handles update-grub for ec2 instances
 EC2 instances that use grub-legacy as a bootloader need a way to keep
 /boot/grub/menu.lst up to date while not conflicting with grub-pc.
 This package provides that.

ubuntu@ip-xxx-xxx-xxx-xxx:~$ 

とあり、EC2 で grub-legacy を使うためのパッケージのようです。

回避策

基本的にサーバーで apt upgrade はやらないのですが、さきほど挙げた記事に回避策が載っているので、念のため実行しておきます。

ubuntu@ip-xxx-xxx-xxx-xxx:~$ sudo apt-get update
ubuntu@ip-xxx-xxx-xxx-xxx:~$ sudo mv /boot/grub/menu.lst /boot/grub/menu.lst.org
ubuntu@ip-xxx-xxx-xxx-xxx:~$ sudo update-grub-legacy-ec2 -y
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... 

Could not find /boot/grub/menu.lst file. 
Generating /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-5.3.0-1017-aws
Found kernel: /boot/vmlinuz-4.15.0-1052-aws
Found kernel: /boot/vmlinuz-4.15.0-1044-aws
Updating /boot/grub/menu.lst ... done

ubuntu@ip-xxx-xxx-xxx-xxx:~$ 
ubuntu@ip-xxx-xxx-xxx-xxx:~$ sudo apt-get dist-upgrade
ubuntu@ip-xxx-xxx-xxx-xxx:~$ sudo apt autoremove --purge
ubuntu@ip-xxx-xxx-xxx-xxx:~$ sudo reboot

これで問題なく更新できるようになるようです。