こちらの記事『 Let's Encrypt のプロトコルを ACME v1 -> ACME v2 に変更しました』 に書いたように、作業ミスにより、
sudo apt upgrade
を実行してしまいました。
システムに大きな変更はしていないので、特に問題もなくパッケージの更新が終わると思いきや、下記画面が表示されて grub の再設定を求められました。
とりあえずは、 grub はどこにもインストールしないとして進むと次に
と menu.lst が変更されてるのでどうするか?と聞かれます。
とりあえず、『現在インストールされているローカルバージョンを保持』を選択して、処理終了後一度再起動したら、問題なく動作しました。
このままだと気持ち悪いので、何が起きていたのか調べてみました。
問題
今回、この問題が発生した環境は EC2 上の Ubuntu 18.04 になります(ami-0eeb679d57500a06c)。
ネットを調べてみると類似の問題が昔からあるようです。いくつかの記事を見ていると、 apt upgrade --yes としても対話プロンプトが出てくるので自動更新できない、といった感じのものが多いようです。
(上記の機械翻訳っぽい記事)
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
これで問題なく更新できるようになるようです。